Библиотека si5351 для arduino

Etherkit Si5351

A full-featured library for the Si5351 series of clock generator ICs from Silicon Labs

Author Jason Milldrum Website https://github.com/etherkit/Si5351Arduino Category Device Control License GPL 3.0 Library Type Contributed Architectures Any

This library will allow you to control nearly all features of the Si5351, without depending on the proprietary ClockBuilder software from Silicon Labs.

Downloads

Filename Release Date File Size
Etherkit_Si5351-2.1.4.zip 2019-05-20 50.24 KiB
Etherkit_Si5351-2.1.3.zip 2019-03-07 50.22 KiB
Etherkit_Si5351-2.1.2.zip 2018-03-30 50.21 KiB
Etherkit_Si5351-2.1.1.zip 2018-01-15 50.19 KiB
Etherkit_Si5351-2.1.0.zip 2017-10-03 49.81 KiB
Etherkit_Si5351-2.0.6.zip 2017-07-10 48.92 KiB
Etherkit_Si5351-2.0.5.zip 2017-06-17 48.86 KiB
Etherkit_Si5351-2.0.4.zip 2017-04-19 48.79 KiB
Etherkit_Si5351-2.0.3.zip 2017-03-24 48.77 KiB
Etherkit_Si5351-2.0.2.zip 2017-03-17 48.73 KiB
Etherkit_Si5351-2.0.1.zip 2016-12-15 48.70 KiB
Etherkit_Si5351-2.0.0.zip 2016-12-02 48.61 KiB
Etherkit_Si5351-1.1.2.zip 2016-03-20 37.10 KiB
Etherkit_Si5351-1.1.1.zip 2016-03-01 36.97 KiB
Etherkit_Si5351-1.1.0.zip 2016-02-28 36.66 KiB
Etherkit_Si5351-1.0.0.zip 2015-11-08 36.07 KiB

This website is Open Source, please help improve it by submitting a change on GitHub:
https://github.com/njh/arduino-libraries

The content on this site was last updated: 2022-10-06 23:43:06 +0100

Источник

Библиотека si5351 для arduino

Эта библиотека настроена на размер на платформе 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, поэтому вы можете настроить свое оборудование на его конкретное ограничение ( обычно вы можете перейти от

225 МГц, далеко от пределов 8 кГц до 160 МГц из таблицы данных )

  • У вас есть способ проверить состояние определенных часов ( Включено / выключено с помощью Si.clkOn [clk] var )
  • Начиная с версии 0.5 и выше, мы сэкономили более 1 Кбайт вашего драгоценного места в прошивке благодаря использованию всей целой математики (наихудшая ошибка ниже +/- 1 Гц)
  • Разгон, да, вы можете передвинуть пределы вверх до

    250 МГц (см. Раздел «РАЗБЛОКИРОВКА» ниже)

  • Улучшен алгоритм шума при щелчке, чтобы еще больше снизить шум при щелчке
  • Быстрые изменения частоты как часть улучшенного алгоритма шума щелчка (см. Раздел «Без шума щелчка» ниже)
  • Как использовать библиотеку

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

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

    Включите библиотеку в свой код: Следуйте этой последовательности в процедуре настройки ():

    • Инициализируйте библиотеку с использованием стандартных или дополнительных часов Xtal.
    • Применить поправочный коэффициент (при необходимости)
    • Установите некоторые частоты на желаемые выходы.
    • Включить желаемые выходы

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

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

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

    3 кГц до 225 МГц.

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

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

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

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

    • Чип не был рассчитан на столь высокий уровень, поэтому используйте его с осторожностью и тестируйте его на своем оборудовании, сдвигая предел разгона с шагом 10 МГц, начиная с 900 МГц, и тестируйте при каждом изменении, пока он не работает; затем опуститесь на 10 МГц, чтобы оказаться в безопасной зоне.
    • Перемещение верхнего предела имеет штраф на нижнем уровне, ваша нижняя частота переместится из диапазона

    10 кГц.

  • Фазовый шум на выходе, если он наихудший, так как вы используете более высокую частоту, на фиксированных 250 МГц, это заметно, но не так уж плохо для приложений TTL или CMOS.
  • Фазовый шум особенно плох, если вы совершаете развертку или перемещаете действие за пределы 180 МГц; фазовый шум от состояния разблокировки до следующей блокировки ФАПЧ очень заметен в анализаторе спектра, даже на дешевом RTL-SDR.
  • Я рекомендую использовать выходы свыше 150 МГц только в качестве фиксированного значения и не перемещать их, если вам небезразличен фазовый шум.
  • Как это сделать?

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

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

    • Затем выключите выходы CLKx (регистр 3. Управление включением выхода)
    • Затем выключите Msynths (биты CLKx_PDN для каждого Msynth)
    • Сброс PLL (Регистр 177: Сброс PLL)

    Мы беспокоимся о шуме щелчка только при переключении с одной частоты на другую, поэтому, если мы не коснемся элемента управления разрешением выхода или не отключим 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).

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

    • CLK0 и CLK1
    • CLK0 и CLK2

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

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

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

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

    Источник

    hamdevelelopers/Si5351Arduino_due

    Use Git or checkout with SVN using the web URL.

    Work fast with our official CLI. Learn more.

    Launching GitHub Desktop

    If nothing happens, download GitHub Desktop and try again.

    Launching GitHub Desktop

    If nothing happens, download GitHub Desktop and try again.

    Launching Xcode

    If nothing happens, download Xcode and try again.

    Launching Visual Studio Code

    Your codespace will open once ready.

    There was a problem preparing your codespace, please try again.

    This branch is 6 commits ahead of etherkit:master.

    Open a pull request to contribute your changes upstream.

    Latest commit

    Git stats

    Files

    Failed to load latest commit information.

    README.md

    THIS LIBRARY IS OLD AND UNSUPPORTED. THE CURRENT Si5351 LIBRARY SUPPORTS CORTEX SERIES ARM PROCESSORS.

    Si5351 library changed to be used on the Arduino DUE and other CORTEX series ARM processors. No internal saving of reference coeffecients, this must be set before the frequency is set in the program.

    Si5351 Library for Arduino

    This is a basic library for the Si5351 series of clock generator ICs from Silicon Labs for the Arduino development environment. It will allow you to control the Si5351 with an Arduino, and without depending on the proprietary ClockBuilder software from Silicon Labs.

    This library is focused towards usage in RF/amateur radio applications, but it may be useful in other cases. However, keep in mind that coding decisions are and will be made with those applications in mind first, so if you need something a bit different, please do fork this repository. Also, since the Si5351A3 version is the one which seems most useful in amateur radio applications, this is where the current development will be focused. Once the Si5351A3 has a decent and mature feature set, hopefully we will be able to turn to the 8-output version, and perhaps even the B and C variants.

    The library is currently in a minimalistic and bit of an untested state. Many of the features are not yet implemented. Unimplemented features will added according to usefulness in RF/amateur radio applications, as stated above. Please feel free to use the issues feature of GitHub if you run into problems or have suggestions for important features to implement.

    Hardware Requirements and Setup

    This library has been written for the Arduino platform and has been successfully tested on the Arduino Uno and an Uno clone. There should be no reason that it would not work on any other Arduino hardware with I2C support.

    The Si5351 is a +3.3 V only part, so if you are not using a +3.3 V microcontroller, be sure you have some kind of level conversion strategy.

    Wire the SDA and SCL pins of the Si5351 to the corresponding pins on the Arduino. Use the pin assignments posted on the Arduino Wire library page. Since the I2C interface is set to 100 kHz, use 1 to 10 kΩ pullup resistors from +3.3 V to the SDA and SCL lines.

    Connect a 25 MHz or 27 MHz crystal with a load capacitance of 6, 8, or 10 pF to the Si5351 XA and XB pins. Locate the crystal as close to the Si5351 as possible and keep the traces as short as possible. Please use a SMT crystal. A crystal with leads will have too much stray capacitance.

    Include the Si5351Arduino library into your instance of the Arduino IDE. Download a ZIP file of the library from the GitHub repository by using the «Download ZIP» button at the right of the main repository page. Extract the ZIP file, then rename the unzipped folder as «Si5351». Finally, open the Arduino IDE, select menu Sketch > Import Library. > Add Library. and select the renamed folder that you just downloaded. Restart the IDE and you should have access to the new library.

    (Yes, the Arduino IDE can import a ZIP file, but it doesn’t like filenames with characters such as dashes, as GitHub does when it appends the branch name with a dash. Perhaps there’s an elegant way around this, we’ll see.)

    There is a simple example that is placed in your examples menu under Si5351Arduino. Open this to see how to initialize the Si5351 and set a couple of the outputs to different frequencies. The commentary below will analyze the sample sketch.

    Before you do anything with the Si5351, you will need to include the «si5351.h» and «Wire.h» header files and instantiate the Si5351 class.

    Now in the Setup() function, let’s initialize communications with the Si5351, specify the load capacitance of the reference crystal, and to use the default reference oscillator frequency of 25 MHz:

    Next, let’s set the CLK0 output to 14 MHz and use a fixed PLL reference frequency (this allows for glitch-free tuning):

    Frequencies are indicated in units of 0.01 Hz. Therefore, if you prefer to work in 1 Hz increments in your own code, simply multiply each frequency passed to the library by 100ULL (better yet, use the define called SI5351_FREQ_MULT in the header file for this multiplication). The second value passed in the above method is the desired driving PLL frequency. Entering a 0 will have the method choose a PLL frequency for you. If you would like to use a fixed PLL frequency to drive a multisynth (in order to ensure glitch-free tuning), set the desired PLL frequency first using the method below, then specify that frequency in the set_freq() method. The PLL frequency only needs to be set once. Any additional frequency changes only need to use the set_freq() method as long as you are using the same PLL frequency as before.

    Now let’s set the CLK1 output to 20 MHz output, and let the Si5351 class pick a PLL frequency:

    In the main Loop(), we use the Serial port to monitor the status of the Si5351, using a method to update a public struct which holds the status bits:

    If we like we can adjust the output drive power:

    Individual outputs can be turned on and off. In the second argument, use a 0 to disable and 1 to enable:

    Also, there will be some inherent error in the reference crystal’s actual frequency, so we can measure the difference between the actual and nominal output frequency in Hz, multiply by 10, make it an integer, and enter this correction factor into the library. With an accurate measurement at one frequency, this calibration should be good across the entire tuning range:

    This value is not saved, and must, if changed be externaly saved and read before the frequency output is set.

    One thing to note: the library is set for a 25 MHz reference crystal. If you are using a 27 MHz crystal, please change the SI5351_XTAL_FREQ define in si5351.h.

    • Two multisynths cannot share a PLL with when both outputs are = 112.5 MHz. The library will refuse to set another multisynth to a frequency in that range if another multisynth sharing the same PLL is already within that frequency range.

    Here are the defines, structs, and enumerations you will find handy to use with the library.

    Источник

    Adblock
    detector