Уважаемые посетители! Форум CQHAM.RU существует исключительно за счет показа рекламы. Мы будем благодарны, если Вы не будете блокировать рекламу на нашем Форуме. Просим внести cqham.ru в список исключений для Вашего блокировщика рекламы.
Страница 37 из 77 ПерваяПервая ... 273435363738394047 ... ПоследняяПоследняя
Показано с 361 по 370 из 769

Тема: Синтезатор Si5351A, никто не пробовал?

  1. #361

    Регистрация
    23.07.2010
    Адрес
    ЕАО с.Белгородское
    Сообщений
    1,975
    Записей в дневнике
    2
    Позывной
    UD0DAB exUD0CAJ
    Решил попробовать освоить этого клопа, все хвалят. Не очень еще разобрался...

    Товарищи, ткните носом если есть в природе популярное объяснение - как просто и красиво работать с SI5351 что бы я частоту задал, и само там просчиталось и делители и PLL частоты... И что бы фазовый сдвиг умела. Может калькулятор какой есть или формулка? А то ПЛЛ ставишь одно, так некоторые частоты плывут, а некоторые чисто и красиво да и еще и квадратурно сдвинутые получаются...

    Заказанный сишки с кетаю оказались рабочие. Всего две из десятка были дохлые. Третью запаял - опа I2C сканером нашлась! Прошил пример с https://github.com/etherkit/Si5351Arduino - работает! Но как и написал, если PLL кратно частоте выходной - сигнал чистый. Если не кратный - шум и пляска фазы на осцилле. Как по уму сделать?

    // We will output 14.1 MHz on CLK0 and CLK1.
    // A PLLA frequency of 705 MHz was chosen to give an even
    // divisor by 14.1 MHz.
    unsigned long long freq = 1410000000ULL;
    unsigned long long pll_freq = 70500000000ULL;

    // Set CLK0 and CLK1 to output 14.1 MHz with a fixed PLL frequency
    si5351.set_freq_manu al(freq, pll_freq, SI5351_CLK0);
    si5351.set_freq_manu al(freq, pll_freq, SI5351_CLK1);

    // Now we can set CLK1 to have a 90 deg phase shift by entering
    // 50 in the CLK1 phase register, since the ratio of the PLL to
    // the clock frequency is 50.
    si5351.set_phase(SI5 351_CLK0, 0);
    si5351.set_phase(SI5 351_CLK1, 50);

    // We need to reset the PLL before they will be in phase alignment
    si5351.pll_reset(SI5 351_PLLA);

    Нашел немножко понятно стало... И сложно. Получается там Петлевой умножитель и потом делитель. И выбирая правильные коэффициенты можно добиться минимальной ошибки на выходе. И тему нашел по сишке, немного там тоже описано...

    Как бы теперь переварить все это что бы получить шаг перестройки в 1КГц


  2. #362

    Регистрация
    23.07.2010
    Адрес
    ЕАО с.Белгородское
    Сообщений
    1,975
    Записей в дневнике
    2
    Позывной
    UD0DAB exUD0CAJ
    Покрутил еще.. Интересное дело получается. Если выбираю PLL от 600 до 750 МГц - то все работает как часики! На выходе чистый тон, сдвиг фаз по выходам в порядке (задаю 90 град). Если ставлю частоту PLL выше - на выходе частота срывается каждые десяток микросекунд! Может это партия у меня такая, что на высоких частотах PLL петля не захватывается? Отбраковка наверное... Ну и ладно, мне много не надо

  3. #363

    Регистрация
    10.11.2016
    Адрес
    Харьков
    Сообщений
    4,420
    Цитата Сообщение от UD0CAJ Посмотреть сообщение
    Товарищи, ткните носом если есть в природе популярное объяснение - как просто и красиво работать с SI5351 что бы я частоту задал, и само там просчиталось и делители и PLL частоты...
    такого простого способа нет.
    Частота определяется тремя параметрами PLL и тремя параметрами мультисинта.
    Параметры PLL задают насколько умножать частоту опорного генератора.
    Параметры мультисинта задают насколько нужно делить частоту PLL.

    Множитель PLL вычисляется как multiplier = a + b / c
    где a,b,c - параметры PLL.

    Делитель мультисина вычисляется как divider = a + b / c
    где a,b,c - параметры мультисинта (не путать с a,b,c для PLL. Это разные параметры)

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

    Количество PLL и количество мультиснтов зависит от модели сишки. Источником для мультисинта можно выбирать нужный PLL.

    По сути задание частоты состоит в том, чтобы выбрать множитель и делитель для опорной частоты. Причём так, чтобы множитель и делитель можно было задать в виде a + b / c, где a,b,с - целочисленные значения.

    output_frequency = xtal_frequency * multiplier / divider


    После установки параметров PLL нужно делать сброс PLL. Сброс PLL приводит к отключению сигнала на несколько микросекунд. Для некоторых изменений можно его не делать, вопрос когда можно не делать сброс PLL из документации не совсем ясен.
    Вот собственно и весь секрет.


    Цитата Сообщение от UD0CAJ Посмотреть сообщение
    И что бы фазовый сдвиг умела.
    фазовый сдвиг задаётся регистром фазы, для получения сдвига на 90 градусов в этот регистр нужно занести значение частоты PLL деленное на значение частоты мультисинта (по сути - это значение делителя мультисинта). Зная граничные частоты PLL несложно подсчитать что есть нижний предел частоты, для которой возможно задать квадратурный сдвиг фазы.
    Можно также инвертировать выходной сигнал битом в управляющем регистре, что равнозначно дополнительному сдвигу фазы на 180 градусов.

    После установки сдвига фазы нужно делать сброс PLL.
    Последний раз редактировалось alex_m; 29.08.2018 в 11:44.

  4. Спасибо от veso74

  5. #364
    Аватар для Genadi Zawidowski
    Регистрация
    22.07.2004
    Адрес
    Санкт-Петербург
    Сообщений
    11,100
    Записей в дневнике
    20
    Позывной
    UA1ARN
    Один из способов, который я у себя применяю - по требуемой частоте из заготовленной таблице параметры получаются.
    например, двоичным поиском по вот этой таблице:
    Код:
    struct FREQ {
      uint8_t plldiv;	// должно быть чётное число Valid Multisynth divider ratios are 4, 6, 8,
      uint8_t outdiv;	// Rx Output Divider code (SI5351a_R_DIV_1..SI5351a_R_DIV_128)
      uint16_t divider;	// общий делитель
      uint32_t fmin;
      uint32_t fmax;
    };
    
    static const FLASHMEM struct FREQ freqs [] = {
      { 4, SI5351a_R_DIV_1,		1,		100000000,  200000000 },
      { 4, SI5351a_R_DIV_2,		2,		50000000,  100000000 },	
      { 4, SI5351a_R_DIV_4,		4,		25000000,  50000000 },
      { 4, SI5351a_R_DIV_8,		8,		12500000,  25000000 },
      { 4, SI5351a_R_DIV_16,	16,		6250000,  12500000 },
      { 4, SI5351a_R_DIV_32,	32,		3125000,  6250000 },
      { 4, SI5351a_R_DIV_64,	64,		1562500,  3125000 },
      { 4, SI5351a_R_DIV_128,	128,	2500,  1562500 },	// multysync out: 320 kHz and above
    };
    ... Я там глубину сам промерял!

  6. #365
    Цитата Сообщение от UD0CAJ Посмотреть сообщение
    Может калькулятор какой есть или формулка
    Зайдите на сайт Silab и найдите документ AN619.pdf. Лучше чем там описано, вряд ли найдете. Ну разве что перевод документа, если он есть в природе. Есть также калькулятор от Silab. там можно посчитать все коэффициенты. Это удобно, если например Вам нужен опорник на одну частоту. Калькулятор найдете там же, называется ClockBuilder-Pro. Кроме того, есть еще документ, где описаны все регистры, куда и что загонять. Если не найдете, сброшу на почту.

  7. #366

    Регистрация
    10.11.2016
    Адрес
    Харьков
    Сообщений
    4,420
    вот документация по настройке регистров.
    Всё сводится к нахождению множителя и делителя для частоты кварца.

    output_frequency = xtal_frequency * multiplier / divider

    Добавлено через 20 минут(ы):

    когда множитель и делитель в форме a + b / c найдены, их параметры можно записать в сишку, я для этого написал вот такие функции.

    Запись параметров PLL:
    Код:
    struct si5351_pll_info
    {
        uint32_t a;
        uint32_t b;
        uint32_t c;
    };
    
    
    void si5351_set_pll(enum si5351_pll pll, struct si5351_pll_info* pi)
    {
        uint32_t p1;
        uint32_t p2;
        uint32_t p3;
    
    
        ASSERT( pi->a >= 15 && pi->a <= 90 );   // mult = 15..90
        ASSERT( pi->b <= 0xFFFFF );             // 20-bit limit
        ASSERT( pi->c <= 0xFFFFF );             // 20-bit limit
        ASSERT( pi->c > 0 );                    // avoid divide by zero
    
    
        // p1[17:0] = 128 * a + floor( 128 * b / c ) - 512
        // p2[19:0] = 128 * b - c * floor( 128 * b / c)
        // p3[19:0] = c
        if (pi->b == 0)
        {
            p1 = 128 * pi->a - 512;
            p2 = 0;
            p3 = pi->c;
        }
        else
        {
            uint32_t frac = (128 * pi->b) / pi->c;
            p1 = 128 * pi->a + frac - 512;
            p2 = 128 * pi->b - pi->c * frac;
            p3 = pi->c;
        }
        si5351_write_pll(pll, p1, p2, p3);
    }
    
    void si5351_write_pll(enum si5351_pll pll, uint32_t p1, uint32_t p2, uint32_t p3)
    {
        uint8_t params[8] =
        {
            (p3 & 0x0000FF00) >> 8,
            (p3 & 0x000000FF),
            (p1 & 0x00030000) >> 16,
            (p1 & 0x0000FF00) >> 8,
            (p1 & 0x000000FF),
            ((p3 & 0x000F0000) >> 12) | ((p2 & 0x000F0000) >> 16),
            (p2 & 0x0000FF00) >> 8,
            (p2 & 0x000000FF),
        };
        switch (pll)
        {
            case SI5351_PLLA: 
                si5351_write_bulk(SI5351_PLLA_PARAMETERS, params, 8);
                break;
            case SI5351_PLLB: 
                si5351_write_bulk(SI5351_PLLB_PARAMETERS, params, 8);
                break;
        }
    
    
    }
    Запись параметров мультисинта:
    Код:
    struct si5351_msx_info
    {
        uint32_t a;
        uint32_t b;
        uint32_t c;
        uint8_t rdiv;
        bool divby4;
    };
    
    
    
    void si5351_set_msx(enum si5351_clock output, struct si5351_msx_info* mi)
    {
        uint32_t p1;
        uint32_t p2;
        uint32_t p3;
    
    
        ASSERT( mi->a >= 4 );           // min 4
        ASSERT( mi->a <= 1800 );        // max 900
        ASSERT( mi->b <= 0xFFFFF );     // 20-bit limit
        ASSERT( mi->c <= 0xFFFFF );     // 20-bit limit
        ASSERT( mi->c > 0 );            // avoid divide by zero
        ASSERT( (mi->a + mi->b / mi->c) >= 6 && (mi->a + mi->b / mi->c) <= 1800 );
        
        // P1[17:0] = 128 * a + floor( 128 * b / c ) - 512
        // P2[19:0] = 128 * b - c * floor( 128 * b / c )
        // P3[19:0] = c
        if (mi->b == 0)
        {
            p1 = 128 * mi->a - 512;
            p2 = 0;
            p3 = mi->c;
        }
        else
        {
            uint32_t frac = (128 * mi->b) / mi->c;
            p1 = 128 * mi->a + frac - 512;
            p2 = 128 * mi->b - mi->c * frac;
            p3 = mi->c;
        }
        si5351_write_msx(output, p1, p2, p3, mi->rdiv, mi->divby4);
    }
    
    void si5351_write_msx(enum si5351_clock output, uint32_t p1, uint32_t p2, uint32_t p3, uint8_t rdiv, bool divby4)
    {
        uint8_t params[8] =
        {
            (p3 & 0x0000FF00) >> 8,
            (p3 & 0x000000FF),
            ((p1 & 0x00030000) >> 16) | ((rdiv & 7) << 4) | (divby4 ? 0x0C : 0x00),
            (p1 & 0x0000FF00) >> 8,
            (p1 & 0x000000FF),
            ((p3 & 0x000F0000) >> 12) | ((p2 & 0x000F0000) >> 16),
            (p2 & 0x0000FF00) >> 8,
            (p2 & 0x000000FF),
        };
        switch (output)
        {
            case SI5351_CLK0: 
                si5351_write_bulk(SI5351_CLK0_PARAMETERS, params, 8);
                break;
            case SI5351_CLK1: 
                si5351_write_bulk(SI5351_CLK1_PARAMETERS, params, 8);
                break;
            case SI5351_CLK2: 
                si5351_write_bulk(SI5351_CLK2_PARAMETERS, params, 8);
                break;
        }
    }
    Не забываем, что после изменения частоты PLL нужно делать сброс PLL.




    Вложения Вложения
    • Тип файла: pdf AN619.pdf (1.83 Мб, Просмотров: 268)
    Последний раз редактировалось alex_m; 29.08.2018 в 14:08.

  8. #367
    Цитата Сообщение от alex_m Посмотреть сообщение
    После установки параметров PLL нужно делать сброс PLL. Сброс PLL приводит к отключению сигнала на несколько микросекунд. Для некоторых изменений можно его не делать, вопрос когда можно не делать сброс PLL из документации не совсем ясен.
    Вот собственно и весь секрет.
    Reset PLL регистр $B1 я лично делаю только если нужен сдвиг фазы между двумя выходами. То есть когда изменяется значение регистров $A5 и $A6. Если сдвиг фазы не нужен то не замечал ни каких проблем если не делать сброс.

    Параметры рассчитываю исходя из частота гуна 900МГц / на выходную частоту. Потом проверка на чётность и если активирован фазовый сдвиг между двумя выходами то ограничение деления до 126. То есть дпкд не может быть более 126. Далее частота гуна в герцах считается кд * выходная частота и т.д. всё остальное.
    Если выходная частота равна 1500 килогерц то гун соответственно будет 189МГц.

  9. #368

    Регистрация
    10.11.2016
    Адрес
    Харьков
    Сообщений
    4,420
    Цитата Сообщение от ur3ilf Посмотреть сообщение
    Reset PLL регистр $B1 я лично делаю только если нужен сдвиг фазы между двумя выходами. То есть когда изменяется значение регистров $A5 и $A6. Если сдвиг фазы не нужен то не замечал ни каких проблем если не делать сброс.
    без сброса PLL часто старая частота на выходе остаётся. Пытался широкополосный sweep сделать, но без сброса PLL получается менять частоту только в определённых пределах. И без сброса PLL на некоторых изменениях получаются рандомные глитчи, их видно на осциллографе при свипе.
    Думаю что без сброса, PLL может заглючить на новой частоте, чтобы этого избежать и ввели сброс.

    Добавлено через 13 минут(ы):

    Вот я пытался с помощью свипа на si5351 посмотреть АЧХ полосового фильтра на 145 МГц:
    Нажмите на изображение для увеличения. 

Название:	SDS00018.png 
Просмотров:	521 
Размер:	79.3 Кб 
ID:	295395 Нажмите на изображение для увеличения. 

Название:	SDS00019.png 
Просмотров:	512 
Размер:	57.7 Кб 
ID:	295396

    На нём можно заметить эти глитчи. Выше по частоте делать свип возможности нет, т.к. там нужно менять частоту PLL, а без сброса PLL частота не меняется (или меняется но не так как надо, точно уже не помню)
    Последний раз редактировалось alex_m; 29.08.2018 в 15:09.

  10. Спасибо от veso74

  11. #369
    Цитата Сообщение от alex_m Посмотреть сообщение
    без сброса PLL часто старая частота на выходе остаётся.
    У меня такого нет. Причём во всех моих поделках. Если не используется фазовый сдвиг то не делается сброс гуна даже при инициализации. Это ж гун, х.з. зачем его дёргать и потом устанавливать. Как итог щелчки при перестройке которые можно свести к минимуму.

    Я пишу не на си. Ведь код каждый делает как его понимает и считает нужным + регистры грузит так же.
    Цитата Сообщение от alex_m Посмотреть сообщение
    Думаю что без сброса, PLL может заглючить на новой частоте, чтобы этого избежать и ввели сброс.
    Я как то делал синтезатор для двойки и нормально на выходе было что то до 166 мегагерц "с копейками" без ресета гуна. Помню что с ПЧ 21,4 не вся двойка перекрывалась если задавал выходную частоту + ПЧ. Уже не помню точно до какой выходной часты можно было не делать ресет гуна. Наверное даже не до частоты а до какого то коэффициента дпкд. При кд = 4 и в регистры 44,45,46 что было нужно при кд=4 естественно писалось. Не помню уже когда гун дёргал.
    По моим экспериментам в нормальных сишках гун устойчиво перестраивается от 180 до 1200 мегагерц.


  12. #370

    Регистрация
    10.11.2016
    Адрес
    Харьков
    Сообщений
    4,420
    ur3ilf, у меня обычная Si5351A, в ней нет VCO (ГУН), есть только PLL (ФАПЧ).

    Название: Si5351label.jpg
Просмотров: 2034

Размер: 8.1 Кб

    По документации, частоту PLL можно задавать в диапазоне 600-900 МГц.
    На практике меньше 600 МГц даже не включается, выше 900 работает но совсем немного где-то до 910 МГц не больше. С ростом частоты PLL выше 900 МГц очень быстро заглючивает.

    Для мультисинта по документации диапазон частот 2.5 kHz - 200 MHz.
    На практике максимум что удалось выжать на выходе мультисинта - это 290 МГц. Выше уже сбоит.
    Нижняя граница мультисинта у меня получилась 4 кГц, как получить 2.5 кГц особо не разбирался, т.к. меня НЧ не особо интересуют.

    Без сброса PLL сишка нормально не работает, по крайней мере на частотах больше 100 МГц. Ниже сброс PLL особо не тестил. Возможно вы используете какую-то библиотеку, которая сбрасывает PLL при каких-то обращениях, поэтому и складывается впечатление что сишка работает без сброса PLL.
    Последний раз редактировалось alex_m; 29.08.2018 в 17:59.

Страница 37 из 77 ПерваяПервая ... 273435363738394047 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Никто не подскажет вариант организации радиосвязи?
    от RN6LKU в разделе Технический кабинет
    Ответов: 21
    Последнее сообщение: 02.12.2020, 22:23
  2. Ответов: 11
    Последнее сообщение: 12.02.2013, 11:59
  3. 9-диапазонная антенна, кто пробовал?
    от Chaynik в разделе Антенны КВ
    Ответов: 58
    Последнее сообщение: 09.07.2011, 16:07
  4. «Никто не забыт, ничто не забыто»
    от UR5FMU в разделе Ищу тебя
    Ответов: 0
    Последнее сообщение: 27.05.2011, 09:16

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •