Библиотека Si5351mcu-master для Arduino настроена на минимальный размер и перестройку без шума
Павел Миланес, CO7WT - Куба (pavelmc@gmail.com)
(https://github.com/pavelmc/Si5351mcu/)
Эта библиотека настроена на размер на платформе Arduino, она будет управлять выходами CLK0, CLK1 и CLK2 для Si5351A (версия только с 3 тактами, но вы не сможете использовать три сразу).
Вдохновение
Эта работа основана на предыдущей работе этих великих людей:
Поставь цель и выбери стратегию
- Etherkit/NT7S: основная полнофункциональная библиотека, также с большим кодом (на основе кода ядра Linux)
- Демонстрационный код QRP Labs от Hans Summers: самые маленькие и простые в сети.
- Демонстрационный код DK7IH: первый бесшумный шумовой код в дикой природе.
- Целочисленные подпрограммы Джерри Гаффке для Raduino и Ubitx
В Интернете есть несколько процедур для управления чипом Si5351, у всех них есть несколько различных наборов функций, потому что они используют разные стратегии (разные цели), которые делают их уникальными в некотором роде.
Моя цель заключается в следующем:
Основная цель заключается в использовании в проектах радиоприемников, поэтому эти две упомянутые цели являются золотым правилом.
- Держать код как можно меньше (наименьший объем прошивки)
- Меньше фазы и возможного шума при переключении частоты
Давайте перечислим некоторые из поставленных целей и бонусов:
Небольшой размер прошивки:
Базовый проект для установки только одной тактовой частоты на заданную частоту с изменением мощности и коррекции кварца составляет всего ~ 3,3 кБайт микропрограммы (~ 10% от Arduino Uno)
Те же самые настройки с библиотекой Si5351Arduino (Etherkit) дадут вам больше места для прошивки ~ 10 кБайт или 31% от Arduino Uno.
Встроенные подпрограммы Джерри Гаффке в приемопередатчике ubitx занимают наименьшую площадь в платформе Arduino, которую я видел, но имеют наихудший фазовый шум и наименьший частотный диапазон.
Фазовый шум сведен до минимума:
Мы используем каждую хитрость в техническом описании, примечаниях по применению OEM или в Интернете, чтобы минимизировать фазовый шум. (Даже немногие узнали о процессе)
Например, Etherkit библиотека и Джерри Gaffke встроенные процедуры использует некоторые , но не все трюки , чтобы свести к минимуму фазового шума (Etherkit один дает контроль над всеми функциями, Джерри Gaffke имеет небольшие размеры и в процессе он принести в жертву фазового шума и диапазон частот)
Пререключение без шума:
Если вы играете из книги (Datasheet и Application Notes), вы будете слышать шум, напоминающий щелчок, каждый раз, когда вы меняете выходную частоту.
Это не проблема, если вы намереваетесь использовать только фиксированные частоты на выходе, но если вы планируете развернуть или использовать его в любом приложении, которое перемещает частоту, то шум, похожий на щелчок, будет преследовать вас. (как в радиоприемнике или трансивере)
Я выучил несколько трюков из многих источников в Интернете, и после некоторого локального тестирования я наткнулся на схему, которая делает эту библиотеку практически бесшумной; см. ниже раздел «Без шума при нажатии».
Быстрые изменения частоты:
Это был побочный эффект последнего трюка, чтобы минимизировать шум щелчка, для получения дополнительной информации см. Раздел «Без шума щелчка» ниже.
Резюме: другие подпрограммы записывают все регистры для каждого изменения частоты, я пишу половину из них большую часть времени, ускоряя процесс.
Два из трех
Да, не существует такого понятия, как бесплатный обед, чтобы получить все вышеперечисленные функции, и тем, что следует, я должен пойти на некоторые жертвы, в данном случае лишний выход. Смотрите раздел «Два из трех» ниже.
Особенности
Это до сих пор реализованные функции (любое конкретное желание? Используйте для этого вкладку «Проблемы»):
Как использовать библиотеку
- Передача пользовательского XTAL при инициализации (по умолчанию 27.000 МГц (см. Si.init () )
- Вы можете передать исправление в текстовый файл во время работы (см. Si.correction () )
- У вас есть быстрый способ отключить все выходы микросхемы одновременно. (См. Si.off () )
- Вы можете включить/отключить любой вывод в любое время (см. Si.enable (clk) и Si.disable (clk) )
- По умолчанию все выходы отключены после процедуры Si.init (). Вы должны включить их вручную.
- Вы можете использовать только 2 из 3 выходов в любой момент (см. Раздел «Два из трех» ниже)
- Управление питанием на каждом выходе независимо (см. Si.setPower (clk, level) в заголовке lib)
- Начальная мощность по умолчанию - самый низкий уровень (2 мА) для всех выходов.
- Вам не нужно включать и настраивать библиотеку Wire (I2C), эта библиотека уже сделает это за вас.
- Пределы частоты не жестко запрограммированы в lib, поэтому вы можете настроить свое оборудование на его конкретное ограничение ( обычно вы можете перейти от ~ 3 кГц до ~ 225 МГц, далеко от пределов 8 кГц до 160 МГц из таблицы данных )
- У вас есть способ проверить состояние определенных часов ( Включено / выключено с помощью Si.clkOn [clk] var )
- Начиная с версии 0.5 и выше, мы сэкономили более 1 Кбайт вашего драгоценного места в прошивке благодаря использованию всей целой математики (наихудшая ошибка ниже +/- 1 Гц)
- Разгон, да, вы можете передвинуть пределы вверх до ~ 250 МГц (см. Раздел «РАЗБЛОКИРОВКА» ниже)
- Улучшен алгоритм шума при щелчке, чтобы еще больше снизить шум при щелчке
- Быстрые изменения частоты как часть улучшенного алгоритма шума щелчка (см. Раздел «Без шума щелчка» ниже)
Получить библиотеку, клонировав этот репозиторий git, или получить ее, нажав зеленую кнопку «Загрузить» на странице.
Переместите или извлеките его в каталог вашей библиотеки
Включите библиотеку в свой код:
(... здесь ваш код ...) // присоединяем библиотеку #include "si5351mcu.h" // lib экземмпляр как "Si" Si5351mcu Si; (... здесь ваш код ...)Следуйте этой последовательности в процедуре настройки ():Здесь у вас есть пример кода («Si» - это экземпляр lib):
- Инициализируйте библиотеку с использованием стандартных или дополнительных часов Xtal.
- Применить поправочный коэффициент (при необходимости)
- Установите некоторые частоты на желаемые выходы.
- Включить желаемые выходы
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 МГц, которую можно получить с помощью нашего дешевого чипа.
Некоторые «должны включать» ПРЕДУПРЕЖДЕНИЯ:
Как это сделать?
- Чип не был рассчитан на столь высокий уровень, поэтому используйте его с осторожностью и тестируйте его на своем оборудовании, сдвигая предел разгона с шагом 10 МГц, начиная с 900 МГц, и тестируйте при каждом изменении, пока он не работает; затем опуститесь на 10 МГц, чтобы оказаться в безопасной зоне.
- Перемещение верхнего предела имеет штраф на нижнем уровне, ваша нижняя частота переместится из диапазона ~ 3 кГц в ~ 10 кГц.
- Фазовый шум на выходе, если он наихудший, так как вы используете более высокую частоту, на фиксированных 250 МГц, это заметно, но не так уж плохо для приложений TTL или CMOS.
- Фазовый шум особенно плох, если вы совершаете развертку или перемещаете действие за пределы 180 МГц; фазовый шум от состояния разблокировки до следующей блокировки ФАПЧ очень заметен в анализаторе спектра, даже на дешевом RTL-SDR.
- Я рекомендую использовать выходы свыше 150 МГц только в качестве фиксированного значения и не перемещать их, если вам небезразличен фазовый шум.
Вам нужно объявить макрос со значением разгона ПЕРЕД включением библиотеки, вот так:
(... здесь ваш код ...) // Использование функции разгона для библиотеки Si5351mcu #define SI_OVERCLOCK 1000000000L // 1.0 GHz, значение в Hz // теперь включаем библиотеку #include "si5351mcu.h" // экземпляр lib как "Si" Si5351mcu Si; // теперь вы можете генерировать частоты от ~10 кГц до 250 МГц. (... здесь ваш код ...)Переключение без шумаПо моим тестам шум, похожий на щелчок, исходил из нескольких источников:
Мы беспокоимся о шуме щелчка только при переключении с одной частоты на другую, поэтому, если мы не коснемся элемента управления разрешением выхода или не отключим msynth регистры после активации; тогда мы настроены избегать кликов из этих двух первых источников.
- Затем выключите выходы CLKx (регистр 3. Управление включением выхода)
- Затем выключите Msynths (биты CLKx_PDN для каждого Msynth)
- Сброс PLL (Регистр 177: Сброс PLL)
Последний является сложным, в теории ФАПЧУ не нужен быть сброшен каждый раз , когда вы меняете его выходная частота , как это 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.
- CLK0 и CLK1
- CLK0 и CLK2
Скачать библиотеку - Si5351mcu-master.zip (30,9 Kб)
Простой пример установки частоты синтезатора: => si5351_simple.ino
Пример сканирования частоты: => si5351_2.ino