Значит будем все миром разбираться как ее запустить
Владимир начал тут и .....
Хотя за исходники спасибо конечно, но сдается мне что там только малая часть совместима с si5351 по регистрам и вообще по структуре.
http://www.cqham.ru/forum/showthread.php?36110-Si5340A/page13&highlight=si5340
si5340A
348824 просмотров, 196 ответов
ra0ahc — 9 июня 2019 г. в 07:39#1
ra0ahc — 9 июня 2019 г. в 07:40#2
1.8 вольта стаб у меня есть и на 3.3 вольта тоже, в нормальных корпусах.
Время есть маленько, надо начинать, и микруху запаял уже в переходник.
Время есть маленько, надо начинать, и микруху запаял уже в переходник.
ra0ahc — 9 июня 2019 г. в 07:41#3
сюда
ra0ahc — 9 июня 2019 г. в 07:43#4
схема от туда же, но проверю завтра по даташиту
ra0ahc — 10 июня 2019 г. в 08:09#5
Скидал платку по этой схеме
потребление 370ма
i2c работает, но зависает на 61 регистре по счету должно быть 326
опора 80 мгц
кстати, эта у меня тестовая stm32 и там реализован анализатор спектра. Так вон там палка опоры пролазит 80 мгц , крутил 1-30мгц на генераторе - нормальную палку показывает . Края Найквеста рулят!
потребление 370ма
i2c работает, но зависает на 61 регистре по счету должно быть 326
опора 80 мгц
кстати, эта у меня тестовая stm32 и там реализован анализатор спектра. Так вон там палка опоры пролазит 80 мгц , крутил 1-30мгц на генераторе - нормальную палку показывает . Края Найквеста рулят!
Relayer — 11 июня 2019 г. в 03:56#6
На 150МГц даташит дает фазовый шум -124dBc при отстройке в 1кГц. Деление на 4 опустит фазовый до -136dBc (это для супера с ПЧ в 10МГц и диапазона 10м). Для 40ки еще поделим на 2 и 6дб накинем - получим фазовый -142dBc. Как то так получается имхо
Игорь 2 — 11 июня 2019 г. в 04:11#7
Для 40ки еще поделим на 2 и 6дб накинем - получим фазовый -142dBc.
Ну, если ещё забыть про спуры, и, плюс ведь ещё нюанс, к примеру, мои DDS Риголы как выходят на -130дБ/Гц на расстоянии килогерц, так эти же 130 у них и при бОльших отстройках.

Так что, никогда ни DDS, ни SI в качестве первого гетеродина даже среднего аппарата не воспринимал...
А вот мои синтезы, тактируемые Риголом, при отстройке 20 кГц на 16 МГц уже -153 дБ/Гц.
Relayer — 11 июня 2019 г. в 04:30#8
А вот мои синтезы, тактируемые Риголом, при отстройке 20 кГц на 16 МГц уже -153 дБ/Гц.Если верить даташиту (37я страница верхний график) то при 156MHz на выходе -137dBc на 20kHz отстройки. Делим на 8 - улучаем еще на 18db фазовый до -155dBc. Это при тактировании кварцев 48MHz

По спурам инфы нет. Но это ж не ддс, тут же принцип в том что ГУН системы ФАПЧ работает на частоте 14ГГц и далее делится до нужной частоты на выходе. Причем делить можно целочисленно, что улучшает шумовые характеристики
Игорь 2 — 11 июня 2019 г. в 04:41#9
Опять же два нюанса. Первый - есть ли уверенность в том, что картинка фазовых шумов будет столь же красивой при частотах, отличных от приведённой? Не взял ли производитель наименее шумные? 
Ну, и второй - а со спурами-то что делать? В последнем синтезе у меня их нет вообще в ближней зоне, самые ближние находятся на расстоянии частоты сравнения, т. е., 10...20 МГц..
Предыдущий вариант с частотами сравнения и опоры 158...316 кГц имел спуры в ближней зоне, но там самые сильные то ли под 130, то ли под 140 дБ были - я на ve3kf картинки точно давал.
В сущности, пока писал, Вы сами же про спуры и ответили...

Ну, и второй - а со спурами-то что делать? В последнем синтезе у меня их нет вообще в ближней зоне, самые ближние находятся на расстоянии частоты сравнения, т. е., 10...20 МГц..

Предыдущий вариант с частотами сравнения и опоры 158...316 кГц имел спуры в ближней зоне, но там самые сильные то ли под 130, то ли под 140 дБ были - я на ve3kf картинки точно давал.

В сущности, пока писал, Вы сами же про спуры и ответили...
Relayer — 11 июня 2019 г. в 05:19#10
есть ли уверенность в том, что картинка фазовых шумов будет столь же красивой при частотах, отличных от приведённой?Я думаю что скорее всего будет т.к. производитель нормирует джиттер для диапазона генерируемых частот
ra0ahc — 11 июня 2019 г. в 05:59#11
Я запустил сишку !!!! 
Игорь 2 — 11 июня 2019 г. в 06:05#12
ra0ahc — 11 июня 2019 г. в 07:29#13
Чуда не случилось
частота 12Мгц
выход через фнч 24мгц срез (осталась макетка)
на фото : маркер 10, 20 , 100 кгц от основной частоты
частота 12Мгц
выход через фнч 24мгц срез (осталась макетка)
на фото : маркер 10, 20 , 100 кгц от основной частоты
ra0ahc — 11 июня 2019 г. в 07:31#14
Грязь здесь есть
ну и 0-100мгц (непонятно почему 3 гармоника фнч не срезал
)
ну и 0-100мгц (непонятно почему 3 гармоника фнч не срезал
)ra0ahc — 11 июня 2019 г. в 07:34#15
Ну что...... по сравнению с 5351 .....5340 просто красавец!
ra0ahc — 11 июня 2019 г. в 07:35#16
Игорь, ваше мнение в студию пожалуйста!
(на фотках все основные настройки видно отчетливо)
(на фотках все основные настройки видно отчетливо)
Relayer — 11 июня 2019 г. в 07:41#17
по сравнению с 5351 .....5340 просто красавецЕго надо сравнивать не с 5351 у которой частота ГУН 600-900МГц, а с Si570 в которой 4-6ГГц. И обязательно запускать делитель ГУНа в целочисленном режиме.
ra0ahc — 11 июня 2019 г. в 07:45#18
да там много вопросов еше
я пока CLK просто через резистор 750 ом подключил к сишке
В любом случаии, судя по моему прибору у 5340 шумовая дорожка -90дб а у 5351 =-705дб
я пока CLK просто через резистор 750 ом подключил к сишке
В любом случаии, судя по моему прибору у 5340 шумовая дорожка -90дб а у 5351 =-705дб
Игорь 2 — 11 июня 2019 г. в 07:47#19
частота 12Мгц
выход через фнч 24мгц
Ну, тут сразу непонятка - то ли у Вас сама сишка такая шумная, то ли прибор.
Поэтому, попробуйте снять аналогичную картинку с кварцевого генератора, тогда всё станет на свои места...

Грязь здесь есть
Вижу грязь по уровню - -87 дБ, а основной сигнал сколько?

Ну, а по поводу гармоник - это фигня, ни на что не повлияет...

Да да, я знаю, у меня ничего не получится
Ничего невозможного нет..
ra0ahc — 11 июня 2019 г. в 07:49#20
основной сигнал -17дбм хотя что то я сомневаюсь.... но уже все выключил
грязь на 2.5 мгц от сигнала . Это важно?
грязь на 2.5 мгц от сигнала . Это важно?
Игорь 2 — 11 июня 2019 г. в 07:52#21
основной сигнал -17дбм
А, так палку -70 дБ успешно съест мой синтез.

Гляньте у Саши на сайте, там я указывал допустимый уровень мусора в сигнале. По-моему, при расстоянии до основного тона более 20 кГц, допустима безобразно большая цифра, чуть не -30 дБ...

Игорь 2 — 11 июня 2019 г. в 07:53#22
грязь на 2.5 мгц от сигнала . Это важно?
На -70 смело можно забить. Это точно. А конкретную цифру гляньте на ve3kf, сам не помню....

ra0ahc — 11 июня 2019 г. в 07:54#23
допустима безобразно большая цифра,дык нету тут, сигнал в ближней зоне чистый
Игорь 2 — 11 июня 2019 г. в 07:55#24
сигнал в ближней зоне чистый
Да Вы для дальней посмотрите - мне самому интересно, а искать неохота.

-70 гарантированно проходит.
Игорь 2 — 11 июня 2019 г. в 07:58#25
Завтра три новых синтеза будут... 

ra0ahc — 11 июня 2019 г. в 10:31#26
После прокуривания даташита , пришел к выводу что сишка зависла после установки выходных регистров. То есть регистров отвечающих за выхода (амплитуды, напряжения и тд). Попробую сегодня разбить на участки по заливки этих регистров.
Relayer — 11 июня 2019 г. в 10:41#27
пока CLK просто через резистор 750 ом подключил к сишкеЧерез резистор это не есть хорошо. А чего кварц не поставить?
судя по моему прибору у 5340 шумовая дорожка -90дб а у 5351 =-70дбНе в курсе что у вас за прибор, но исходя из общих принципов работы современных цифровых анализаторов спектра у вас FFT работает с маленьким количеством точек, поэтому каждая точка на спектрограмме (bin) соответствует не одному герцу, а некоторой полосе частот в которой интегрируется амплитуда сигнала. Поэтому вы можете увидеть достаточно большие палки на спектре, но в ближней зоне вы фазовые шумы не увидите, только их
Кстати не мешало бы посмотреть и чт у вашего прибора с собственными фазовыми шумами. А то может оказаться что их слегка больше чем мы собрались измерять

Игорь 2 — 11 июня 2019 г. в 10:52#28
Да, интересно, что же в результате выйдет... 
Как я понимаю, 10...20 МГц она сможет выдать с дискретностью полгерца?

Как я понимаю, 10...20 МГц она сможет выдать с дискретностью полгерца?

Игорь 2 — 11 июня 2019 г. в 10:52#29
Через резистор это не есть хорошо.
А я это упустил. В принципе, действительно, при работе на пределе срабатывания из-за этого может быть повышенный уровень фазовых шумов. Фиг знает, как они там внутри работают, я бы убедился, что есть хотя бы двукратный запас по напряжению.

А по поводу прибора и его шумов - полагаю, что Сергей с одними и теми же его установками перил обе сишки...

Лично я малые фазовые шумы анализаторами не меряю категорически - погрешность запредельная получается.

Подключаю синтез как гетеродин к монстру, а на вход приёмника - кварцевый генератор. Дальнейшее, полагаю, вполне очевидно, и погрешность мизерная.
ra0ahc — 11 июня 2019 г. в 10:56#30
0.00000...Гц и тд
Игорь 2 — 11 июня 2019 г. в 10:56#31
Нормально... 
ra0ahc — 12 июня 2019 г. в 06:42#32
Да согласен, этим прибором максимум -90 дБ можно измерить . Хотя я смотрел собственную шумовую дорожку при полосе 40 кГц она составила -116 дБ , при широкой полосе более мгц -90 дБ. Так что надо смеситель делать и смотреть звуковой платой .
ra0ahc — 12 июня 2019 г. в 07:26#33
вот к сдр
через атт -10дб
мне кажется оса уже дурить начинает
через атт -10дб
мне кажется оса уже дурить начинает
ra0ahc — 12 июня 2019 г. в 07:27#34
атт -20дб
грязь летит от LM1117 и от навесного монтажа
все греется
грязь летит от LM1117 и от навесного монтажа
все греется
ra0ahc — 12 июня 2019 г. в 07:28#35
мне кажется опора идеальная для синта
так?
так?
ra0ahc — 12 июня 2019 г. в 08:42#36
Сегодня осилил только гуны.
Плата получается "не детская" - это расплата за сервис и универсальность.
Плата получается "не детская" - это расплата за сервис и универсальность.
Игорь 2 — 12 июня 2019 г. в 09:44#37
Сегодня осилил только гуны.
Смотрите, сигнальные провода там не размахайте, как образец, может быть, взять Пикад от ГУНа 0844, я выложил его в ветке про синтез, он гарантированно без всяких заморочек.

Это не потому, что что-то у Вас увидел, так, мысли вслух...
vikr — 12 июня 2019 г. в 10:05#38
У меня вот так получилось. Плата 100х100мм. Три ГУНа настроил без проблем, как говориться в лёт, а самый вч пока в процессе. самое хреновое что диптрассеровский исходник куда то сгинул, а на этой плате две ошибки.
Игорь 2 — 12 июня 2019 г. в 10:10#39
У меня вот так получилось.
Ну, 100*100 - вообще круто, у меня сейчас ГУНы - 85*65, ЧФД - 50*65, вся плата пустая.

Тоже думал объединить, но, пока решил, что для экспериментов лучше раздельные иметь...

А настраивается всё влёт - я уже и сам запутался, сколько через меня плат пролетело, катушки уже к концу подходят...
vikr — 12 июня 2019 г. в 10:24#40
100х100 потому что у китайцев так дешевле. ЧФД планировалось отрезать и делать этажерку. Сейчас думаю кинуть жесткие медные коаксиалы 2мм диаметром с обратной стороны.
Игорь 2 — 12 июня 2019 г. в 10:45#41
мне кажется опора идеальная для синта
Картинки-то неплохие, но, всё-таки, я бы у себя его проверил. На те же фазовые шумы было бы интересно. Больше трёх дней общий прогон не займёт.

Как раз, в паре с собранными синтезаторами...

Игорь 2 — 12 июня 2019 г. в 10:47#42
Сейчас думаю кинуть жесткие медные коаксиалы 2мм диаметром с обратной стороны.
А почему во множественном числе? У меня при линейном расположении коаксиал только один - с выхода делителя ГУНов на вход ЧФД..

ra0ahc — 12 июня 2019 г. в 10:51#43
Без процессора это кусок железа 

Игорь 2 — 12 июня 2019 г. в 10:57#44
Без процессора это кусок железа
Естественно. В принципе, можно пробовать и на одной частоте - к примеру, я меряю при опорной частоте DDS 16057 кГц - это 20 кГц от частоты приёма 7036 кГц, на которой у меня и работает кварцевый генератор, который я ставлю на вход монстра...

Ну, а со спурами, полагаю, и у Вас всё получится, там, наверное, и Осы хватит...
vikr — 12 июня 2019 г. в 11:03#45
А выход чфд на варикапы, можно не надо?
Игорь 2 — 12 июня 2019 г. в 11:47#46
А выход чфд на варикапы, можно не надо?
Конечно же надо, но у меня там внешний соединительный проводок длиной 2 см. при варианте с линейным расположением плат, и 5 мм. при бутерброде.
В обоих случаях никаких наводок нет, никакой экранировки провода не требуется...

ra0ahc — 13 июня 2019 г. в 07:03#47
У меня вот так получилось. Плата 100х100мм.Я посмотрел вашу плату внимательно. Вы ее уже заказали? Я нашел много важных нюансов.
Если не заказали, подождите мою, посмотрите отличия в подходе. Сделаете доработки и тогда....
ra0ahc — 13 июня 2019 г. в 07:05#48
вот например критическая ошибка.
Это сигнальная магистраль , же ? Тогда здесь серьезная ошибка.
Сами скажите или показать?
Это сигнальная магистраль , же ? Тогда здесь серьезная ошибка.
Сами скажите или показать?

ra0ahc — 13 июня 2019 г. в 08:04#49
Вот так я уже делал и сейчас сделал.
Можно догадаться, где магистраль
Можно догадаться, где магистраль
vikr — 13 июня 2019 г. в 10:23#50
Да, это выход синтеза . Вы через это уже прошли, мне ещё предстоит. Хотя я придерживался топологии Игоря.
ra0ahc — 13 июня 2019 г. в 12:27#51
Продолжаем...
решил сделать как автор
платы одна над другой (по необходимости)
решил сделать как автор

платы одна над другой (по необходимости)
Игорь 2 — 13 июня 2019 г. в 12:46#52
решил сделать как автор
Очень правильное решение.
Потому, что топология уже проверена неоднократно. 
Риск получить лажу при иной разводке при условии соблюдения элементарных правил, не сильно велик, но он есть...
ra0ahc — 14 июня 2019 г. в 07:11#53
Вот так будет наверное...
Игорь 2 — 14 июня 2019 г. в 10:24#54
Нормально вроде...


Relayer — 8 июля 2019 г. в 01:50#55
Это чтож на каждую смену частоты PLL дергать и ресетить?
Владимир_К — 8 июля 2019 г. в 01:55#56
Схема, печатная плата и тестовая прошивка для проверки работоспособности модуля. С кварцевым генератором 80 мгц, микросхема выдает на выходе OUT2 20 мгц. Печатная плата предусматривает возможность установки генератора (в прямоугольном корпусе) или кварца. Это то, что было под рукой. Но прошивка для генератора. Это все, конечно, пока только макет, для изучения микросхемы и отработки программы.
Владимир_К — 8 июля 2019 г. в 02:04#57
Для проверки модуля написал небольшую программку. Программа пишет в регистры микросхемы, затем читает и выводит прочитанное на экран компьютера. Для вывода на экран используется терминальная программа Terminal 1.9. Проект можно открыть и изменить в программе AVR Studio 4.19 или старше. HEX файл прошивки в папке проекта "default". Это только для проверки правильности записи.. Больше ничего.
Кроме того, при первом включении? может оказаться полезной программа для Ардуино "ScanerI2C". Скетч программы можно найти в интернете. Запустить программу, в меню "Tools" - Serial Monitor. Микросхема должна ответить 74. Это ее адрес (при замкнутых на землю A0 и А1.
Кроме того, при первом включении? может оказаться полезной программа для Ардуино "ScanerI2C". Скетч программы можно найти в интернете. Запустить программу, в меню "Tools" - Serial Monitor. Микросхема должна ответить 74. Это ее адрес (при замкнутых на землю A0 и А1.
Владимир_К — 8 июля 2019 г. в 02:15#58
буду пробовать....такНаверное вот так надо:
/********************* Загружаем Num ************************/
void WriteNUM (uint8_t page_1, volatile uint64_t P1, char reg)
{
WriteByte_1 (page_1, reg);
i2cByteSend ((P1 & 0x00000000000000FF));
i2cByteSend ((P1 & 0x000000000000FF00)>>
;i2cByteSend ((P1 & 0x0000000000FF0000)>>16);
i2cByteSend ((P1 & 0x00000000FF000000)>>24);
i2cByteSend ((P1 & 0x000000FF00000000)>>32);
i2cByteSend ((P1 & 0x0000FF0000000000)>>40);
i2cByteSend ((P1 & 0x00FF000000000000)>>48);
i2cByteSend ((P1 & 0xFF00000000000000)>>56);
i2cStop();
}
Сначала загружаются регистры с меньшим адресом, затем адрес увеличивается на 1 автоматически.
Владимир_К — 8 июля 2019 г. в 02:29#59
Это чтож на каждую смену частоты PLL дергатьОтвета на этот вопрос я так нигде и не нашел. Но, думаю, правильно будет задать параметры делителя в PLL один раз, при инициализации микросхемы и больше туда вообще не соваться. При смене диапазона можно менять значения выходных делителей R, а изменение частоты производить только делителем N. Причем, возможно, не считать тупо все, да еще и с делениями, а ограничиться сложением. Просто к значению Numerator добавлять дельту. Будет, конечно отклонение частоты, но возможно оно будет в пределах погрешности кварцевого генератора.
У Вас опыт большой, что посоветуете? Ну и конечно, проблема с кварцем или генератором. Сдается мне, ширпотребом, все параметры микросхемы можно им угробить...
Ну и еще одно. При использовании шины I2C, надо уходить от ожидания срабатывания модуля TWI. То есть диспетчер нужен или флаговый автомат? В которых я пока не разобрался...
А может вообще уйти от I2C и использовать SPI.
Странная штука. В предыдущем сообщении вместо 8 подставлен смайлик... Я не виноват
Relayer — 8 июля 2019 г. в 02:47#60
У Вас опыт большой, что посоветуете?Ничего пока не посоветую. Вот дойдут руки - тогда будет рабочий код.
Владимир_К — 8 июля 2019 г. в 03:07#61
Сначала загружаются регистрыВ сообщении я зарапортовался.. В пошаговом режиме отлаживал, число 64 разрядное, вот и впер туда 64 разрядное.. Поэтому надо изменить с учетом разрядности, то есть нижние 2 строчки убрать.. Но оно и так работает
. Работает потому, что при записи Num затираются регистры Den. А потом Den восстанавливаются, так как Dеn пишется позже. Но, конечно же, лишнее писать нет смысла. И так по времени получается критично.ra0ahc — 8 июля 2019 г. в 07:39#62
Владимир, пока ваш алгоритм не работает.
Вы просто загнали регистры и получили красивую частоту. Но алгоритм пересчета здесь вообще другой. Пока я не могу ладу дать с этим алгоритмом. Но расчет DEn NUM от 5351 не катит.
Вы просто загнали регистры и получили красивую частоту. Но алгоритм пересчета здесь вообще другой. Пока я не могу ладу дать с этим алгоритмом. Но расчет DEn NUM от 5351 не катит.
ra0ahc — 8 июля 2019 г. в 07:42#63
пробовал ...пока фигня полная. частота прыгает от 1 мгц до 80 мгц в хрен знает каком алгоритме.
сейчас у нас уже поздно ...завтра еще раз посмотрю
походу как обычно всё с начала придется.
и пошаговый режим тоже ....
ra0ahc — 8 июля 2019 г. в 07:50#64
Тув вообще по другому написано
3.1 Basic Procedure for Using the Si5341/40 as a DCO
1. Create a starting frequency plan using ClockBuilder Pro. Note the N dividers that are connected to the output clocks that you want
to control as a DCO. When an individual N divider value is changed, all output clocks connected to that N divider will change by the
same percentage amount.
2. Make sure that the N dividers that you are going to change have their fractional mode enabled.
a. The setting name, PIBYP[4:0], controls the integer or fractional mode, PIBYP[N4 N3 N2 N1 N0]. When the respective bit of
PIBYP is set to 0 the N divider is in fractional mode. If all N dividers are to be used as DCO's then set PIBYP = 0x00. A soft
reset is required after changing any bit of PIBYP to a 0. Note that a soft reset will cause all outputs to glitch. CBPro sets PIBYP
as needed for all N dividers that have DCO enabled.
3. Compute the Nx_NUM_delta for your required frequency step size.
4. Write the new Nx_NUM word. New Nx_NUM = old Nx_NUM +- Nx_NUM_delta.
a. Add Nx_NUM_delta to Nx_NUM to decrease the output frequency and subtract Nx_NUM_delta from Nx_NUM to increase the
output frequency.
b. Write the new Nx_NUM value.
c. Write the Nx_UPDATE bit to cause the change to take effect.
3.1 Основная процедура для использования Si5341 / 40 в качестве DCO
1. Создайте начальный частотный план с помощью ClockBuilder Pro. Обратите внимание на N делителей, которые подключены к выходным тактовым сигналам, которые вы хотите
контролировать как DCO. При изменении значения отдельного делителя N все выходные часы, подключенные к этому делителю N, изменятся на
такая же процентная сумма.
2. Убедитесь, что для N делителей, которые вы собираетесь изменить, включен их дробный режим.
а. Имя настройки, PIBYP [4: 0], управляет целочисленным или дробным режимом, PIBYP [N4 N3 N2 N1 N0]. Когда соответствующий бит
PIBYP установлен в 0, делитель N находится в дробном режиме. Если все N делителей должны использоваться в качестве DCO, тогда установите PIBYP = 0x00. Мягкий
Сброс требуется после изменения любого бита PIBYP на 0. Обратите внимание, что мягкий сброс приведет к сбоям всех выходов. CBPro устанавливает PIBYP
по мере необходимости для всех N делителей, у которых включен DCO.
3. Вычислите Nx_NUM_delta для требуемого размера шага частоты.
4. Напишите новое слово Nx_NUM. Новый Nx_NUM = старый Nx_NUM + - Nx_NUM_delta.
а. Добавьте Nx_NUM_delta к Nx_NUM, чтобы уменьшить выходную частоту, и вычтите Nx_NUM_delta из Nx_NUM, чтобы увеличить
выходная частота.
б. Напишите новое значение Nx_NUM.
с. Запишите бит Nx_UPDATE, чтобы изменения вступили в силу.
« Последнее редактирование: Июль 08, 2019, 08:04:29 pm от ra0ahc »

Записан
Да да, я знаю, у меня ничего не получится )))
3.1 Basic Procedure for Using the Si5341/40 as a DCO
1. Create a starting frequency plan using ClockBuilder Pro. Note the N dividers that are connected to the output clocks that you want
to control as a DCO. When an individual N divider value is changed, all output clocks connected to that N divider will change by the
same percentage amount.
2. Make sure that the N dividers that you are going to change have their fractional mode enabled.
a. The setting name, PIBYP[4:0], controls the integer or fractional mode, PIBYP[N4 N3 N2 N1 N0]. When the respective bit of
PIBYP is set to 0 the N divider is in fractional mode. If all N dividers are to be used as DCO's then set PIBYP = 0x00. A soft
reset is required after changing any bit of PIBYP to a 0. Note that a soft reset will cause all outputs to glitch. CBPro sets PIBYP
as needed for all N dividers that have DCO enabled.
3. Compute the Nx_NUM_delta for your required frequency step size.
4. Write the new Nx_NUM word. New Nx_NUM = old Nx_NUM +- Nx_NUM_delta.
a. Add Nx_NUM_delta to Nx_NUM to decrease the output frequency and subtract Nx_NUM_delta from Nx_NUM to increase the
output frequency.
b. Write the new Nx_NUM value.
c. Write the Nx_UPDATE bit to cause the change to take effect.
3.1 Основная процедура для использования Si5341 / 40 в качестве DCO
1. Создайте начальный частотный план с помощью ClockBuilder Pro. Обратите внимание на N делителей, которые подключены к выходным тактовым сигналам, которые вы хотите
контролировать как DCO. При изменении значения отдельного делителя N все выходные часы, подключенные к этому делителю N, изменятся на
такая же процентная сумма.
2. Убедитесь, что для N делителей, которые вы собираетесь изменить, включен их дробный режим.
а. Имя настройки, PIBYP [4: 0], управляет целочисленным или дробным режимом, PIBYP [N4 N3 N2 N1 N0]. Когда соответствующий бит
PIBYP установлен в 0, делитель N находится в дробном режиме. Если все N делителей должны использоваться в качестве DCO, тогда установите PIBYP = 0x00. Мягкий
Сброс требуется после изменения любого бита PIBYP на 0. Обратите внимание, что мягкий сброс приведет к сбоям всех выходов. CBPro устанавливает PIBYP
по мере необходимости для всех N делителей, у которых включен DCO.
3. Вычислите Nx_NUM_delta для требуемого размера шага частоты.
4. Напишите новое слово Nx_NUM. Новый Nx_NUM = старый Nx_NUM + - Nx_NUM_delta.
а. Добавьте Nx_NUM_delta к Nx_NUM, чтобы уменьшить выходную частоту, и вычтите Nx_NUM_delta из Nx_NUM, чтобы увеличить
выходная частота.
б. Напишите новое значение Nx_NUM.
с. Запишите бит Nx_UPDATE, чтобы изменения вступили в силу.
« Последнее редактирование: Июль 08, 2019, 08:04:29 pm от ra0ahc »

Записан
Да да, я знаю, у меня ничего не получится )))
Владимир_К — 8 июля 2019 г. в 07:58#65
Владимир, пока ваш алгоритм не работает.Где Вы его увидели, мой алгоритм?
И давно так?Если нравится по-другому, никто не возражает.
ra0ahc — 8 июля 2019 г. в 08:01#66
Сначала загружаются регистры с меньшим адресом, затем адрес увеличивается на 1 автоматически.Да, вы правы, это я ступил.
ra0ahc — 8 июля 2019 г. в 08:01#67
здесь нашел
ra0ahc — 8 июля 2019 г. в 08:02#68
Где Вы его увидели, мой алгоритм?Вы сами на cqham кидали. вот его я и кручу.
Владимир_К — 8 июля 2019 г. в 08:03#69
Create a starting frequency plan using ClockBuilder Pro.Это для фиксированной частоты. Программа выдаст коэффициенты с учетом минимального джиттера. Для нас это актуально для опорника. Для синтезатора с изменением частоты эта программа (ClockBuilder) мало что дает.
Владимир_К — 8 июля 2019 г. в 08:07#70
Вы сами на cqham кидалиНесколько раз писал, что то были только начальные шаги и неудачные. Сразу было видно, что надо переделать плату, а потом ковыряться в программе. Там в программе даже адреса остались от Si5351A.
ra0ahc — 8 июля 2019 г. в 08:08#71
Время экономит здорово.
Я сделал там частоту ...получил дамп ...загнал в сишку , а дальше надо NUM менять и только его. PLL (как вы и писали) трогать не надо, 10-20 мгц я думаю можно и без изменений плл сгенерить, но надо проверить.
Я сделал там частоту ...получил дамп ...загнал в сишку , а дальше надо NUM менять и только его. PLL (как вы и писали) трогать не надо, 10-20 мгц я думаю можно и без изменений плл сгенерить, но надо проверить.
ra0ahc — 8 июля 2019 г. в 08:11#72
там вроде только это
ra0ahc — 8 июля 2019 г. в 08:22#73
Кстате, сегодня сишка не запустилась и я начал пропаивать контакты, а потом вообще снял микруху феном и назад поставил. Много издевательств с паяльником (320гр) итак 3 часа 
Потом полез в программу, оказалось не ту версию заливал ...тактирование ни туда подал, блин.
Крепкая она оказалась.Выдержала все мои издевательства.
Потом полез в программу, оказалось не ту версию заливал ...тактирование ни туда подал, блин.
Крепкая она оказалась.Выдержала все мои издевательства.
Владимир_К — 8 июля 2019 г. в 08:51#74
10-20 мгц я думаю можно и без изменений плл сгенерить, но надо проверить.Наверняка можно. Есть же еще выходные 24-разрядные делители R. Там можно еще кучу делений получить, на 2, 4 и т.д. И значение этого делителя можно менять в зависимости от диапазона. То есть, при вызове функции расчета частоты, в параметре функции укажите диапазон, а там условие, например, если диапазон 1, то делитель 16 , второй - 8 и т.д. Таким образом диапазон изменения N делителей будет меньше. Хотя, может что и вылезет.. Кроме того, у PLL всего вроде 10% изменение частоты максимум. Поэтому его, я думаю, вообще трогать не нужно. Один раз загнать при инициализации и на этом ограничиться.
Владимир_К — 8 июля 2019 г. в 10:40#75
Ну и вот, что нам пишут:
It is possible for a PLL to become unresponsive (i.e., lose lock indefinitely) when it is dynamically reprogrammed or changed via the
serial port. Reprogramming/changing the N divider does not affect the PLL. Any change that causes the VCO frequency to change by
more than 250 ppm since Power-up, NVM download, or SOFT_RST requires the following special sequence of writes. Changes to the
following registers require the following special sequence of writes:
А это означает примерно, что при изменении частоты генератора более чем на 250 ppm, возможен срыв частоты.
А вот еще более конкретно:
Changes to
output frequencies without changing the PLL settings are desired.
То есть, изменение частоты желательно производить без изменения частоты PLL. Так что соваться туда скорее всего не следует.
Ну и алгоритм. Скажем частота PLL 13200000000, которую мы успешно задали. А нужно получить на выходе например 20 мгц. И как это сделать? Есть делитель, состоящий из числителя N_NUM и знаменателя N_DEN. И имеем два неизвестных. Придется одно значение, например знаменатель взять " с потолка", ну например - 536870912. Почему такое значение? Потому что это 20000000 в 16-ричной системе. Тогда числитель должен быть (13200000000/20000000)*536870912=354334801920. Имеем N_DEN=536870912, а N_NUM=354334801920. Дальше все просто.. Вот так это примерно выглядит:
/**************************** Функция управления частотой *****************************************/
void si5340aSetFrequency(unsigned long z)
{
//Определение переменных: pllFreq, XTALFreq, l, f, mult, num, denom, divider
uint64_t xtalFreq = XTAL_FREQ;
volatile uint64_t mult;
volatile uint64_t num;
volatile uint32_t denom=2147483648;
volatile uint64_t divider_1;
volatile uint64_t m_num;
volatile uint32_t m_denom = 201326592;
volatile uint64_t pllFreq = 13200000000;
divider_1 = pllFreq/xtalFreq; // Определяем значение делителя Pll.
if ((divider_1 & 1) != 0) divider_1--; // (короче делаем четным)
pllFreq = divider_1 * xtalFreq; // Считаем настоящее значение частоты, так как в значении делителя отброшены числа после запятой, кроме того, сделали значение четным.
m_num = pllFreq/ m_denom; //Значение числителя делителя PLL.
num=(pllFreq/z)*denom; //Значение числителя N_NUM.
setup_div(num, denom);
WriteByte (0x03, 0x0C, 0x01); // Update N0
setupPLL(m_num, m_denom);
WriteByte (0x02, 0x3F, 0x01); // Update M
Спать надо, может что напутал.. Завтра скорее всего буду в пути... Да, прикинул еще раз на калькуляторе..
Вроде что-то напутал. Но думаю идею поняли.
It is possible for a PLL to become unresponsive (i.e., lose lock indefinitely) when it is dynamically reprogrammed or changed via the
serial port. Reprogramming/changing the N divider does not affect the PLL. Any change that causes the VCO frequency to change by
more than 250 ppm since Power-up, NVM download, or SOFT_RST requires the following special sequence of writes. Changes to the
following registers require the following special sequence of writes:
А это означает примерно, что при изменении частоты генератора более чем на 250 ppm, возможен срыв частоты.
А вот еще более конкретно:
Changes to
output frequencies without changing the PLL settings are desired.
То есть, изменение частоты желательно производить без изменения частоты PLL. Так что соваться туда скорее всего не следует.
Ну и алгоритм. Скажем частота PLL 13200000000, которую мы успешно задали. А нужно получить на выходе например 20 мгц. И как это сделать? Есть делитель, состоящий из числителя N_NUM и знаменателя N_DEN. И имеем два неизвестных. Придется одно значение, например знаменатель взять " с потолка", ну например - 536870912. Почему такое значение? Потому что это 20000000 в 16-ричной системе. Тогда числитель должен быть (13200000000/20000000)*536870912=354334801920. Имеем N_DEN=536870912, а N_NUM=354334801920. Дальше все просто.. Вот так это примерно выглядит:
/**************************** Функция управления частотой *****************************************/
void si5340aSetFrequency(unsigned long z)
{
//Определение переменных: pllFreq, XTALFreq, l, f, mult, num, denom, divider
uint64_t xtalFreq = XTAL_FREQ;
volatile uint64_t mult;
volatile uint64_t num;
volatile uint32_t denom=2147483648;
volatile uint64_t divider_1;
volatile uint64_t m_num;
volatile uint32_t m_denom = 201326592;
volatile uint64_t pllFreq = 13200000000;
divider_1 = pllFreq/xtalFreq; // Определяем значение делителя Pll.
if ((divider_1 & 1) != 0) divider_1--; // (короче делаем четным)
pllFreq = divider_1 * xtalFreq; // Считаем настоящее значение частоты, так как в значении делителя отброшены числа после запятой, кроме того, сделали значение четным.
m_num = pllFreq/ m_denom; //Значение числителя делителя PLL.
num=(pllFreq/z)*denom; //Значение числителя N_NUM.
setup_div(num, denom);
WriteByte (0x03, 0x0C, 0x01); // Update N0
setupPLL(m_num, m_denom);
WriteByte (0x02, 0x3F, 0x01); // Update M
Спать надо, может что напутал.. Завтра скорее всего буду в пути... Да, прикинул еще раз на калькуляторе..
Relayer — 8 июля 2019 г. в 11:09#76
То есть, изменение частоты желательно производить без изменения частоты PLL. Так что соваться туда скорее всего не следует.Фтопку такое решение. ГУН делить надо ЦЕЛОЧИСЛЕННО. А вы предлагаете использовать дробный коэф.деления. Ну вот и получите фазовые шумы выше чем надо.
Ну и алгоритм. Скажем частота PLL 13200000000, которую мы успешно задали. А нужно получить на выходе например 20 мгц. И как это сделать? Есть делитель, состоящий из числителя N_NUM и знаменателя N_DEN. И имеем два неизвестных. Придется одно значение, например знаменатель взять " с потолка", ну например - 536870912. Почему такое значение? Потому что это 20000000 в 16-ричной системе. Тогда числитель должен быть (13200000000/20000000)*536870912=354334801920. Имеем N_DEN=536870912, а N_NUM=354334801920.
ra0ahc — 8 июля 2019 г. в 11:27#77
буду пробовать....так
Процедуры записи частоты в si5340.
(без понимания - работать не будет)
void si5340aSetFrequency_1(uint32_t freq) {
uint64_t pllFreq;
uint32_t xtalFreq = 100000000;//100MHz
uint64_t l;
float f;
uint64_t mult;
uint64_t num;
uint32_t denom;
uint64_t divider;
divider = (uint64_t) (13200000000 / xtalFreq);
// PLL frequency: 900MHz
if ((divider & 1) != 0)
divider--; // Ensure an even integer division ratio
pllFreq = divider * xtalFreq; // Calculate the pllFrequency: the divider * desired output frequency
mult = pllFreq / freq; // Determine the multiplier to get to the required pllFrequency
l = pllFreq % freq; // It has three parts
f = l; // mult is an integer that must be in the range 15..90
f *= 4294967295; // num and denom are the fractional parts, the numerator and denominator
f /= freq; // each is 20 bits (range 0..1048575)
num = (uint64_t) f; // the actual multiplier is mult + num / denom
denom = 4294967295; // For simplicity we set the denominator to the maximum 1048575
setupPLL5340(divider, denom);//
setupMultisynth5340(N0_NUM, N0_DEN, mult, num, denom);
}
этот код не работает, оставлен для истории
Процедуры записи частоты в si5340.
(без понимания - работать не будет)
void si5340aSetFrequency_1(uint32_t freq) {
uint64_t pllFreq;
uint32_t xtalFreq = 100000000;//100MHz
uint64_t l;
float f;
uint64_t mult;
uint64_t num;
uint32_t denom;
uint64_t divider;
divider = (uint64_t) (13200000000 / xtalFreq);
// PLL frequency: 900MHz
if ((divider & 1) != 0)
divider--; // Ensure an even integer division ratio
pllFreq = divider * xtalFreq; // Calculate the pllFrequency: the divider * desired output frequency
mult = pllFreq / freq; // Determine the multiplier to get to the required pllFrequency
l = pllFreq % freq; // It has three parts
f = l; // mult is an integer that must be in the range 15..90
f *= 4294967295; // num and denom are the fractional parts, the numerator and denominator
f /= freq; // each is 20 bits (range 0..1048575)
num = (uint64_t) f; // the actual multiplier is mult + num / denom
denom = 4294967295; // For simplicity we set the denominator to the maximum 1048575
setupPLL5340(divider, denom);//
setupMultisynth5340(N0_NUM, N0_DEN, mult, num, denom);
}
этот код не работает, оставлен для истории
ra0ahc — 8 июля 2019 г. в 11:28#78
void send5340(uint8_t page, uint8_t reg, uint8_t reg_1, uint64_t P1, uint32_t P2) {
uint8_t x[2];
uint8_t y[7];
x[0] = 0x01;
x[1] = page;
while (HAL_I2C_Master_Transmit(&hi2c3, 0b11101000, (uint8_t *) &x, 2, 500) != HAL_OK) {
BSP_LCD_DisplayHStringAt(0, 20, "err wr 5340 page", LEFT_MODE);
};
y[0] = reg;
y[1] = (uint8_t)((P1 & 0xFF0000000000) >> 40 );
y[2] = (uint8_t)((P1 & 0x00FF00000000) >> 32 );
y[3] = (uint8_t)((P1 & 0x0000FF000000) >> 24 );
y[4] = (uint8_t)((P1 & 0x000000FF0000) >> 16 );
y[5] = (uint8_t)((P1 & 0x00000000FF00) >> 8 );
y[6] = (uint8_t)(P1 & 0x0000000000FF );
while (HAL_I2C_Master_Transmit(&hi2c3, 0b11101000, (uint8_t *) &y, 7, 500) != HAL_OK) {
BSP_LCD_DisplayHStringAt(0, 20, "err wr 5340 filling", LEFT_MODE);
};
x[0] = 0x01;
x[1] = page;
while (HAL_I2C_Master_Transmit(&hi2c3, 0b11101000, (uint8_t *) &x, 2, 500) != HAL_OK) {
BSP_LCD_DisplayHStringAt(0, 20, "err wr 5340 page", LEFT_MODE);
};
y[0] = reg_1;
y[1] = (uint8_t)((P2 & 0x0000FF000000) >> 24 );
y[2] = (uint8_t)((P2 & 0x000000FF0000) >> 16 );
y[3] = (uint8_t)((P2 & 0x00000000FF00) >> 8 );
y[4] = (uint8_t)(P2 & 0x0000000000FF );
while (HAL_I2C_Master_Transmit(&hi2c3, 0b11101000, (uint8_t *) &y, 5, 500) != HAL_OK) {
BSP_LCD_DisplayHStringAt(0, 20, "err wr 5340 filling", LEFT_MODE);
};
}
этот код не работает, оставлен для истории
uint8_t x[2];
uint8_t y[7];
x[0] = 0x01;
x[1] = page;
while (HAL_I2C_Master_Transmit(&hi2c3, 0b11101000, (uint8_t *) &x, 2, 500) != HAL_OK) {
BSP_LCD_DisplayHStringAt(0, 20, "err wr 5340 page", LEFT_MODE);
};
y[0] = reg;
y[1] = (uint8_t)((P1 & 0xFF0000000000) >> 40 );
y[2] = (uint8_t)((P1 & 0x00FF00000000) >> 32 );
y[3] = (uint8_t)((P1 & 0x0000FF000000) >> 24 );
y[4] = (uint8_t)((P1 & 0x000000FF0000) >> 16 );
y[5] = (uint8_t)((P1 & 0x00000000FF00) >> 8 );
y[6] = (uint8_t)(P1 & 0x0000000000FF );
while (HAL_I2C_Master_Transmit(&hi2c3, 0b11101000, (uint8_t *) &y, 7, 500) != HAL_OK) {
BSP_LCD_DisplayHStringAt(0, 20, "err wr 5340 filling", LEFT_MODE);
};
x[0] = 0x01;
x[1] = page;
while (HAL_I2C_Master_Transmit(&hi2c3, 0b11101000, (uint8_t *) &x, 2, 500) != HAL_OK) {
BSP_LCD_DisplayHStringAt(0, 20, "err wr 5340 page", LEFT_MODE);
};
y[0] = reg_1;
y[1] = (uint8_t)((P2 & 0x0000FF000000) >> 24 );
y[2] = (uint8_t)((P2 & 0x000000FF0000) >> 16 );
y[3] = (uint8_t)((P2 & 0x00000000FF00) >> 8 );
y[4] = (uint8_t)(P2 & 0x0000000000FF );
while (HAL_I2C_Master_Transmit(&hi2c3, 0b11101000, (uint8_t *) &y, 5, 500) != HAL_OK) {
BSP_LCD_DisplayHStringAt(0, 20, "err wr 5340 filling", LEFT_MODE);
};
}
этот код не работает, оставлен для истории
ra0ahc — 8 июля 2019 г. в 11:29#79
void setupMultisynth5340(uint8_t N_NUM, uint8_t N_DEN, uint64_t mult_2, uint64_t num_2, uint32_t denom_2) {
uint64_t P3; // Synth config register P1
uint32_t P4; // Synth config register P2
P3 = (mult_2 * denom_2 + num_2); //
P4 = denom_2;
// * 0x0302[43:0] N0_NUM 1181116006400 0x11300000000
// * 0x0308[31:0] N0_DEN 2147483648 0x80000000
send5340(0x03, N0_NUM, N0_DEN, P3, P4);
}
void setupPLL5340(uint64_t divider_1, uint32_t denom_1) {
uint64_t P1; // PLL config register P1
uint32_t P2; // PLL config register P2
P1 = (divider_1 * denom_1); //
P2 = denom_1;
//* 0x0235[43:0] M_NUM 354334801920 0x05280000000
// * 0x023B[31:0] M_DEN 2147483648 0x80000000
send5340(0x02, M_NUM, M_DEN, P1, P2);
}
этот код ПОЧТИ не работает, оставлен для истории
uint64_t P3; // Synth config register P1
uint32_t P4; // Synth config register P2
P3 = (mult_2 * denom_2 + num_2); //
P4 = denom_2;
// * 0x0302[43:0] N0_NUM 1181116006400 0x11300000000
// * 0x0308[31:0] N0_DEN 2147483648 0x80000000
send5340(0x03, N0_NUM, N0_DEN, P3, P4);
}
void setupPLL5340(uint64_t divider_1, uint32_t denom_1) {
uint64_t P1; // PLL config register P1
uint32_t P2; // PLL config register P2
P1 = (divider_1 * denom_1); //
P2 = denom_1;
//* 0x0235[43:0] M_NUM 354334801920 0x05280000000
// * 0x023B[31:0] M_DEN 2147483648 0x80000000
send5340(0x02, M_NUM, M_DEN, P1, P2);
}
этот код ПОЧТИ не работает, оставлен для истории
Владимир_К — 9 июля 2019 г. в 02:46#80
Хотя если всетаки менять плл то можно все красиво сделать ...наверное.Вот что выдал ClockBuilder. Частота опорника 80 мгц, частота выхода 20,00404 мгц. Ну и где здесь целочисленное деление?
ra0ahc — 9 июля 2019 г. в 05:05#81
Приращение 20 Гц не получится, Вы же сами посчитали выше
Только через float
Только через float
ra0ahc — 9 июля 2019 г. в 06:28#82
Полностью рабочие процедуры!!!


void saveReg5340A(void) {//ini 5340
char buf[20];
uint8_t x[2];//3
uint8_t y[2];
for (int i = 0; i < SI5340_REVD_REG_CONFIG_NUM_REGS; i++) {
x[0] = 0x01;
x[1] = (uint8_t) (si5340_revd_registers.address >>
;
y[0] = (uint8_t) (si5340_revd_registers.address & 0x00ff);
y[1] = si5340_revd_registers.value;
if (i == 6) HAL_Delay(500);
while (HAL_I2C_Master_Transmit(&hi2c3, 0b11101000, (uint8_t *) &x, 2, 500) != HAL_OK) {
BSP_LCD_DisplayHStringAt(0, 20, "err wr 5340 page", LEFT_MODE);
};
//
// sprintf(buf, "%06d", i);
// BSP_LCD_DisplayHStringAt(0, 80, (uint8_t *)buf, LEFT_MODE);
while (HAL_I2C_Master_Transmit(&hi2c3, 0b11101000, (uint8_t *) &y, 2, 500) != HAL_OK) {
BSP_LCD_DisplayHStringAt(0, 20, "err wr 5340 filling", LEFT_MODE);
};
}
//N_PIBYP
x[0] = 0x01;
x[1] = 0x0A;
while (HAL_I2C_Master_Transmit(&hi2c3, 0b11101000, (uint8_t *) &x, 2, 500) != HAL_OK) {
BSP_LCD_DisplayHStringAt(0, 20, "err wr 5340 page", LEFT_MODE);
};
y[0] = 0x04;
y[1] = 0;
while (HAL_I2C_Master_Transmit(&hi2c3, 0b11101000, (uint8_t *) &y, 2, 500) != HAL_OK) {
BSP_LCD_DisplayHStringAt(0, 20, "err wr 5340 filling", LEFT_MODE);
};
//Write SOFT_RST = 1 (0x001C).
x[0] = 0x01;
x[1] = 0x00;
while (HAL_I2C_Master_Transmit(&hi2c3, 0b11101000, (uint8_t *) &x, 2, 500) != HAL_OK) {
BSP_LCD_DisplayHStringAt(0, 20, "err wr 5340 page", LEFT_MODE);
};
y[0] = 0x1c;
y[1] = 1;
while (HAL_I2C_Master_Transmit(&hi2c3, 0b11101000, (uint8_t *) &y, 2, 500) != HAL_OK) {
BSP_LCD_DisplayHStringAt(0, 20, "err wr 5340 filling", LEFT_MODE);
};
}
void si5340aSetFrequency_1(uint32_t freq) {
uint64_t num;
uint32_t denom=2147483648;
uint64_t pllFreq = 13200000000;
num=(uint64_t)(pllFreq*((float)denom/freq));
send5340(0x03, N0_NUM, N0_DEN, num, denom);
}
void send5340(uint8_t page, uint8_t reg, uint8_t reg_1, uint64_t P1, uint32_t P2) {
uint8_t x[2];
uint8_t y[7];
x[0] = 0x01;
x[1] = page;
while (HAL_I2C_Master_Transmit(&hi2c3, 0b11101000, (uint8_t *) &x, 2, 500) != HAL_OK) {
BSP_LCD_DisplayHStringAt(0, 20, "err wr 5340 page", LEFT_MODE);
};
y[0] = reg;
y[6] = (uint8_t) ((P1 & 0xFF0000000000) >> 40);
y[5] = (uint8_t) ((P1 & 0x00FF00000000) >> 32);
y[4] = (uint8_t) ((P1 & 0x0000FF000000) >> 24);
y[3] = (uint8_t) ((P1 & 0x000000FF0000) >> 16);
y[2] = (uint8_t) ((P1 & 0x00000000FF00) >>
;
y[1] = (uint8_t) (P1 & 0x0000000000FF);
while (HAL_I2C_Master_Transmit(&hi2c3, 0b11101000, (uint8_t *) &y, 7, 500) != HAL_OK) {
BSP_LCD_DisplayHStringAt(0, 20, "err wr 5340 filling", LEFT_MODE);
};
}

void saveReg5340A(void) {//ini 5340
char buf[20];
uint8_t x[2];//3
uint8_t y[2];
for (int i = 0; i < SI5340_REVD_REG_CONFIG_NUM_REGS; i++) {
x[0] = 0x01;
x[1] = (uint8_t) (si5340_revd_registers.address >>
;y[0] = (uint8_t) (si5340_revd_registers.address & 0x00ff);
y[1] = si5340_revd_registers.value;
if (i == 6) HAL_Delay(500);
while (HAL_I2C_Master_Transmit(&hi2c3, 0b11101000, (uint8_t *) &x, 2, 500) != HAL_OK) {
BSP_LCD_DisplayHStringAt(0, 20, "err wr 5340 page", LEFT_MODE);
};
//
// sprintf(buf, "%06d", i);
// BSP_LCD_DisplayHStringAt(0, 80, (uint8_t *)buf, LEFT_MODE);
while (HAL_I2C_Master_Transmit(&hi2c3, 0b11101000, (uint8_t *) &y, 2, 500) != HAL_OK) {
BSP_LCD_DisplayHStringAt(0, 20, "err wr 5340 filling", LEFT_MODE);
};
}
//N_PIBYP
x[0] = 0x01;
x[1] = 0x0A;
while (HAL_I2C_Master_Transmit(&hi2c3, 0b11101000, (uint8_t *) &x, 2, 500) != HAL_OK) {
BSP_LCD_DisplayHStringAt(0, 20, "err wr 5340 page", LEFT_MODE);
};
y[0] = 0x04;
y[1] = 0;
while (HAL_I2C_Master_Transmit(&hi2c3, 0b11101000, (uint8_t *) &y, 2, 500) != HAL_OK) {
BSP_LCD_DisplayHStringAt(0, 20, "err wr 5340 filling", LEFT_MODE);
};
//Write SOFT_RST = 1 (0x001C).
x[0] = 0x01;
x[1] = 0x00;
while (HAL_I2C_Master_Transmit(&hi2c3, 0b11101000, (uint8_t *) &x, 2, 500) != HAL_OK) {
BSP_LCD_DisplayHStringAt(0, 20, "err wr 5340 page", LEFT_MODE);
};
y[0] = 0x1c;
y[1] = 1;
while (HAL_I2C_Master_Transmit(&hi2c3, 0b11101000, (uint8_t *) &y, 2, 500) != HAL_OK) {
BSP_LCD_DisplayHStringAt(0, 20, "err wr 5340 filling", LEFT_MODE);
};
}
void si5340aSetFrequency_1(uint32_t freq) {
uint64_t num;
uint32_t denom=2147483648;
uint64_t pllFreq = 13200000000;
num=(uint64_t)(pllFreq*((float)denom/freq));
send5340(0x03, N0_NUM, N0_DEN, num, denom);
}
void send5340(uint8_t page, uint8_t reg, uint8_t reg_1, uint64_t P1, uint32_t P2) {
uint8_t x[2];
uint8_t y[7];
x[0] = 0x01;
x[1] = page;
while (HAL_I2C_Master_Transmit(&hi2c3, 0b11101000, (uint8_t *) &x, 2, 500) != HAL_OK) {
BSP_LCD_DisplayHStringAt(0, 20, "err wr 5340 page", LEFT_MODE);
};
y[0] = reg;
y[6] = (uint8_t) ((P1 & 0xFF0000000000) >> 40);
y[5] = (uint8_t) ((P1 & 0x00FF00000000) >> 32);
y[4] = (uint8_t) ((P1 & 0x0000FF000000) >> 24);
y[3] = (uint8_t) ((P1 & 0x000000FF0000) >> 16);
y[2] = (uint8_t) ((P1 & 0x00000000FF00) >>
;y[1] = (uint8_t) (P1 & 0x0000000000FF);
while (HAL_I2C_Master_Transmit(&hi2c3, 0b11101000, (uint8_t *) &y, 7, 500) != HAL_OK) {
BSP_LCD_DisplayHStringAt(0, 20, "err wr 5340 filling", LEFT_MODE);
};
}
ra0ahc — 9 июля 2019 г. в 06:32#83
Игорь, принимайте работу 
10мгц 20мгц и 17.....мгц
(холмики от БП)

10мгц 20мгц и 17.....мгц
(холмики от БП)
Relayer — 9 июля 2019 г. в 06:38#84
Вобщем покопался в мануале по диагонали. В reference manual (Si5341-40-D-RM.pdf) на 32й странице написано вот что
Цитировать7.2 Using the M Divider for DCO Applications
The VCO can be treated as a DCO by changing the value of the M feedback divider. By changing the M divider, all the output frequencies will change by the same amount in ppm. Changing the M divider is only valid for small changes in the output frequencies. Contact Silicon Labsfor assistance in the implementation of this capability.Собственно этот M-feedback задает коэф.деления в петле ФАПЧ и определяет на какой частоте работает ГУН. Так как ГУН у нас только один (в 5351 например их два) то сформировать с низким ФШ сигнал мы сможем только один (с целочисленным делителем в MultiSynth). Остальные частоты будут с более высоким уровнем ФШ т.к. придется использовать дробные делители.
Дальше в принципе все понятно. Для требуемой частоты выбираем целочисленный делитель (при этом ГУН на максимум надо выводить). При плавной перестройке меняем в небольших пределах делитель M - он всегда дробный. Вопрос в каком диапазоне вы его можем менять без ресета ФАПЧ и не будет ли там каких артефактов пока остается открытым
Цитировать7.2 Using the M Divider for DCO Applications
The VCO can be treated as a DCO by changing the value of the M feedback divider. By changing the M divider, all the output frequencies will change by the same amount in ppm. Changing the M divider is only valid for small changes in the output frequencies. Contact Silicon Labsfor assistance in the implementation of this capability.Собственно этот M-feedback задает коэф.деления в петле ФАПЧ и определяет на какой частоте работает ГУН. Так как ГУН у нас только один (в 5351 например их два) то сформировать с низким ФШ сигнал мы сможем только один (с целочисленным делителем в MultiSynth). Остальные частоты будут с более высоким уровнем ФШ т.к. придется использовать дробные делители.
Дальше в принципе все понятно. Для требуемой частоты выбираем целочисленный делитель (при этом ГУН на максимум надо выводить). При плавной перестройке меняем в небольших пределах делитель M - он всегда дробный. Вопрос в каком диапазоне вы его можем менять без ресета ФАПЧ и не будет ли там каких артефактов пока остается открытым
Игорь 2 — 9 июля 2019 г. в 06:55#85
Игорь, принимайте работу
По мусору - вполне, по фазовым шумам смотреть нужно, но получить их хуже -130 дБ/Гц, полагаю, вряд ли возможно, а этого хватит для моих синтезов...

А шаг какой получился? Полгерца есть?

ra0ahc — 9 июля 2019 г. в 07:29#86
0.0002гц
Игорь 2 — 9 июля 2019 г. в 07:32#87
Более чем...

ra0ahc — 9 июля 2019 г. в 07:34#88
Генератор легко меняет и плл и делители.
Владимир_К — 9 июля 2019 г. в 08:33#89
num=(uint64_t)(pllFreq*((float)denom/freq));
С Вашим кодом дает большую ошибку, а вот так:
num=(uint64_t)((float)pllFreq/(float)freq)*denom; получается правильный результат (хотя возможно чудит компилятор, такое с ним бывает...)
Все же проверьте калькулятором.. Причем не только в симуляторе дает ошибку, но и в железе.
ra0ahc — 9 июля 2019 г. в 08:40#90
Это уже исправленный вариант. В начале вообще приведение не делал так на 20 мгц ошибка 1 мгц была 
А так нормуль. Он uint переделал в float и поделил на uint , результат float. Ну частотомером проверял - все точно .
Вы запустили?

А так нормуль. Он uint переделал в float и поделил на uint , результат float. Ну частотомером проверял - все точно .
Вы запустили?
ra0ahc — 9 июля 2019 г. в 08:44#91
У вас ошибка
Uint64_t нужно весь результат приводить , а не только результат деления
Это у вас ошибка из-за округления в промежуточном результате будет . Так не стоит делать . Только итоговый результат нужно по итогу обрезать . Я кстати на калькуляторе прогнал и получил тот же num что сам буилдер посчитал
Uint64_t нужно весь результат приводить , а не только результат деления
Это у вас ошибка из-за округления в промежуточном результате будет . Так не стоит делать . Только итоговый результат нужно по итогу обрезать . Я кстати на калькуляторе прогнал и получил тот же num что сам буилдер посчитал
Relayer — 9 июля 2019 г. в 08:49#92
Генератор легко меняет и плл и делителиПри чем тут это? Использовать этот кипятильник только затем, чтобы дробными коэффициентами довести его до уровня 5351 - это нонсенс.
Владимир_К — 9 июля 2019 г. в 09:04#93
Uint64_t нужно весь результат приводить , а не только результат деленияВы что скобок не заметили? Подставьте не "круглое" значение. Я вводил несколько цифр частоты. Ведь по своей сути формулы абсолютно одинаковы. Но Вы делите маленькое число "denom" на частоту, которая почти равна ему, и здесь будет погрешность. И потом эту погрешность Вы умножаете на очень большое число. Вот скрин экрана симулятора с Вашей строкой. Прикиньте на калькуляторе. Частота задана 39000000.
А вот с исправленной строкой. Сравните результат..
ra0ahc — 9 июля 2019 г. в 09:07#94
я проверил у меня целочисленное использование генератор ставит.
* 0x0A04[4:0] N_PIBYP 1 0x01
Если нужно все коэфф менять то нужно ставить дробное.
Информация набирается.
ra0ahc — 9 июля 2019 г. в 09:08#95
Использовать этот кипятильник только затем
он теплый. правильная печатка и всё ок )))
ra0ahc — 9 июля 2019 г. в 09:09#96
У вас denom за пределами приведения к uint64
Хорошо. Я проверю. Делов то на 5 минут. Только попозже. Но так для справки - изменение num на 49000 даёт изменение выхода на 1 гц всего лишь.
Хорошо. Я проверю. Делов то на 5 минут. Только попозже. Но так для справки - изменение num на 49000 даёт изменение выхода на 1 гц всего лишь.
Владимир_К — 9 июля 2019 г. в 09:14#97
У вас denom за пределами приведения к uint64Не может он быть за пределами. Это не я его взял "с потолка". Это Clockbuilder выдал такое значение.
Все же такая погрешность меня смущает... Боюсь это компилятора глюки. Когда Atmel ушла от AVR Studio, сейчас ейной занимается Microsoft. Они заменили полностью компилятор, убрали поддержку Avrdude. В общем много неприятностей доставили. Конечно сейчас много новых, типа 5,6 7 версий, но там много свистопер...ок . Да и тормознутые.. А Вы в чем пишете для STM. Coocos?
ra0ahc — 9 июля 2019 г. в 09:17#98
Вы не поняли
Поставьте скобку не после деления а за denom)))) в вашем примере . Вы обрезали промежуточный результат а потом умножили его на denom
Поставьте скобку не после деления а за denom)))) в вашем примере . Вы обрезали промежуточный результат а потом умножили его на denom
ra0ahc — 9 июля 2019 г. в 09:27#99
Я пишу в CLion платный
Владимир_К — 9 июля 2019 г. в 09:31#100
Поставьте скобку не после деления а за denomПоставил и получил то же значение, что и с Вашей строкой и оно ошибочное. Ну ладно, не будем толочь воду. У нас разные среды, потому спор беспочвенный. Мне важно получить правильный результат.
Владимир_К — 9 июля 2019 г. в 09:32#101
Я пишу в CLion платныйНе, жаба давит..
Владимир_К — 9 июля 2019 г. в 09:51#102
Генератор легко меняет и плл и делители.То, что Вы выделили красным, это делители PLL, а оппонент очевидно (хотя не уверен) имел ввиду N-делитель.
Приведенное мной выражение в 77 посту не годится, а именно вот эти строки:
m_num = pllFreq/ m_denom; //Значение числителя делителя PLL.
num=(pllFreq/z)*denom; //Значение числителя N_NUM.
Это так, экспромтом выдал. Это годится для "красивых" чисел. Надо уходить от деления.. А так оно работает, но есть серьезная погрешность. И еще один момент учтите. При расчете делителей PLL однажды пропал сигнал. Частота PLL по расчету тогда была 13120000000, да плюс погрешность генератора. И думается мне, что я попал на частоту на которой генератор не запустился (нет захвата или что там может быть). Поэтому загрузил значение M_NUM и M_DEN напрямую. Может генератор вовсе не 80 мгц, а далеко, может погрешность при расчете коэффициентов. Возможно проще вычислить для каждого диапазона дельту для N_NUM. Потом ее прибавлять или вычитать от какой-то центральной частоты. В общем, пока не совсем очевиден путь. Кстати есть и еще один режим - увеличивать или уменьшать частоту в микросхеме можно дергая одну ногу...
ra0ahc — 9 июля 2019 г. в 09:53#103
В stm32 стоит сопроцессор для float. Исполнение мгновенное 18 тактов чтоли , а без fpu 800 тактов .
Ну смотрите по примеру что у вас :
Х=(Uint )(10.9)*10
И
X=(Uint)(10.9*10)
Есть разница ?
Ну смотрите по примеру что у вас :
Х=(Uint )(10.9)*10
И
X=(Uint)(10.9*10)
Есть разница ?
ra0ahc — 9 июля 2019 г. в 10:13#104
При расчете делителей PLL однажды пропал сигналЭто превышен ppm, там об этом написано что генерация срывается .
Я тут начитался.... при SOFT_RST вообще вся генерация срывается на короткий промежуток (щелчок будет если напрямую использовать без синтезатора)
Я тут провел эксперимент (пока в экселе) если изменять N0_NUM на одну единицу, Fout меняется на... 11999999,9999898Гц с 12МГц
Владимир_К — 9 июля 2019 г. в 10:37#105
Я тут начитался.... при SOFT_RST вообще вся генерация срываетсяТакие щелчки я наблюдал в синтезаторе на Si5351A. Там в библиотеке был Reset PLL. Когда его убрал щелчки прекратились, на работу синтезатора не повлияло.
ra0ahc — 9 июля 2019 г. в 10:52#106
Владимир, я не могу понять, NUM в каких пределах менять можно? 0..44бит? Тогда Fout может от 0.1..13.5ГГц при изменении только NUM и при этом NUM не должна быть меньше чем 10*DEN
Relayer — 9 июля 2019 г. в 10:58#107
Такие щелчки я наблюдал в синтезаторе на Si5351A. Там в библиотеке был Reset PLL. Когда его убрал щелчки прекратились, на работу синтезатора не повлияло.PLL надо ресетить если меняется коэф. деления в петле PLL. Если меняется выходной делитель - то не надо. Поэтому код должен быть "умным" и ресетить PLL только тогда кода надо (у меня для 5351 и 570 к примеру так и сделан��)
оппонент очевидно (хотя не уверен) имел ввиду N-делительДа, оменно о нем и идет речь. Он должен быть целочисленный
Владимир_К — 9 июля 2019 г. в 11:29#108
Владимир, я не могу понять, NUM в каких пределах менять можно? 0..44бит?Да нет, почему только 0..44. Сколько угодно в пределах разрядности числа. Главное не уйти от частоты на которой способен генерить PLL. То есть, это зависит от тактовой частоты. Исходя из нее надо считать делитель так чтобы частота на выходе PLL, была где-то в районе 13200000000 (честно говоря я не нашел в даташите сколько точно и в каких пределах, но кто-то на CQHam вроде привел цифры 10%, но мне кажется это много). Короче говоря, я нигде не видел, чтобы было сказано, что частота PLL, была например 14000000000....12000000000. Ну и еще. Как я понял из даташита, нельзя резко менять частоту PLL. То есть при однократном изменении на 250 pmm и более. Для захвата нужно время, хотя не знаю, что там за структура. Скорее обычный LC? Опять же -есть такое понятие как полоса захвата (если к этой структуре ее можно прицепить, хотя наверно можно...)
Как я писал выше, с рассчитанной программой частотой PLL 13120000000 сигнала на выходе не было. То есть, очевидно я ушел в сторону. Может из-за частоты кварцевого генератора. В Si5351A таких случаев не было, там работа генератора была возможна от 600 до 900 мгц, то есть пределы большие были.
надо наверное поиграться с программой ClockBuilder. Что он там выдает, при разных заданных значениях?
В м/с есть еще одна фишка - мониторинг узлов (например LOS XAXB, то есть отсутствие тактовой частоты на входе фазового детектора). Таким образом, можно запрограммировать микросхему так, что она будет выдавать признак (флаг) в регистре, где именно пропал сигнал. Причем можно вывести не только в регистр (мне проще туда, так как дорожки от нужного вывода у меня на плате нет), но и на ножку микросхемы. Но это я особенно не изучал. Так мельком. Думал воспользоваться если не будет выхода, но оно не понадобилось. Да и так времени много уходит. Я не могу заниматься программированием ради самого программирования. Хотя это занимательно, но не более того.
ra0ahc — 9 июля 2019 г. в 11:57#109
Минутку, давайте разберемся.
Там два вида регистров,
пара за ПЛЛ отвечает (если не прав поправьте) это:
* 0x0235[43:0] M_NUM 283467841536 0x04200000000
* 0x023B[31:0] M_DEN 2147483648 0x80000000
А есть регистры делителя:
* 0x0302[43:0] N0_NUM 1181116006400 0x11300000000
* 0x0308[31:0] N0_DEN 2147483648 0x80000000
ПЛЛ выставили разок и всё, пусть стоит.
А вот с N0_NUM стоит поиграться. (он 44 бита) и N0_DEN (32 бита)
Frequency Plan
* ==============
* Priority: OUT0 is lowest jitter output
*
* Fpfd = 100 MHz
* Fvco = 13.2 GHz [ 13 + 1/5 GHz ] <--- это M_NUM, M_DEN
* Fms0 = 24 MHz
*
* P dividers:
* P0 = Unused
* P1 = Unused
* P2 = 1
* P3 = Unused
* Pxaxb = Unused
*
* M = 132 <---- это что за хрень
* N dividers:
* N0:
* Value: 550 <-это походу N0_NUM/N0_DEN
* Skew: 0.000 s
* OUT0: 12 MHz
* N1:
* Unused
* N2:
* Unused
* N3:
* Unused
*
* R dividers:
* R0 = 2 <- это выходной делитель (классная штука для синта)
* R1 = Unused
* R2 = Unused
* R3 = Unused
*
Там два вида регистров,
пара за ПЛЛ отвечает (если не прав поправьте) это:
* 0x0235[43:0] M_NUM 283467841536 0x04200000000
* 0x023B[31:0] M_DEN 2147483648 0x80000000
А есть регистры делителя:
* 0x0302[43:0] N0_NUM 1181116006400 0x11300000000
* 0x0308[31:0] N0_DEN 2147483648 0x80000000
ПЛЛ выставили разок и всё, пусть стоит.
А вот с N0_NUM стоит поиграться. (он 44 бита) и N0_DEN (32 бита)
Frequency Plan
* ==============
* Priority: OUT0 is lowest jitter output
*
* Fpfd = 100 MHz
* Fvco = 13.2 GHz [ 13 + 1/5 GHz ] <--- это M_NUM, M_DEN
* Fms0 = 24 MHz
*
* P dividers:
* P0 = Unused
* P1 = Unused
* P2 = 1
* P3 = Unused
* Pxaxb = Unused
*
* M = 132 <---- это что за хрень
* N dividers:
* N0:
* Value: 550 <-это походу N0_NUM/N0_DEN
* Skew: 0.000 s
* OUT0: 12 MHz
* N1:
* Unused
* N2:
* Unused
* N3:
* Unused
*
* R dividers:
* R0 = 2 <- это выходной делитель (классная штука для синта)
* R1 = Unused
* R2 = Unused
* R3 = Unused
*
Владимир_К — 9 июля 2019 г. в 12:06#110
* M = 132 <---- это что за хреньM_NUM/M_DEN=132
ra0ahc — 9 июля 2019 г. в 12:16#111
Или Fvco/xtal=13200000000/100000000=132
ra0ahc — 9 июля 2019 г. в 12:23#112
Вот нашел !
Допустимый диапазон N делителей - от 10 до 4095, а значение N делителя = N_NUM / N_DEN, где N_NUM - 44-битное значение, а N_DEN - 32-битное значение.
вот здесь и должно быть целочисленное деление.
Допустимый диапазон N делителей - от 10 до 4095, а значение N делителя = N_NUM / N_DEN, где N_NUM - 44-битное значение, а N_DEN - 32-битное значение.
вот здесь и должно быть целочисленное деление.
Владимир_К — 9 июля 2019 г. в 12:46#113
А вы предлагаетеА Вы что предлагаете? Пример в студию
ra0ahc — 9 июля 2019 г. в 12:49#114
воооооот уже что-то
это значит, что в целочисленном изменении шаг может быть (от 10 до 4096 = NUM/DEN) 2178Гц -что очень мало. Теперь надо добавить R выходной делитель. Номер не пройдет, не хватит стартовой частоты чтобы сделать изменения хотя бы на 2Гц выходными делителями.
В принципе у меня нет цели сделать чистый сигнал ведь у нас опора для синта, а там ...пофиг на фазовый шум и палки.
А если замарочится и сделать чистый сигнал то придется двигать плл, а там что-то с калибровкой....300мс (может и не надо его калибровать) но SOFT_RST придется делать, а он останавливает генерацию.
Короче своеобразный тупик. Хотя если всетаки менять плл то можно все красиво сделать ...наверное.
это значит, что в целочисленном изменении шаг может быть (от 10 до 4096 = NUM/DEN) 2178Гц -что очень мало. Теперь надо добавить R выходной делитель. Номер не пройдет, не хватит стартовой частоты чтобы сделать изменения хотя бы на 2Гц выходными делителями.
В принципе у меня нет цели сделать чистый сигнал ведь у нас опора для синта, а там ...пофиг на фазовый шум и палки.
А если замарочится и сделать чистый сигнал то придется двигать плл, а там что-то с калибровкой....300мс (может и не надо его калибровать) но SOFT_RST придется делать, а он останавливает генерацию.
Короче своеобразный тупик. Хотя если всетаки менять плл то можно все красиво сделать ...наверное.
Владимир_К — 9 июля 2019 г. в 12:57#115
Допустимый диапазон N делителейЯ это не заметил.. Ну для наших целей вполне.. 13200000000/10 = 1320000000, или 1320 мгц, вряд ли понадобится, да и микросхема не выдаст. 13200000000/4095=примерно 3,2 мгц. То же нормально, а если много, есть еще R.
быть целочисленное деление.Ну давайте прикинем..
Например надо 21,0 мгц. 13200000000/21000000=628 с копейками. Если возьмем 628, то частота на выходе будет 13200000000/628=21,019,108 мгц. Устроит 19 кгц уход в сторону? Попробуем 629, имеем 13200000000/629= 20,985,691. Те же 15 кгц. Так что придется объявить конкурс на лучшее решение. В качестве приза - пиво, виртуальное
.Владимир_К — 10 июля 2019 г. в 08:35#116
Есть разница ?Да, согласен.. Но у меня тут еще хуже ситуация. По моей формуле считает не правильно. Тут Вы правы. Цифра, которую считает компьютер - 725849473024, а должно быть 726840619323. А по Вашей формуле, выдает вообще 549755813760. Причем, число это какое-то заколдованное. Задал другую частоту - изменил на 500 кгц, а цифра эта осталась неизменной. Вот я и устроил полемику.. Вчера провозился часа три, так ничего и не добился. Примерно такая же формула (как Ваша) присутствует в расчете для Si5351A. И там мой компилятор выдает верный результат. Хрень какая-то..
ra0ahc — 10 июля 2019 г. в 08:48#117
Разбейте на переменные. Тогда точно ошибки не будет.
Владимир_К — 11 июля 2019 г. в 08:25#118
У вас denom за пределами приведения к uint64Именно так.. Я ошибочно посчитал, что в Си для AVR есть два формата чисел с плавающей запятой. Float и double. Вот тут например информация:
https://avrlab.com/node/35
Но это оказалось вовсе не так. Случайно при пошаговой отладке в окне со значениями переменных увидел, что и Double и Float в AVR Studio занимают 4 байта. Понятно, что из 4 байтов (32 бита) 44- разрядное число никак не получится. Потом еще где-то нашел, что в этом компиляторе эти форматы равноценны.
Но то уже мелочи. Покумекаю, если нормального решения не найду, перенесу программу на STM32. Валяется модуль от китайцев..
ra0ahc — 12 июля 2019 г. в 09:57#119
Посмотрите, есть у вас такая библиотека
#include <stdint-gcc.h>
она отвечает за размерность переменных.
А вообще нам такая точность не нужна. Там 4 знак после запятой Гц получается на единицу. Поэтому и 4 байта тоже хватит разрядности (в разумных пределах).
Если есть сомнения ставите long.... один пример не тормазнет систему.
#include <stdint-gcc.h>
она отвечает за размерность переменных.
А вообще нам такая точность не нужна. Там 4 знак после запятой Гц получается на единицу. Поэтому и 4 байта тоже хватит разрядности (в разумных пределах).
Если есть сомнения ставите long.... один пример не тормазнет систему.
ra0ahc — 12 июля 2019 г. в 11:00#120
Под синтезатор Игоря (деление на 4) . Это значит, что выходная частота на сишке будет в 4 раза ниже нормальной частоты- это в пределах 10..20 МГц на сишке
Функции выглядят так.....
void saveReg5340A(void) {//ini 5340
// char buf[20];
for (int i = 0; i < SI5340_REVD_REG_CONFIG_NUM_REGS; i++) {
if (i == 6) HAL_Delay(500);
sendByte5340(si5340_revd_registers.address,si5340_revd_registers.value);
}
//N_PIBYP - дробный режим
sendByte5340(0x0A04,0);
//Write SOFT_RST = 1 (0x001C). -ресет
sendByte5340(0x001c,1);
//выходной делитель
//The R dividers are with the output drivers and are even integer dividers.
//0x024A-0x024C R0 Divider
//24-bit Integer Number. Divide value = (R0_REG+1) x 2 !!!!!!!!!
//To set R0 = 2, set OUT0_RDIV_FORCE2 = 1, and then the R0_REG value is irrelevant.
//Setting R0_REG=0 will disable the divider.
//Write SOFT_RST = 1 (0x001C). -ресет
// 0x0108 bit-2 R/W
// OUT0_RDIV_FORC E2
// 0 R0 divider value is set by R0_REG
// 1 R0 divider value is forced into divide by 2
//при деление на 2 :
// * 0x0112[0] OUT0_PDN 0 0x0 Output driver 0: 0 to power up the driver, 1 to power down the driver. Clock outputs will be weakly pulled- low.
// * 0x0112[1] OUT0_OE 1 0x1 Output driver 0: 0 to disable the output, 1 to enable the output
// * 0x0112[2] OUT0_RDIV_FORCE2 1 0x1
// при делении на 4 и выше OUT0_RDIV_FORCE2 =0, R0_REG=1......
//по этой формуде Divide value = (R0_REG+1) x 2
//ставим делитель на 4
// * 0x0112[2] OUT0_RDIV_FORCE2=2
sendByte5340(0x0112,0);
//0x024A R0_REG=1
sendByte5340(0x024a,1);
}
void si5340aSetFrequency(uint32_t freq) {
uint64_t num;
uint32_t denom = 2147483648;
uint64_t pllFreq = 13200000000;
num = (uint64_t) ((double)denom * ((float) pllFreq / freq));
send5340(0x03, N0_NUM, num);
}
void send5340(uint8_t page, uint8_t reg, uint64_t P1) {
uint8_t x[2];
uint8_t y[7];
x[0] = 0x01;
x[1] = page;
while (HAL_I2C_Master_Transmit(&hi2c3, 0b11101000, (uint8_t *) &x, 2, 500) != HAL_OK) {
BSP_LCD_DisplayHStringAt(0, 20, "err wr 5340 page", LEFT_MODE);
};
y[0] = reg;
y[6] = (uint8_t) ((P1 & 0xFF0000000000) >> 40);
y[5] = (uint8_t) ((P1 & 0x00FF00000000) >> 32);
y[4] = (uint8_t) ((P1 & 0x0000FF000000) >> 24);
y[3] = (uint8_t) ((P1 & 0x000000FF0000) >> 16);
y[2] = (uint8_t) ((P1 & 0x00000000FF00) >>
;
y[1] = (uint8_t) (P1 & 0x0000000000FF);
while (HAL_I2C_Master_Transmit(&hi2c3, 0b11101000, (uint8_t *) &y, 7, 500) != HAL_OK) {
BSP_LCD_DisplayHStringAt(0, 20, "err wr 5340 filling", LEFT_MODE);
};
}
void sendByte5340(uint16_t add, uint8_t val){
uint8_t x[2];
uint8_t y[2];
x[0] = 0x01;
x[1] = (uint8_t)(add>>
; //page
while (HAL_I2C_Master_Transmit(&hi2c3, 0b11101000, (uint8_t *) &x, 2, 500) != HAL_OK) {
BSP_LCD_DisplayHStringAt(0, 20, "err wr 5340 page", LEFT_MODE);
};
y[0] = (uint8_t)(add & 0xff); //adress
y[1] = val; // value
while (HAL_I2C_Master_Transmit(&hi2c3, 0b11101000, (uint8_t *) &y, 2, 500) != HAL_OK) {
BSP_LCD_DisplayHStringAt(0, 20, "err wr 5340 filling", LEFT_MODE);
};
}
Функции выглядят так.....
void saveReg5340A(void) {//ini 5340
// char buf[20];
for (int i = 0; i < SI5340_REVD_REG_CONFIG_NUM_REGS; i++) {
if (i == 6) HAL_Delay(500);
sendByte5340(si5340_revd_registers.address,si5340_revd_registers.value);
}
//N_PIBYP - дробный режим
sendByte5340(0x0A04,0);
//Write SOFT_RST = 1 (0x001C). -ресет
sendByte5340(0x001c,1);
//выходной делитель
//The R dividers are with the output drivers and are even integer dividers.
//0x024A-0x024C R0 Divider
//24-bit Integer Number. Divide value = (R0_REG+1) x 2 !!!!!!!!!
//To set R0 = 2, set OUT0_RDIV_FORCE2 = 1, and then the R0_REG value is irrelevant.
//Setting R0_REG=0 will disable the divider.
//Write SOFT_RST = 1 (0x001C). -ресет
// 0x0108 bit-2 R/W
// OUT0_RDIV_FORC E2
// 0 R0 divider value is set by R0_REG
// 1 R0 divider value is forced into divide by 2
//при деление на 2 :
// * 0x0112[0] OUT0_PDN 0 0x0 Output driver 0: 0 to power up the driver, 1 to power down the driver. Clock outputs will be weakly pulled- low.
// * 0x0112[1] OUT0_OE 1 0x1 Output driver 0: 0 to disable the output, 1 to enable the output
// * 0x0112[2] OUT0_RDIV_FORCE2 1 0x1
// при делении на 4 и выше OUT0_RDIV_FORCE2 =0, R0_REG=1......
//по этой формуде Divide value = (R0_REG+1) x 2
//ставим делитель на 4
// * 0x0112[2] OUT0_RDIV_FORCE2=2
sendByte5340(0x0112,0);
//0x024A R0_REG=1
sendByte5340(0x024a,1);
}
void si5340aSetFrequency(uint32_t freq) {
uint64_t num;
uint32_t denom = 2147483648;
uint64_t pllFreq = 13200000000;
num = (uint64_t) ((double)denom * ((float) pllFreq / freq));
send5340(0x03, N0_NUM, num);
}
void send5340(uint8_t page, uint8_t reg, uint64_t P1) {
uint8_t x[2];
uint8_t y[7];
x[0] = 0x01;
x[1] = page;
while (HAL_I2C_Master_Transmit(&hi2c3, 0b11101000, (uint8_t *) &x, 2, 500) != HAL_OK) {
BSP_LCD_DisplayHStringAt(0, 20, "err wr 5340 page", LEFT_MODE);
};
y[0] = reg;
y[6] = (uint8_t) ((P1 & 0xFF0000000000) >> 40);
y[5] = (uint8_t) ((P1 & 0x00FF00000000) >> 32);
y[4] = (uint8_t) ((P1 & 0x0000FF000000) >> 24);
y[3] = (uint8_t) ((P1 & 0x000000FF0000) >> 16);
y[2] = (uint8_t) ((P1 & 0x00000000FF00) >>
;y[1] = (uint8_t) (P1 & 0x0000000000FF);
while (HAL_I2C_Master_Transmit(&hi2c3, 0b11101000, (uint8_t *) &y, 7, 500) != HAL_OK) {
BSP_LCD_DisplayHStringAt(0, 20, "err wr 5340 filling", LEFT_MODE);
};
}
void sendByte5340(uint16_t add, uint8_t val){
uint8_t x[2];
uint8_t y[2];
x[0] = 0x01;
x[1] = (uint8_t)(add>>
; //pagewhile (HAL_I2C_Master_Transmit(&hi2c3, 0b11101000, (uint8_t *) &x, 2, 500) != HAL_OK) {
BSP_LCD_DisplayHStringAt(0, 20, "err wr 5340 page", LEFT_MODE);
};
y[0] = (uint8_t)(add & 0xff); //adress
y[1] = val; // value
while (HAL_I2C_Master_Transmit(&hi2c3, 0b11101000, (uint8_t *) &y, 2, 500) != HAL_OK) {
BSP_LCD_DisplayHStringAt(0, 20, "err wr 5340 filling", LEFT_MODE);
};
}
Владимир_К — 14 июля 2019 г. в 09:10#121
Для требуемой частоты выбираем целочисленный делитель (при этом ГУН на максимум надо выводить). При плавной перестройке меняем в небольших пределах делитель M - он всегда дробный. Вопрос в каком диапазоне вы его можем менять без ресета ФАПЧ и не будет ли там каких артефактов пока остается открытымПопробовал сегодня такой алгоритм.. Делитель N вычисляется также как и в библиотеке для Si5351A.
Т.е.
divider = pllFreq/freq; // PLL freq, принимаю равным 13200 MHz
if ((divider & 1) != 0) divider--; // Здесь делитель делаю четным. Это делитель N.
pllFreq = divider * freq; // Определяю новую pllFreq. Она меняется в небольших пределах, обусловлено это округлением делителя. При этом делитель всегда целочисленный
Затем в программу ввел инкремент частоты каждый раз на 1 кгц, То есть что-то вроде ГКЧ. При изменении частоты от 30 мгц до 40 мгц на экране осциллографа картинка не стабильна. В начале развертки видно, что частота устанавливается с задержкой. В целом картинка как и при наблюдении сигнала с ГКЧ, но в начале есть какие-то неприятные моменты. Похоже, что захват частоты происходит с задержкой. Печально это, но сдается мне, такой вариант не годится. Так это всего 1 кгц. Скорее всего PLL дергать нельзя. Сейчас попробую менять частоту только N- делителем, не трогая PLL.
Есть хорошая новость и плохая..

Хорошая, это та, что при изменении частоты только делителем N, не трогая PLL, картинка на моем осциллографе также дергается в начале развертки.
Плохая - придется искать причину
. Надо бы конечно, засинхронизировать развертку от стороннего генератора. Самый раз было бы от опорника 80 мгц, но плата уже покрыта лаком и ковырять не хочется.. В процессе изготовления второй вариант, с задающим генератором на небуферированной логике (sgk рекомендовал), продолжу эксперимент на ней. И еще одна ложка дегтя.. Перестройка по частоте от 30 мгц до 40 мгц, с шагом 10 кгц происходит за 8 сек примерно. То есть расчет частоты и запись в регистры составляет примерно 8 ms. Это много, по сравнению с тем, что было на Si5351A. Надо что-то серьезно менять.
Хотя и возможностей не мало. Первое - PLL можно вообще никогда не менять, только при включении. Знаменатели делителей можно считать и загонять в регистры только при смене диапазона.. Сейчас это происходит при каждом шаге.
Владимир_К — 14 июля 2019 г. в 10:36#122
Relayer — 14 июля 2019 г. в 11:08#123
Срыв генерации лучше всего смотреть на цифровом ослике при очень медленной развертке делать стопкадр и растягивать анализируя переходной процесс уже в статике. Если ослик аналоговый то тут будет сложно имхо. Можно попробовать прослушать генерируемый сигнал на приемник - при срывах генерации по идее будут артефакты в виде щелчков и тп
ra0ahc — 15 июля 2019 г. в 10:57#124
В даташите на эту сишку написано, что при изменении NUM только на очень больших перестройках может немного фаза сбиваться, а так -это самый классный режим для изменения частоты без щелчков.
ra0ahc — 15 июля 2019 г. в 10:59#125
картинка на моем осциллографе также дергается в начале развертки.мне кажется это проблемы синхронизации "ослика" ))) ,а не сишки
Владимир_К — 15 июля 2019 г. в 11:49#126
В даташите на эту сишку написано, что при изменении NUM только на очень больших перестройках может немного фаза сбиватьсяЯ пробовал два варианта. Картинка на осциллографе одинаковая, поэтому, скорее всего это осциллограф.
мне кажется это проблемы синхронизации "ослика"Да там даже дело не в синхронизации. Там в начале развертки видно, что меняется скорость развертки (или частота на входе осциллографа). Но, скорее всего, это нестабильна скорость развертки в самом начале, после запуска. Может банальные пульсации питания. Осциллограф уже с почтенным возрастом.
В общем, на сегодня основная задача - ускорить работу программы.
Владимир_К — 19 ноября 2019 г. в 04:37#127
А кто-нибудь может что-нибудь умное задвинуть по поводу SI5351, как там валкодер прицепитьЯ бы посоветовал Вам купить простенькую Ардуино Nano. Вот такую например:
https://ru.aliexpress.com/item/33007308914.html?spm=a2g0o.productlist.0.0.54311a9b1SSMcS&s=p&algo_pvid=4c5c1c1a-00e1-4c4d-9b52-9176d1719104&algo_expid=4c5c1c1a-00e1-4c4d-9b52-9176d1719104-4&btsid=76646f13-d381-4b1c-9815-5c7b3752a466&ws_ab_test=searchweb0_0,searchweb201602_7,searchweb201603_52
Конечно не в Китае, долго добираться будет..
Почему именно ее? Плата имеет на "борту" преобразователь СН340, таким образом обычным USB шнурком Вы соединяете ее с компом и загружаете файл прошивки в контроллер (там Atmega 328P). Вам только надо найти в сети драйвер для СН340, ссылку, при необходимости, я дам, и программу Xloader. С помощью этой программы Вы будете прошивать Ваш контроллер. Тут все просто, открываете файл прошивки в программе Xloader, жмете кнопочку и все... А файл прошивки я Вам сброшу, в ближайшее время, только лишнее уберу из программы, индикатор, кнопки и пр. Хотя это не обязательно, оно и так будет работать. Но надо изменить шаг, сейчас 1гц. Тут надо лезть в программу. Так как 1 гц это целое число, а 0,5 уже float. Можно проще - менять частоту не в пределах 10-20 мгц, а 20-40 Мгц и поделить триггером. Хотя, пардон
, поделить можно и в Si5351A, там на выходе делители есть..Вот например синтезатор простенький. Оставляем только валкодер..
Игорь 2 — 19 ноября 2019 г. в 04:57#128
Я бы посоветовал
Интересная мысль. А индикатор нужно отдельно покупать? Какой?
Зависов и щелчков при перестройке нет?
Владимир_К — 19 ноября 2019 г. в 04:58#129
Кстати, вроде есть Ардуино, которые питаются от 3,3 вольта (на плате вместо 5,0 вольтового стабилизатора установлен 3,3 вольтовый. тогда не надо заморачиваться с преобразованием уровней и 2N7002 не нужны. Обычными делителями на резисторах тут не обойтись, по шине SDA обмен в обоих направлениях.
Владимир_К — 19 ноября 2019 г. в 05:04#130
Какой?Если он Вам нужен - любой двухстрочный на контроллере HD44780. Они почти все именно с этим контроллером, но иногда попадается другой..
Вот примерно такой.
https://ru.aliexpress.com/item/32897651120.html?spm=a2g0o.productlist.0.0.156b2b04BwNEWJ&s=p&algo_pvid=6c7d088c-ea0f-40d1-b50c-3b1ab1498b0d&algo_expid=6c7d088c-ea0f-40d1-b50c-3b1ab1498b0d-3&btsid=628f5ea9-01be-419f-907f-63c42945f509&ws_ab_test=searchweb0_0,searchweb201602_7,searchweb201603_52
Владимир_К — 19 ноября 2019 г. в 05:07#131
Зависов и щелчков при перестройке нет?Нет, ничего такого я не замечал.. Но валкодеры у меня все оптические, честно говоря с механикой я не пробовал. Там дребезг, в программе я не боролся с ним, но, как правило пару конденсаторов это устраняют.
Пока не забыл.. Если Ардуино будет 3,3 вольтовый, надо озаботиться, чтобы и индикатор такой был (если они есть такие, из двухстрочных).
Игорь 2 — 19 ноября 2019 г. в 05:09#132
Кстати, вроде есть Ардуино, которые питаются от 3,3 вольта
Да, это интересней....

Игорь 2 — 19 ноября 2019 г. в 05:10#133
Но валкодеры у меня все оптические
Да механику никто и не собирается ставить, прекрасно знаю, что это такое - портативки приходилось разрабатывать.

Владимир_К — 19 ноября 2019 г. в 05:18#134
это интереснейДа, но надо уточнить (я писал "вроде есть"), есть ли они? Там может быть проблема в том, что тактовая частота 16 мгц для контроллера 16 мгц (это вроде обусловлено связью с компом), будет ли контроллер работать от 3,3 вольта с тактом 16 мгц.
Ну вот.. есть и на 3,3 вольта. Кварц на плате 8 мгц. Но, к сожалению эта плата не имеет преобразовалеля USB. Для ее прошивки нужна дополнительная "примочка"
https://ru.aliexpress.com/item/32413050538.html?scm=1007.23534.124000.0&pvid=c6514ec0-a089-4373-a0d2-f22f98fc9175&rmsg=do_not_replacement&aff_platform=api&cpt=1574173850280&sk=3tWOnpAs&aff_trace_key=fccb3f95aa4e4339898382a77d9cae15-1574173850280-06980-3tWOnpAs&terminal_id=7ad9a07f406141b99ddd7113c9216653
Игорь 2 — 19 ноября 2019 г. в 05:26#135
Ладно, думаю... 

Игорь 2 — 19 ноября 2019 г. в 09:44#136
А кто-нибудь может что-нибудь умное задвинуть по поводу SI5351, как там валкодер прицепить, чтобы через полгерца шагала в диапазоне 10...20 МГц? 
И реально ли это вообще сделать, в смысле полгерца?
Это в связи вот с этим http://analogtrx.com/SMF/index.php?topic=6.msg6199#msg6199

И реально ли это вообще сделать, в смысле полгерца?
Это в связи вот с этим http://analogtrx.com/SMF/index.php?topic=6.msg6199#msg6199
RadioPapa — 19 ноября 2019 г. в 10:41#137
Конечно можно! Ессно нужен МК , ну и перестройка возможна до 14097100,01, получается до сотки
единственно посмотреть по делителям, какой шаг они могут дать. Но 1.46гц разницы между двумя частотами я получаю,при установке кварца 27мгц
единственно посмотреть по делителям, какой шаг они могут дать. Но 1.46гц разницы между двумя частотами я получаю,при установке кварца 27мгцИгорь 2 — 19 ноября 2019 г. в 12:17#138
Но 1.46гц разницы между двумя частотами я получаю,при установке кварца 27мгц
У меня сейчас 25 МГц, но, полагаю, сути это не меняет. А 1.47 Гц шаг при какой синтезируемой частоте?

ra0ahc — 20 декабря 2019 г. в 01:09#139
С 5 вольт на 3.3 и с 3.3 на 1.8 в ничего не греется . Греется очень сильно с 12 на 5 вольт.
veso74 — 20 декабря 2019 г. в 09:33#140
Сколько реальное потребление чипа Si5340 по 3,3V и 1,8 шинах?
Задумал 12V->5V(Arduino)->3,3V->1,8V, но по корпус SOT-223 нисковольных стаб. (выход
) вероятно придется припоять объемный радиатор, как продолжение шины.
Total Power Dissipation Pd Si5340 - 680 .. 875 mW
Задумал 12V->5V(Arduino)->3,3V->1,8V, но по корпус SOT-223 нисковольных стаб. (выход
) вероятно придется припоять объемный радиатор, как продолжение шины.Total Power Dissipation Pd Si5340 - 680 .. 875 mW
ra0ahc — 20 декабря 2019 г. в 11:18#141
340 ма
veso74 — 20 декабря 2019 г. в 11:20#142
tnx, Сергей
.
А на двух шинах отдельно возможно измерить?
Нагревается ли стаб? Вероятно да ..., а кроме 1117 не нахожу другие скоро.
Будут конструктивные трудности у меня, я знаю с сначала ... трудности начались с поиска переходной плати, неточный заказ с моей стороны, затем с пайки ...
44 вывода на 7 по 7 мм ...
.А на двух шинах отдельно возможно измерить?
Нагревается ли стаб? Вероятно да ..., а кроме 1117 не нахожу другие скоро.
Будут конструктивные трудности у меня, я знаю с сначала ... трудности начались с поиска переходной плати, неточный заказ с моей стороны, затем с пайки ...
44 вывода на 7 по 7 мм ...Владимир_К — 20 декабря 2019 г. в 11:54#143
Будут конструктивные трудности у меня, я знаю с сначала ... трудности начались с поиска переходной плати, неточный заказ с моей стороны, затем с пайкиПервая плата м��я была неудачной. Грелась сильно, так как размеры были маленькие. Я ее сделал практически по размерам модуля с Si5351A, который купил у QRP LAB. Делал так, чтобы просто заменить платы в трансивере. Сейчас плату переделал. Вы можете воспользоваться файлом в Layout и доработать. Но, конечно, надо бы заводскую плату.. И паять наверное удобнее феном.
veso74 — 20 декабря 2019 г. в 12:17#144
Вы можете воспользоваться файлом в Layout и доработать. Но, конечно, надо бы заводскую плату.. И паять наверное удобнее феном.Да, спасибо, есть в Вашем архиве
. А платы уже не делаю, ни хим. реакт. есть, ни желание :PP Платы делаю только "резаком" - микро-дрель и сверло 0,5-0,7 мм, для теста и для удовольствия. А заводские платы хороши, но не "мой путь" в хобби
.Цитировать.. Грелась сильно, так как размеры были маленькие....Я не раз смотрел фотографии, думал даже меньше размером. Я буду иметь в виду. Мне нравятся мосты на нижней стороне и разрезанный квадрат для теплопередача. Будем копировать идеи
. Только чип через адаптер припоен, но металлизация есть хорошая.Владимир_К — 20 декабря 2019 г. в 12:58#145
Мне нравятся мосты на нижней стороне и разрезанный квадрат для теплопередача.Там на фотографии мосты выполнены проволочками. На второй плате - просто 2 полоски жести, согнутая под прямым углом. Так удобнее и красивее. Но, конечно лучше на такой плате как на Вашей фотографии. Но я в наших магазинах не нашел..
lamobot — 21 декабря 2019 г. в 02:40#146
А в чем смысл всех этих si перед dds ad98/99? Возможно я что-то пропустил.
rtty — 21 декабря 2019 г. в 04:49#147
А в чем смысл всех этих si
5351 очень дешева и получше ад98хх.
5340 дорогая и в неудобном для наколенных плат и паяльников корпусе, но лучше 5351 или ад98. Лучше ли 5340, чем ад99хх - вроде прямо никто пока не сравнил.
Relayer — 21 декабря 2019 г. в 06:22#148
Есть 570я которая и доставабельна и програмить ее просто. Да и опыт эксплуатации наработа приличный
Владимир_К — 21 декабря 2019 г. в 11:49#149
Есть 570я которая и доставабельнаSi5340A мне прислали Silab, совершенно бесплатно, курьер домой принес. Поэтому и возник к ней интерес. Si570, в использовании конечно проще, но ее у меня нет.
veso74 — 8 апреля 2020 г. в 11:08#150
Я также хвастаюсь
:
И мой модуль с Si5340A заработал (ур-р-ра, "большая борьба" была с SMD корпусом 44QFN!
).
Для експеримента: с SMD-кварцевым резонатором 25 MHz, TSX-3225, для универсальности: с I2C 5V/3,3V конвертер.
Не обошлось без ошибок:
- неправильное подключение питания (5V-3,3V-1,8V-GND я включил как GND-1,8V-3,3V-5V!). Наверное из-за мое последовательно добавленого (защитного) резистора, я перестал уменьшать его значение до 13 Ом и чип "выжил"
.
- после 2 дня тестов без ответа по I2C (i2c_scanner) (hi!
думал уже, что чип "сгорел" из-за ошибки питания), но перепаял с большим количеством флюсов. Чип начал отвечать по адресу 0x74 (А1 = GND, А0 = GND).
Сегодня добавил управление: Arduino UNO: на данный момент загрузка 326 регистров из файла Si5340-RevD-Registers.h, сгенерирован с помощью ClockBuilder-Pro для кварц к XA-XB (XTAL = 25 MHz), один выход (OUT0 = 10 MHz). На сегодня экспериментировал только с добавлением коррекции кварцевого кристалла (reg. 0x0205..0x0202).
Ток: 12V (через диод): 260 mA (+ Arduino UNO), радиатор нормально тёплый, могу держать там свои пальцы.
---
Мой вопрос (в частности: к Владимир_К) для последующего написания кода:
Владимир, как Вы уменьшили количество регистров до 27 при инициализации?
(напр. из ClockBuilder-Pro для одна частота есть 326 регистров). Это где-то задокументировано? Пример из нета есть (для инициализации)?
Я могу выбирать в инициализации только те регистри, которые нужны напр. с тестами, но хочу сократить варианты (могу преписать Ваши, но "буквальное переписывание" данни - не "мой путь". А что каждая строка в документации должна быть проанализирована - это ясно - и ето часть удовольствия в хобби
)
(Частично я использую гугл-переводчик).
: И мой модуль с Si5340A заработал (ур-р-ра, "большая борьба" была с SMD корпусом 44QFN!
).Для експеримента: с SMD-кварцевым резонатором 25 MHz, TSX-3225, для универсальности: с I2C 5V/3,3V конвертер.
Не обошлось без ошибок:
- неправильное подключение питания (5V-3,3V-1,8V-GND я включил как GND-1,8V-3,3V-5V!). Наверное из-за мое последовательно добавленого (защитного) резистора, я перестал уменьшать его значение до 13 Ом и чип "выжил"
.- после 2 дня тестов без ответа по I2C (i2c_scanner) (hi!
думал уже, что чип "сгорел" из-за ошибки питания), но перепаял с большим количеством флюсов. Чип начал отвечать по адресу 0x74 (А1 = GND, А0 = GND).Сегодня добавил управление: Arduino UNO: на данный момент загрузка 326 регистров из файла Si5340-RevD-Registers.h, сгенерирован с помощью ClockBuilder-Pro для кварц к XA-XB (XTAL = 25 MHz), один выход (OUT0 = 10 MHz). На сегодня экспериментировал только с добавлением коррекции кварцевого кристалла (reg. 0x0205..0x0202).
Ток: 12V (через диод): 260 mA (+ Arduino UNO), радиатор нормально тёплый, могу держать там свои пальцы.
---
Мой вопрос (в частности: к Владимир_К) для последующего написания кода:
Владимир, как Вы уменьшили количество регистров до 27 при инициализации?
(напр. из ClockBuilder-Pro для одна частота есть 326 регистров). Это где-то задокументировано? Пример из нета есть (для инициализации)?
Я могу выбирать в инициализации только те регистри, которые нужны напр. с тестами, но хочу сократить варианты (могу преписать Ваши, но "буквальное переписывание" данни - не "мой путь". А что каждая строка в документации должна быть проанализирована - это ясно - и ето часть удовольствия в хобби
)(Частично я использую гугл-переводчик).
ra0ahc — 9 апреля 2020 г. в 01:03#151
Уже научились плавно частоту менять? У меня не получилось , точнее получилось , но для радио не пойдёт . Сброс после смены частоты не подходит.
veso74 — 9 апреля 2020 г. в 01:09#152
Нужен reset, который делает помехи в радио?
ra0ahc — 9 апреля 2020 г. в 01:26#153
Да, частота в момент сброса улетает на десятки мегагерц и потом восстанавливает на нужную.
Владимир_К — 9 апреля 2020 г. в 04:29#154
Вероятно, как Вы подсказали, буду читать содержимое при запуске, чтобы попытаться оптимизировать инициализацию.Нет, немного не так. Я имел ввиду другое. Я просто посмотрел в документации. Там указано в каком состоянии находится каждый регистр при включении микросхемы, т.е. при старте. Во время
инициализации Вы лишь настраиваете параметры, которые не нужно будет менять в дальнейшем.
Ну или посмотреть в файле, который выдает Clock Builder Pro. Если там в регистрах нули, то в эти регистры не надо ничего писать. Там же во время включения так и будут нули. Во-всяком случае, я не заметил, что там может быть какой либо мусор.
Я в начале - сгенерирован .h файл с софта и загружаю содержание в чип.Я этого никогда не делал, да и не знаю как это делать. Я просто оттуда беру информацию, пример как нужно поступать.
но для радио не пойдёт .Что-то этот момент я не понял. Если можно сделать генератор качающейся частоты, то в чем проблема для радио?
ra0ahc — 9 апреля 2020 г. в 04:48#155
Анализатором смотрители? Скачков не было? Может код покажите ? Мы вроде с вами обсуждали и у вас на тот момент не было качалки.
veso74 — 9 апреля 2020 г. в 05:10#156
Я этого никогда не делал, да и не знаю как это делать."Строка за строкой" цикл берет данные из файла и отправляет по I2C в ИС.
(заменитье ардуиновские функции I2C с те в AVR и готово).
Код: [Выделить]#include "Si5340-RevD-Registers.h"
...
void setup {
for (uint16_t i = 0; i < 329; i++)
write_reg(si5340_revd_registers[i].address, si5340_revd_registers[i].value);
}
...
void write_reg(uint16_t addr, uint8_t data) {
Wire.beginTransmission(0x74);
Wire.write(0x01);
Wire.write(0xFF & addr >> 8 ;
Wire.endTransmission();
Wire.beginTransmission(0x74);
Wire.write(0xFF & addr);
Wire.write(data);
Wire.endTransmission();
}---
ЦитироватьТам указано в каком состоянии находится каждый регистр при включении микросхемы, т.е. при старте.Спасибо, посмотрю, нравится идея. Просто чтение/запись регистров с этими pages и 0x01: Set Page Address показалось мне "особенным", и на этот момент я не читал их еще.
Владимир_К — 9 апреля 2020 г. в 07:23#157
Анализатором смотрители? Скачков не было? Может код покажите ?"Качалку" я сделал только лишь для того, чтобы определить время перестройки чипа на другую частоту. Сейчас уже не помню, сколько получилось, а макет сейчас разобран. У меня, к сожалению, на то время не получилось с STM. Две платы и ни с одной не смог заставить работать I2C. Потом вроде разобрался, поупражнялся с м/с памяти. Писал в нее, читал, вроде нормально работает шина. Но с Si5340 так и не проверил.
Анализатора у меня нет. Смотрел лишь осциллографом. Вроде нормально... А может не заметил. Но у меня нигде Resetов нет. Исходник и прошивку прицепил. Прошивка (hex-файл) в папке проекта default. Малость я запамятовал, качалка от 30 до 40 мгц.
Владимир_К — 9 апреля 2020 г. в 12:30#158
Владимир, как Вы уменьшили количество регистров до 27 при инициализации?Нужно смотреть при сбросе чипа, в какое значение сбрасываются регистры. Если положение после сброса Вас устраивает, то и менять их нет смысла. Я где-то, возможно здесь (скорее на CQHam), исходник выложил. Но там пока ничего, кроме того, что чип генерирует качающуюся частоту от 5 до 30 мгц. А как Вы решили проблему с разрядностью. Там некоторые числа 44 разряда, а в AVR Studio 4.19 только 32 разрядные. Может в IDE Ардуино есть 64 разрядные? Правда с IDE Ардуино я мало занимался, толком не знаю ее.
veso74 — 9 апреля 2020 г. в 12:40#159
Я нашел давно Ваш код. Спасибо, что поделились! Вероятно, как Вь подсказали, буду читать содержимое при запуске, чтобы попытаться оптимизировать инициализацию. Но pages: 9, regs 256 - доступно много данных, даже официально объявленных в pdf.
Я в начале - сгенерирован .h файл с софта и загружаю содержание в чип. Проблема с Arduino нет, с uint/int64_t нормално работает (без обработки в некоторых функциях, напр Serial.print()). А и иначе числа можно побитово частично обрабатывать.
А сам чип оч. интересный. Думаю, с прецизной кварцевым кристаллом (5..10 ppm) темп. х-ка удовлетворяет мне для КВ. Вчера например уход при вкл/через 30 мин бил ок. 17 Hz (на 10 000 000 Hz). Oставлю вероятно так. Мне нравится, что каждая возможная комбинация ввода/вывода отработана, необходимо или подключать что-то (хардуерно) или управлять (софтуерно).
Я в начале - сгенерирован .h файл с софта и загружаю содержание в чип. Проблема с Arduino нет, с uint/int64_t нормално работает (без обработки в некоторых функциях, напр Serial.print()). А и иначе числа можно побитово частично обрабатывать.
А сам чип оч. интересный. Думаю, с прецизной кварцевым кристаллом (5..10 ppm) темп. х-ка удовлетворяет мне для КВ. Вчера например уход при вкл/через 30 мин бил ок. 17 Hz (на 10 000 000 Hz). Oставлю вероятно так. Мне нравится, что каждая возможная комбинация ввода/вывода отработана, необходимо или подключать что-то (хардуерно) или управлять (софтуерно).
veso74 — 10 апреля 2020 г. в 02:19#160
Странным для меня является расчет из софта:
Для OUT1 = 10 MHz при XTAL = 25 MHz
M = 528, FVCO = 13.2 GHz, N0 = 660, R0 = 2 -> 13 200 000 000 / (660 * 2) = 10 000 000, все ОК
Но N0 = N0_NUM / N0_DEN -> 660 = 1 417 339 207 680 / 2 147 483 648
зачем не сократили дробь на 660 = 660 / 1 с N0_NUM = 660 и N0_DEN = 1?
То же самое относится к M = M_NUM / M_DEN -> 528 = 1 133 871 366 144 / 2 147 483 648
---
К код управления для ADF4351 и Si5351 у меня были те же вопросы. Я просто применил сокращение дроби (reduce the fraction to lowest terms) (когда это возможно, если нет - то масштабирования), вместо использования только максимального значения (или близко к макс. значения) в знаменателя и масштабирования.
--
P.S. С 660 и 1 попробовал к N0_NUM и N0_DEN. Работает, OUT0 = 10 MHz.
Для OUT1 = 10 MHz при XTAL = 25 MHz
M = 528, FVCO = 13.2 GHz, N0 = 660, R0 = 2 -> 13 200 000 000 / (660 * 2) = 10 000 000, все ОК
Но N0 = N0_NUM / N0_DEN -> 660 = 1 417 339 207 680 / 2 147 483 648
зачем не сократили дробь на 660 = 660 / 1 с N0_NUM = 660 и N0_DEN = 1?
То же самое относится к M = M_NUM / M_DEN -> 528 = 1 133 871 366 144 / 2 147 483 648
---
К код управления для ADF4351 и Si5351 у меня были те же вопросы. Я просто применил сокращение дроби (reduce the fraction to lowest terms) (когда это возможно, если нет - то масштабирования), вместо использования только максимального значения (или близко к макс. значения) в знаменателя и масштабирования.
--
P.S. С 660 и 1 попробовал к N0_NUM и N0_DEN. Работает, OUT0 = 10 MHz.
veso74 — 10 апреля 2020 г. в 08:19#161
Я запустил код к Si5430A с очень простым расчетом регистров для OUT0.
FVCO const = 13,2 MHz, при расчет только на N0_NUM и N0_DEN, без SOFT_RST(только один раз при инициализации, где и M_NUM и M_DEN установлены).
расчет N0_NUM и N0_DEN: без дополнительных действии по оптимизации, N0_DEN = 0x1FFFFFFF (при 0xFFFFFFFF, 0x7FFFFFFF - переполнение), с uint64_t, без fliat/double, с N0 divider update bit после загрузки данных.
Я не слышал ничего смущающего при изменении частоты ни как передатчик, ни как первой VFO на 80m и на 20m (IF = 9 MHz, UP).
Пытался видеть по крайнем мере пики, трещины при freq sweep. Картина на того, что я имею в качестве приемника, ниже. Частота 14..15 MHz, шаг 100 Hz, время переключения после изменении шага: 10 ms.
Для моих требований чип работает пока хорошо. Продолжаю писать.
Код: [Выделить]uint32_t f = 14000000;
...
set_freq(f);
delay(10);
f += 100;
if (f > 15000000)
f = 14000000;
FVCO const = 13,2 MHz, при расчет только на N0_NUM и N0_DEN, без SOFT_RST(только один раз при инициализации, где и M_NUM и M_DEN установлены).
расчет N0_NUM и N0_DEN: без дополнительных действии по оптимизации, N0_DEN = 0x1FFFFFFF (при 0xFFFFFFFF, 0x7FFFFFFF - переполнение), с uint64_t, без fliat/double, с N0 divider update bit после загрузки данных.
Я не слышал ничего смущающего при изменении частоты ни как передатчик, ни как первой VFO на 80m и на 20m (IF = 9 MHz, UP).
Пытался видеть по крайнем мере пики, трещины при freq sweep. Картина на того, что я имею в качестве приемника, ниже. Частота 14..15 MHz, шаг 100 Hz, время переключения после изменении шага: 10 ms.
Для моих требований чип работает пока хорошо. Продолжаю писать.
Код: [Выделить]uint32_t f = 14000000;
...
set_freq(f);
delay(10);
f += 100;
if (f > 15000000)
f = 14000000;
ra0ahc — 10 апреля 2020 г. в 08:22#162
Круто Веселин ! Дадите потом свой расклад и последовательность действий?
veso74 — 10 апреля 2020 г. в 08:50#163
Нет проблема. Начин ничем не отличается от кода напр. Владимира или Вашей, и QRP-labs для Si5351. Только что загрузил некоторые регистры из .h файла из софта в инициализации. Есть много о чем подумать, напр. сейчас R неизменяемый и = 2 (не будет только с 2 работать на НЧ), FVCO должен выяснить для себя нужно ли перечислять и когда (FVCO = 13500..14256 MHz, но без четкой границы). Напр. ClockBuilder предлагал FVCO = 13,2 GHz, вне диапазона, и я написал так. Наверное поэтому потребление ниже? (260 mA)).
Попробуйте не трогать FVCO, без SOFT_RST и только вычислять N0_NUM и N0_DEN в узком частотном диапазоне, например один диапазон.
Меня почти не волнует, что PLL работает с fractional коефициентов. Разница в выходние х-ки, показанни в PDF, очень мала, и в очень далекой области, несколько dB. А такие примерно и в Si570, а знаем какой у его сигнал.
Код: [Выделить]void set_freq(uint32_t freq) {
uint32_t R_DIV = 2;
uint64_t FVCO = 13200000000;
uint64_t num = (FVCO * 0x1FFFFFFF) / (R_DIV * freq);
write_reg(0x0302, num);
write_reg(0x0303, num >> 8); // N0 numerator N0_NUM[7:0]
write_reg(0x0304, num >> 16); // N0 numerator N0_NUM[15:8]
write_reg(0x0305, num >> 24); // N0 numerator N0_NUM[23:16]
write_reg(0x0306, num >> 32); // N0 numerator N0_NUM[39:32]
write_reg(0x0307, num >> 40); // N0 numerator N0_NUM[43:40]
write_reg(0x0308, 0xFF); // N0 denominator N0_DEN[7:0]
write_reg(0x0309, 0xFF); // N0 denominator N0_DEN[15:8]
write_reg(0x030A, 0xFF); // N0 denominator N0_DEN[23:16]
write_reg(0x030B, 0x1F); // N0 denominator N0_DEN[31:24]
write_reg(0x030C, 0x01); // N0 divider update bit
}
Попробуйте не трогать FVCO, без SOFT_RST и только вычислять N0_NUM и N0_DEN в узком частотном диапазоне, например один диапазон.
Меня почти не волнует, что PLL работает с fractional коефициентов. Разница в выходние х-ки, показанни в PDF, очень мала, и в очень далекой области, несколько dB. А такие примерно и в Si570, а знаем какой у его сигнал.
Код: [Выделить]void set_freq(uint32_t freq) {
uint32_t R_DIV = 2;
uint64_t FVCO = 13200000000;
uint64_t num = (FVCO * 0x1FFFFFFF) / (R_DIV * freq);
write_reg(0x0302, num);
write_reg(0x0303, num >> 8); // N0 numerator N0_NUM[7:0]
write_reg(0x0304, num >> 16); // N0 numerator N0_NUM[15:8]
write_reg(0x0305, num >> 24); // N0 numerator N0_NUM[23:16]
write_reg(0x0306, num >> 32); // N0 numerator N0_NUM[39:32]
write_reg(0x0307, num >> 40); // N0 numerator N0_NUM[43:40]
write_reg(0x0308, 0xFF); // N0 denominator N0_DEN[7:0]
write_reg(0x0309, 0xFF); // N0 denominator N0_DEN[15:8]
write_reg(0x030A, 0xFF); // N0 denominator N0_DEN[23:16]
write_reg(0x030B, 0x1F); // N0 denominator N0_DEN[31:24]
write_reg(0x030C, 0x01); // N0 divider update bit
}
veso74 — 10 апреля 2020 г. в 12:20#164
Для буква "D" в типа в .h есть что непонятные команды, но пока без них чип не сработал.
Код: [Выделить] /* Start configuration preamble */
{ 0x0B24, 0xC0 },
{ 0x0B25, 0x00 },
/* Rev D stuck divider fix */
{ 0x0502, 0x01 },
{ 0x0505, 0x03 },
{ 0x0957, 0x17 },
{ 0x0B4E, 0x1A },
/* End configuration preamble
/* Delay 300 msec */
/* Delay is worst case time for device to complete any calibration */
/* that is running due to device state change previous to this script */
/* being processed. */ */Необходимо и задержка напр. 300 ms.
Как и в конце:
Код: [Выделить] /* Start configuration postamble */
{ 0x001C, 0x01 }, - Ето SOFT_RST
{ 0x0B24, 0xC3 },
{ 0x0B25, 0x02 },
/* End configuration postamble */Недокументированные строки?
.
Код: [Выделить] /* Start configuration preamble */
{ 0x0B24, 0xC0 },
{ 0x0B25, 0x00 },
/* Rev D stuck divider fix */
{ 0x0502, 0x01 },
{ 0x0505, 0x03 },
{ 0x0957, 0x17 },
{ 0x0B4E, 0x1A },
/* End configuration preamble
/* Delay 300 msec */
/* Delay is worst case time for device to complete any calibration */
/* that is running due to device state change previous to this script */
/* being processed. */ */Необходимо и задержка напр. 300 ms.
Как и в конце:
Код: [Выделить] /* Start configuration postamble */
{ 0x001C, 0x01 }, - Ето SOFT_RST
{ 0x0B24, 0xC3 },
{ 0x0B25, 0x02 },
/* End configuration postamble */Недокументированные строки?
.veso74 — 11 апреля 2020 г. в 12:13#165
При FVCO = 14,2 GHz консумация тока также 260 mA при тот же OUT0 = 10 MHz. Ето хорошо. Но неиспользованные неисключенные делители в других каналах (reg 0x0A03, 0x0A04, 0x0A05) влияет прямо на консумация тока (до 320 mA достиг).
veso74 — 13 апреля 2020 г. в 01:13#166
Владимир_K, да, нашел я вариант чтобы избежать переполнение.
Без ULL расчет работал 1 разред меньше (до 0x7FFF FFFF FFFF FFFF). С ULL - значение до UINT64_MAX.
Значит Arduiono нормально работает с 64-битовие переменные, как uint64_t, так и int64_t. (Лично успокоился
).
Теперь к Si5340A масштабирование с максимальным знаменателем:
Код: [Выделить]void set_freq(uint32_t freq) {
uint32_t R_DIV = 2;
uint64_t num = (FVCO * 0xFFFFFFFFULL) / (R_DIV * freq);
uint8_t N_reg[11];
N_reg[0] = (uint8_t)num; // N0_NUM[7:0]
N_reg[1] = (uint8_t)(num >>; // N0_NUM[15:8]
N_reg[2] = (uint8_t)(num >> 16); // N0_NUM[23:16]
N_reg[3] = (uint8_t)(num >> 24); // N0_NUM[31:24]
N_reg[4] = (uint8_t)(num >> 32); // N0_NUM[39:32]
N_reg[5] = (uint8_t)(num >> 40); // N0_NUM[43:40]
N_reg[6] = 0xFF; // N0_DEN[7:0]
N_reg[7] = 0xFF; // N0_DEN[15:8]
N_reg[8] = 0xFF; // N0_DEN[23:16]
N_reg[9] = 0xFF; // N0_DEN[31:24]
N_reg[10] = 0x01; // N0_UPDATE
write_regs(0x0302, N_reg); // page, start reg, data array
}---
"Не трогаю" FVCO вчера (13,2 GHz), отправив частоту по серийному порту, получил с Si грубо 3..310 MHz. 99% моих требований к чипам удовлетворены. Я даже думаю о том, чтобы не пересчитывать М-divider, но R-divider можно добавить (2..8..32?)в расчете, напр. 500 kHz - "хорошая частота" напр. для теста с ЕМФ-ов
.
Без ULL расчет работал 1 разред меньше (до 0x7FFF FFFF FFFF FFFF). С ULL - значение до UINT64_MAX.
Значит Arduiono нормально работает с 64-битовие переменные, как uint64_t, так и int64_t. (Лично успокоился
).Теперь к Si5340A масштабирование с максимальным знаменателем:
Код: [Выделить]void set_freq(uint32_t freq) {
uint32_t R_DIV = 2;
uint64_t num = (FVCO * 0xFFFFFFFFULL) / (R_DIV * freq);
uint8_t N_reg[11];
N_reg[0] = (uint8_t)num; // N0_NUM[7:0]
N_reg[1] = (uint8_t)(num >>; // N0_NUM[15:8]
N_reg[2] = (uint8_t)(num >> 16); // N0_NUM[23:16]
N_reg[3] = (uint8_t)(num >> 24); // N0_NUM[31:24]
N_reg[4] = (uint8_t)(num >> 32); // N0_NUM[39:32]
N_reg[5] = (uint8_t)(num >> 40); // N0_NUM[43:40]
N_reg[6] = 0xFF; // N0_DEN[7:0]
N_reg[7] = 0xFF; // N0_DEN[15:8]
N_reg[8] = 0xFF; // N0_DEN[23:16]
N_reg[9] = 0xFF; // N0_DEN[31:24]
N_reg[10] = 0x01; // N0_UPDATE
write_regs(0x0302, N_reg); // page, start reg, data array
}---
"Не трогаю" FVCO вчера (13,2 GHz), отправив частоту по серийному порту, получил с Si грубо 3..310 MHz. 99% моих требований к чипам удовлетворены. Я даже думаю о том, чтобы не пересчитывать М-divider, но R-divider можно добавить (2..8..32?)в расчете, напр. 500 kHz - "хорошая частота" напр. для теста с ЕМФ-ов
.veso74 — 13 апреля 2020 г. в 07:15#167
Есть некоторое ограничение :/ 64b переменная не переполняется, но когда я отправляю к чипе при макс знаменатель, чип не работает. Помощь?
Оставляю на данный момент с 0x20000000, так умножение равносилно перемещение.
Другое: динамическое изменение М-divider не нравится: кроме необходимость мягкого сброса, так и по отношении калибрационного кварцегого коефициента: при изменение М-divider, XAXB_FREQ_OFFSET также должно изменяться пропорционально (если отличается от нуля, а калибрация всегда есть). Будем думать и собирать дальше. Для меня важно, чтобы основания функция заработала.
Оставляю на данный момент с 0x20000000, так умножение равносилно перемещение.
Другое: динамическое изменение М-divider не нравится: кроме необходимость мягкого сброса, так и по отношении калибрационного кварцегого коефициента: при изменение М-divider, XAXB_FREQ_OFFSET также должно изменяться пропорционально (если отличается от нуля, а калибрация всегда есть). Будем думать и собирать дальше. Для меня важно, чтобы основания функция заработала.
ra0ahc — 13 апреля 2020 г. в 07:31#168
Если я правильно понял у вас разрядности переменной не хватает?
Вы тогда сперва разделите, а то что получите умножите на .... fffff .... я так делал и тогда разрядности хватало double long.
uint64_t num = (FVCO * 0xFFFFFFFFULL) / (R_DIV * freq);
FVCO * 0xFFFFFFFFULL это тяжелое умножение.
uint64_t num = FVCO * (double long)( 0xFFFFFFFFULL/ (R_DIV * freq));
Так можно попробовать.
Вы тогда сперва разделите, а то что получите умножите на .... fffff .... я так делал и тогда разрядности хватало double long.
uint64_t num = (FVCO * 0xFFFFFFFFULL) / (R_DIV * freq);
FVCO * 0xFFFFFFFFULL это тяжелое умножение.
uint64_t num = FVCO * (double long)( 0xFFFFFFFFULL/ (R_DIV * freq));
Так можно попробовать.
veso74 — 13 апреля 2020 г. в 07:44#169
long double у меня нет. long double с плавающей точкой?
long double ->3.4E 4932 ... 1.1E 4932. ухуууу
Только float = double есть в Arduino Nano-UNO (6-7 знака после запетаи), мало, а и не хочу использовать с пл. запетаю.
Xватает разрядности в Arduino, в Serial данни ОК. Предположение: некоторой беспорядок происходит с делителям или с их загрузки
---
Остаются таким пока: uint64_t num = (FVCO << 29) / (R_DIV * freq);
long double ->3.4E 4932 ... 1.1E 4932. ухуууу

Только float = double есть в Arduino Nano-UNO (6-7 знака после запетаи), мало, а и не хочу использовать с пл. запетаю.
Xватает разрядности в Arduino, в Serial данни ОК. Предположение: некоторой беспорядок происходит с делителям или с их загрузки
---
Остаются таким пока: uint64_t num = (FVCO << 29) / (R_DIV * freq);
veso74 — 16 апреля 2020 г. в 01:25#170
расчет и зарядка одной частоты OUT0, по I2C 100 kHz -> 1576 us, по I2C 400 kHz -> 664 us
ra0ahc — 16 апреля 2020 г. в 04:37#171
Время забыть про ардуину и перейти на stm32
VA7KL — 16 апреля 2020 г. в 07:45#172
STM32F745 записывала в AD9959 по QuadSPI за 400 наносекунд. Теперь работаем над H747...
veso74 — 16 апреля 2020 г. в 09:58#173
I2C на 100 kHz не как QuadSPI. Задержка из-за спецификации шины, а не из-за Arduino
. Расчет примерно за 96 us.
А и не спешу нигде
.
. Расчет примерно за 96 us.А и не спешу нигде
.veso74 — 23 апреля 2020 г. в 10:32#174
Потребляемый ток при 4 выхода: 320 mA (изм. в 12V шина перед стабилизаторами, с Arduino UNO на 5V шини):
OUT0 = 20 000 000 Hz
OUT1 = 10 000 000 Hz
OUT2 = 7 500 000 Hz
OUT3 = 5 000 000 Hz
при установлены их соответствующими делителями: N0, N1, N2, N3, с FVCO const = 13,2 GHz
"Горячий синтезатор", и интересен. Кроме тока не вижу ничего негативного при использовании (даже как первой гет.).
Управление относительно простое: регистры расположены один за другим. Все, что мне нужно сделать еще: автоматизировать расчет коэффициентов и для других трех выходов: OUT1, OUT2, OUT3.
OUT0 = 20 000 000 Hz
OUT1 = 10 000 000 Hz
OUT2 = 7 500 000 Hz
OUT3 = 5 000 000 Hz
при установлены их соответствующими делителями: N0, N1, N2, N3, с FVCO const = 13,2 GHz
"Горячий синтезатор", и интересен. Кроме тока не вижу ничего негативного при использовании (даже как первой гет.).
Управление относительно простое: регистры расположены один за другим. Все, что мне нужно сделать еще: автоматизировать расчет коэффициентов и для других трех выходов: OUT1, OUT2, OUT3.
Владимир_К — 23 декабря 2020 г. в 03:23#175
Всем привет! Коллеги, прошу помощи в решении проблемы. Сейчас занимаюсь с Si5340A. Стал вопрос в выборе опорного генератора. У меня два модуля с микросхемой. В одном опорник на 80 мгц, фирмы Jauch, второй модуль - опорник Geyer на 100 мгц. Спектр от второго модуля на 100 мгц опорнике - шумы почти на 10 дб выше. Ну решил, что Jauch круче, прикупил пару генераторов на 100 мгц от этой фирмы. Сегодня запаял один - шум на 30 дб стал еще выше. Причем, что интересно, по мере прогрева шум снижается, примерно на 5 дб.
В общем вопрос такой, что применить, может кто имел дело с хорошим вариантом. Сейчас попробую спаять на небуферированной логике, на 5 гармонику.
В общем вопрос такой, что применить, может кто имел дело с хорошим вариантом. Сейчас попробую спаять на небуферированной логике, на 5 гармонику.
Игорь 2 — 23 декабря 2020 г. в 03:46#176
В общем вопрос такой, что применить, может кто имел дело с хорошим вариантом.
Собирается свой отдельный генератор, к примеру тот же 3001 у меня давно уже работает (вторая электрическая гармоника), опять же, никто не мешает выходить и на третью электрическую гармонику.
Кварцы, не предназначенные для механической гармониковой работы, я бы не рискнул использовать, там есть скользкие места, тем более, при работе на частотах выше 30 МГц.

Если нужны сотни мегагерц опоры при минимуме шума, опять же решение однозначно - множите снаружи, и вливаете в SI.
Есть, к слову, масса монолитных копеечных фильтров на сотни мегагерц, можно ими подчищать мусор после умножения...
ra0ahc — 23 декабря 2020 г. в 04:15#177
У меня сишка эта испод зуется в приборе сдр от Игоря , но там и синт стоит Игоря и с шумами там проблем нет. Сишку я третировал 120 МГц генератором обычным смд. Увод частоты не проверял. Для прибора эта микруха перебор . Да и греется она... хотя вы в курсе
Владимир_К — 23 декабря 2020 г. в 04:18#178
Спасибо, попробую.. Но придется добавлять на плату что-то, поэтому попробую затактировать просто от кварца. Время поджимает. Думал по-быстрому вопрос решить. Вчера заказал генераторы, сегодня получил... фуфло.
Владимир_К — 23 декабря 2020 г. в 04:24#179
У меня сишка эта испод зуется в приборе сдр от Игоря , но там и синт стоит Игоря и с шумами там проблем нет.Наверное будут проблемы, если шум на 30 дб выше, чем имеет копеечная Si5351A.
Видел Вашу плату синтезатора. Впечатляет. Сам бы собрал такую, но вопрос печатки... Вы тоже писали, что генераторы плохие у китайцев купили?
Игорь 2 — 23 декабря 2020 г. в 04:25#180
Да, как раз, когда первые DDS пошли, где-то в конце 90-х по-моему, ко мне Сергей Макаркин часто с ними приезжал фазовые щумы мерить при тактировании от готовых генераторов. 
Смотрел, грустил, уезжал, приезжал с новыми, опять грустил, а потом плюнул и говорит - любителям и так пойдёт, или, что-то, типа того...


Смотрел, грустил, уезжал, приезжал с новыми, опять грустил, а потом плюнул и говорит - любителям и так пойдёт, или, что-то, типа того...

Владимир_К — 23 декабря 2020 г. в 04:46#181
а потом плюнул и говорит - любителям и так пойдётВот так оно и идет, до сих пор..
Игорь 2 — 23 декабря 2020 г. в 04:52#182
Ut1lw — 23 декабря 2020 г. в 05:17#183
, а потом плюнул и говорит - любителям и так пойдёт, или, что-то, типа того...Помню лет двадцать тому, Сергей продвигал их в эфире. И я договаривался, но не сложилось. Он убедительно их освещал. Про Игоря не упоминал.

Игорь 2 — 23 декабря 2020 г. в 05:24#184
Про Игоря не упоминал.
Да я ж и не участвовал в процессе - только шумы мерил.
Он упоминал меня, как одного из купивших.
По совместной договорённости, чтобы двинуть его бизнес - реально я не покупал, нафига мне нужна пародия на синтез, у меня тогда шли UMA1014T с кучей ГУНов, там с различными наворотами более-менее нормально всё выходило...

Владимир_К — 23 декабря 2020 г. в 05:35#185
По совместной договорённости, чтобы двинуть его бизнес - реально я не покупалА Чубайс участвовал в компании? Вон откуда ноги растут
.Игорь 2 — 23 декабря 2020 г. в 05:39#186
А Чубайс участвовал в компании?
Да фиг знает, с кем он там ещё договаривался...

Владимир_К — 23 декабря 2020 г. в 06:30#187
у меня тогда шли UMA1014T с кучей ГУНовНаверное и сейчас бы нашла микросхемка применение. Вместо опорного кварца - ДДС. Ну и Гуны. Остальное на борту все есть.
Игорь 2 — 23 декабря 2020 г. в 08:16#188
Наверное и сейчас бы нашла микросхемка применение.
Да, наверное.
Оно раньше так и было - частоту сравнения под максимум загоняли, и опору водили туда-сюда, чтобы непрерывность сделать. Довольно сложно было заставить правильно делить - на низких частотах (в районе 50...100 МГц) при синусе цепляла непойми что, как, впрочем, и большинство подобных синтезаторов более позднего периода, приходилось искусственно искажения вводить отдельным каскадом... 
rtty — 18 мая 2021 г. в 12:27#189
Попалась информация об еще одной мелко-смдшной СИшке - SI5328 , обещают на 150МГц @10kHz -128дбн/Гц.
На 10МГц по данным одного человека, кто применяет ее в с генераторах, синхронизированных по gps:
http://www.leobodnar.com/files/LBE-GPS-clock-10MHz-phase-noise.png
-125 dBc/Hz at 100 Hz
-143 dBc/Hz at 1 kHz
-150 dBc/Hz at 10 kHz
-152 dBc/Hz at 100 kHz
-155 dBc/Hz at 1 MHz
На 10МГц по данным одного человека, кто применяет ее в с генераторах, синхронизированных по gps:
http://www.leobodnar.com/files/LBE-GPS-clock-10MHz-phase-noise.png
-125 dBc/Hz at 100 Hz
-143 dBc/Hz at 1 kHz
-150 dBc/Hz at 10 kHz
-152 dBc/Hz at 100 kHz
-155 dBc/Hz at 1 MHz
Игорь 2 — 18 мая 2021 г. в 12:36#190
Ну да, пересчёт 150 МГц 10 кГц -128 дБ/Гц, как раз, и даёт на 15 МГц -148, что примерно, как и у меня (я до -150 у себя видел при 16 МГц), там проблема в том, что спуры лезут, а у себя я их ближе частоты сравнения (10...20 МГц) от основной частоты физически получить не могу, да и там они не менее чем на 100 дБ (?) подавлены - где-то картинки и данные моноплаты выкладывал ... 

rtty — 18 мая 2021 г. в 12:38#191
Понятно, что фапч фильтрует дальнее.
Все равно интересно, что такие мс начали появляться и вполне подойдут в средний-средне+ класс аппаратуры уже.
Все равно интересно, что такие мс начали появляться и вполне подойдут в средний-средне+ класс аппаратуры уже.
Игорь 2 — 3 ноября 2021 г. в 01:10#192
Да, там именно сетевые помехи. Устраняется экранированием и тщательной фильтрацией всех питающих напряжений. Не исключаю, что для того, чтобы их побороть полностью, потребуется пермалоевый экран... 

RC3U — 3 ноября 2021 г. в 08:13#193
подойдут в средний-средне+ класс аппаратуры уже.

Владимир_К — 3 ноября 2021 г. в 11:51#194
Понятно, что фапч фильтрует дальнее.А я всегда думал, что как раз - ближнее. А дальнее определяется ГУНом.
Игорь 2 — 3 ноября 2021 г. в 12:07#195
А я всегда думал, что как раз - ближнее. А дальнее определяется ГУНом.
Пожалуй, именно так. По мере расширения полосы петли, у меня мусора в самой ближней зоне точно прибавляется, в измерительном генераторе на моём синтезе я в 20 раз поднял ёмкости в ООС операционника, качающего варикапы, и, хотя потерял в скорости перестройки, ближнюю зону почистил - см. жёлтый трек, оранжевый - с оригинальными номиналами...

Владимир_К — 3 ноября 2021 г. в 12:46#196
По мере расширения полосы петли, у меня мусора в самой ближней зоне точно прибавляется,Меня тут "достают" наводки от сети. У Вас на оранжевом треке, насколько я понял, именно они также присутствуют. Причем, иногда вроде ничего нет, иногда появляются.. Хрен знает, вроде даже от расположения макета зависит. Возможно в этом и причина, так как именно пока на макете.