Библиотека Si5351mcu-master для Arduino настроена на минимальный размер и перестройку без шума


Павел Миланес, CO7WT - Куба (pavelmc@gmail.com)
(https://github.com/pavelmc/Si5351mcu/)

Si5351

Эта библиотека настроена на размер на платформе Arduino, она будет управлять выходами CLK0, CLK1 и CLK2 для Si5351A (версия только с 3 тактами, но вы не сможете использовать три сразу).

Вдохновение

Эта работа основана на предыдущей работе этих великих людей:

Поставь цель и выбери стратегию

В Интернете есть несколько процедур для управления чипом Si5351, у всех них есть несколько различных наборов функций, потому что они используют разные стратегии (разные цели), которые делают их уникальными в некотором роде.

Моя цель заключается в следующем:

Основная цель заключается в использовании в проектах радиоприемников, поэтому эти две упомянутые цели являются золотым правилом.

Давайте перечислим некоторые из поставленных целей и бонусов:

Небольшой размер прошивки:

Базовый проект для установки только одной тактовой частоты на заданную частоту с изменением мощности и коррекции кварца составляет всего ~ 3,3 кБайт микропрограммы (~ 10% от Arduino Uno)

Те же самые настройки с библиотекой Si5351Arduino (Etherkit) дадут вам больше места для прошивки ~ 10 кБайт или 31% от Arduino Uno.

Встроенные подпрограммы Джерри Гаффке в приемопередатчике ubitx занимают наименьшую площадь в платформе Arduino, которую я видел, но имеют наихудший фазовый шум и наименьший частотный диапазон.

Фазовый шум сведен до минимума:

Мы используем каждую хитрость в техническом описании, примечаниях по применению OEM или в Интернете, чтобы минимизировать фазовый шум. (Даже немногие узнали о процессе)

Например, Etherkit библиотека и Джерри Gaffke встроенные процедуры использует некоторые , но не все трюки , чтобы свести к минимуму фазового шума (Etherkit один дает контроль над всеми функциями, Джерри Gaffke имеет небольшие размеры и в процессе он принести в жертву фазового шума и диапазон частот)

Пререключение без шума:

Если вы играете из книги (Datasheet и Application Notes), вы будете слышать шум, напоминающий щелчок, каждый раз, когда вы меняете выходную частоту.

Это не проблема, если вы намереваетесь использовать только фиксированные частоты на выходе, но если вы планируете развернуть или использовать его в любом приложении, которое перемещает частоту, то шум, похожий на щелчок, будет преследовать вас. (как в радиоприемнике или трансивере)

Я выучил несколько трюков из многих источников в Интернете, и после некоторого локального тестирования я наткнулся на схему, которая делает эту библиотеку практически бесшумной; см. ниже раздел «Без шума при нажатии».

Быстрые изменения частоты:

Это был побочный эффект последнего трюка, чтобы минимизировать шум щелчка, для получения дополнительной информации см. Раздел «Без шума щелчка» ниже.

Резюме: другие подпрограммы записывают все регистры для каждого изменения частоты, я пишу половину из них большую часть времени, ускоряя процесс.

Два из трех

Да, не существует такого понятия, как бесплатный обед, чтобы получить все вышеперечисленные функции, и тем, что следует, я должен пойти на некоторые жертвы, в данном случае лишний выход. Смотрите раздел «Два из трех» ниже.

Особенности

Это до сих пор реализованные функции (любое конкретное желание? Используйте для этого вкладку «Проблемы»):

Схема включения

Как использовать библиотеку

Получить библиотеку, клонировав этот репозиторий git, или получить ее, нажав зеленую кнопку «Загрузить» на странице.

Переместите или извлеките его в каталог вашей библиотеки

Включите библиотеку в свой код:

(... здесь ваш код ...)

// присоединяем библиотеку
#include "si5351mcu.h"

// lib экземмпляр как "Si"
Si5351mcu Si;

(... здесь ваш код ...)
Следуйте этой последовательности в процедуре настройки (): Здесь у вас есть пример кода («Si» - это экземпляр lib):

setup() {
    (... здесь ваш код ...)

    //////////////////////////////////
    //        Si5351 functions       /
    //////////////////////////////////

    // инициируем библиотеку, в данном случае с установленным по умолчанию кварцем 27.000 МГц
    Si.init();

    // процедура инициализации для кварца не по умолчанию 25.000 МГц
    //Si.init(25000000L);

    // Необязательно, применяем предварительно рассчитанный поправочный коэффициент для кварца
    Si.correction(-150);    //частота кварца ниже на 150 Hz

    // Включить желаемые выходы с некоторыми частотами
    Si.setFreq(0, 25000000);       // CLK0 выход 25.000 MHz
    Si.setFreq(1, 145000000);      // CLK1 выход 145.000 MHz

    // включить выходы
    Si.enable(0);
    Si.enable(1);

    (...здесь ваш код...)
}

Если вам нужно применить/изменить поправочный коэффициент после процесса установки, вы получите шум переключения на следующем setFreq (), чтобы применить изменения.

Используйте его, вы можете включить, отключить, изменить мощность или частоту, посмотрите этот фрагмент кода с некоторыми примерами:


loop() {
    (... здесь ваш код ...)

    // отключаем clk1
    Si.disable(1);

    // изменить мощность clk0 на 4 мА
    Si.setPower(0, SIOUT_4mA);

    // применить поправочный коэффициент 300 Гц (исправление будет применено при следующем вызове Si.setFreq ())
    Si.correction(300);

    // изменить выходную частоту clk0
    Si.setFreq(0, 7110000);

    // выключить мощность всех выходов
    Si.off();

    (...здесь ещё ваш код ...)
}

Разгон частоты

Да, вы можете разогнать Si5351, в техническом описании указано, что VCO перемещается от 600 до 900 МГц, и это дает нам полезный диапазон от ~ 3 кГц до 225 МГц.

Но что, если мы можем переместить частоту VCO к более высоким значениям?

Функция разгона делает именно это, используйте более высокий верхний предел для VCO в расчетах. В моем тесте с двумя партиями Si5351A я могу без проблем безопасно работать на частотах до 1000 ГГц; в одной партии ФАПЧ разблокируется в диапазоне 1,1 ГГц, а в другой - около 1,050 ГГц; поэтому я рекомендую не выходить за пределы 1.000 ГГц.

При максимальной VCO 1000 ГГц и более низком коэффициенте деления 4 мы поднялись с максимальной частоты 255 МГц до 250 МГц, которую можно получить с помощью нашего дешевого чипа.

Некоторые «должны включать» ПРЕДУПРЕЖДЕНИЯ:

Как это сделать?

Вам нужно объявить макрос со значением разгона ПЕРЕД включением библиотеки, вот так:


(... здесь ваш код ...)

// Использование функции разгона для библиотеки Si5351mcu
#define SI_OVERCLOCK 1000000000L      // 1.0 GHz, значение в Hz

// теперь включаем библиотеку
#include "si5351mcu.h"

// экземпляр lib как "Si"
Si5351mcu Si;

// теперь вы можете генерировать частоты от ~10 кГц до 250 МГц.

(... здесь ваш код ...)

Переключение без шума

По моим тестам шум, похожий на щелчок, исходил из нескольких источников:

Мы беспокоимся о шуме щелчка только при переключении с одной частоты на другую, поэтому, если мы не коснемся элемента управления разрешением выхода или не отключим msynth регистры после активации; тогда мы настроены избегать кликов из этих двух первых источников.

Последний является сложным, в теории ФАПЧУ не нужен быть сброшен каждый раз , когда вы меняете его выходная частота , как это P Hase L ocked L полокоть и это само исправление алгоритма / аппаратное обеспечение.

Эта последняя идея была проверена на простой схеме: что, если я установлю фиксированный выходной делитель Msynth и переместу VCO для всего диапазона, не сбрасывая его в любой точке?

Если требуется «сброс PLL», у меня в какой-то момент будет странное поведение, верно?

Но практика подтвердила мою идею: я могу установить выходной сигнал Msynth равным 6 и переместить VCO (PLL) для всего диапазона (от 600 до 900 МГц) и получить непрерывный и стабильный выходной сигнал от 100 до 150 МГц.

Тогда что такое «сброс ФАПЧ» (регистр 177) на практике?

Некоторый дальнейший тест показал, что эта функция «сброса» применяется не к PLL Msynth, а к выходному Msynth, и не в каждом случае, да, у него плохое имя или плохое объясненное имя.

После некоторого теста я обнаружил, что вам нужен трюк «Сброс PLL» (Регистр 177) только в некоторых случаях, когда вы изменяете значение выходного делителя Msynth.

Реализовать это в коде было легко, массив для отслеживания фактического выходного делителя Msynth и только записи его в микросхему и сброса "PLL", когда это необходимо.

Привет! это приводит к сокращению времени I2C вдвое (большую часть времени) как побочный эффект!

Большую часть времени, когда вы выполняете развертку, выходной делитель Msynth имеет постоянное значение, и вы перемещаете только VCO (PLL). Затем я записал всего 8 байтов на шину I2C (для управления VCO / PLL) вместо 16 (8). для VCO / PLL и еще 8 для выходного делителя Msynth) или 17 (16 + байт сброса) большую часть времени, сокращая время между записью до половины, изменяя частоту в 2 раза быстрее, чем раньше.

Два из трех

Да, здесь есть одна хитрость с CLK1 и CLK2: оба разделяют PLL_B, и, поскольку мы используем наш собственный алгоритм для расчета частот и минимизации фазового шума, вы можете использовать только один из них за раз.

Примечание. На практике вы можете, но другой будет двигаться с заданной вами частоты, что является неожиданным поведением, поэтому я сделал их взаимоисключающими (CLK1 и CLK2).

Это допустимые комбинации для вывода независимых сигналов.

(!) Вы не можете использовать CLK1 и CLK2 одновременно , как только вы установите один из них, другой отключится. Вот почему вы получаете два из трех, и один из них должен быть всегда CLK0.

Скачать библиотеку - Si5351mcu-master.zip (30,9 Kб)

Простой пример установки частоты синтезатора: => si5351_simple.ino

Пример сканирования частоты: => si5351_2.ino