Автор Тема: DDS для диапазона ДВ на микроконтроллере  (Прочитано 6129 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн GM

  • Старожил
  • ****
  • Сообщений: 331
    • Просмотр профиля
Коллеги, предлагаю вашему вниманию программу, формирующую синусоидальный сигнал методом прямого синтеза (DDS).

Программа записана в МК ATtiny2313, синхронизируемый кварцем 20 МГц. Программа затрачивает 10 тактов на одну выборку, т.е. частота выборок fS=2000 кГц.

Программа управляется по последовательному каналу уарт, скорость 115200 бод, формат данных как обычно 8N1. Протокол передачи очень простой: передается пакет, содержащий 4 байта приращения фазы (так называемый код частоты). Старший байт передаётся первым. Допускаются любые значения от 0х00000000 до 0х7FFFFFFF. Передача одного пакета заканчивается тайм-аутом 100 мкс.

Переход к заданной частоте осуществляется примерно через 2 мкс после приёма последнего байта пакета.

Особенностью программы является непрерывность генерации частоты, то есть программа одновременно и независимо делает две вещи: 1) формирует выборки и 2) принимает команды по уарту и отсылает по уарту весь пакет, как квитанцию.

Во вложении представлена прошивка для опорной частоты 20 МГц. Функционирование программы проверено мною, работает. При подаче питания программа генерит синус 137.5 кГц.

Программа может быть загружена в МК синтезатора А.Кудрявцева и будет работать, но конечно, требует управления по протоколу, описанному выше. Поскольку там стоит опорный генератор на 12.8 МГц, то вторая прошивка во вложении откомпилирована под 12.8 МГц. Работа программы не проверялась, т.к. такого кварца не было в наличии.
« Последнее редактирование: 22 Апрель 2018, 13:47:37 от GM »
Зачем нам бумеранг? У нас грабли есть!

Оффлайн GM

  • Старожил
  • ****
  • Сообщений: 331
    • Просмотр профиля
Re: DDS для ДВ на микроконтроллере
« Ответ #1 : 22 Апрель 2018, 00:00:00 »
Пример расчета приращения фазы.

1) Частота выборок fS=2000000 Гц.

2) Шаг частоты ∆F=fS/(2^32)=0.00465661287308 Гц.

3) Код приращения фазы ∆Ф=[Fx/∆F+0.5]. Например, для Fx=137500 Гц приращение ∆Ф=[295279001.6+0.5]=295279002. Квадратные скобки стандартно означают выделение целой части числа.

4) Затем необходимо десятичное число преобразовать в шестнадцатиричное 0x1199999A. Для перевода можно воспользоваться компьютерным калькулятором.

5) Теперь можно посылать вычисленное значение линейной фазы в МК по уарт. Для проверки написанной программы я пользовался программой RealTerm, она свободно распространяется в сети. Приведу картинку, как это выглядит. Немного неудачное фото, но ничего, разглядеть можно.

Приведу ещё картинки спектров, сгенерированных программой, вблизи несущей и с захватом частоты выборок fS. На последней картинке прошу обратить внимание на нашу спектральную палку Fx=137.5 кГц, примерно пол-деления от начала (деление=250 кГц) и на две палки вокруг частоты fS=2000 кГц (это 8-я вертикальная линия). Частоты выборки естественно нет, но вот левая палка - это алиасинг нашей частоты Fa1=2000-137.5, а вторая палка это тоже алиасинг Fa2=2000+137.5. При перестройке частоты Fx вверх палка Fa1 движется к ней навстречу, а Fa2 - в другую сторону. Вот эти алиасинги и надо фильтровать, чтобы не было джиттера и был чистый спектр. Обратите также внимание, что спектр чист до -50 дБ, хотя снят прямо на выходе цапа, без всяких фильтров.
« Последнее редактирование: 22 Апрель 2018, 12:43:45 от GM »
Зачем нам бумеранг? У нас грабли есть!

Оффлайн Сергей UB1APE

  • Ветеран
  • *****
  • Сообщений: 6264
  • Я точно знаю, что ни чего не знаю
    • Просмотр профиля
    • E-mail
Re: DDS для диапазона ДВ на микроконтроллере
« Ответ #2 : 22 Апрель 2018, 11:58:21 »
Простите меня лузера не внимательного.  Схема пропала только у меня? Или её и не было?
UB1APE ( RA1ADF) Сергей.

Оффлайн GM

  • Старожил
  • ****
  • Сообщений: 331
    • Просмотр профиля
Re: DDS для диапазона ДВ на микроконтроллере
« Ответ #3 : 22 Апрель 2018, 12:42:28 »
Схема любая, скажем, от Александра rn3aus. Используется МК, ноги 2-3 для RX-TX, и ноги 12-19 (порт В) для цап, нога 5 - опорный генератор, ну питание и земля само собой. Остальное - по желанию. На выход цапа (соединение R8 и R18) надо поставить НЧ-фильтр, который давит всё, что выше 400 кГц на порядка 40+ дБ.

Я подключал к ножкам 2-3 преобразователь USB-to-TTL, noname, ну а на ПК запускал RealTerm, больше ничего.

По поводу точности сопротивлений резисторов в цапе. Точность должна быть как можно выше, не хуже 0.5%. Можно обойтись одним номиналом, скажем 20 кОм, а 10 кОм получать параллельным соединением двух 20 кОм. А еще лучше купить сотню штук одинаковых резиков и отобрать одного номинала, неважно будет это 20.4 кОм или 19.7 кОм. В чипдипе smd резик стоит 0.99 руб, 100 штук - 99 руб. (две поездки на метро в Москве).

Если кому-то захочется и есть возможность, то можно учесть сопротивление ключей порта, порядка 20-50 Ом (стоит измерить на конкретном экземпляре МК).
« Последнее редактирование: 22 Апрель 2018, 13:49:50 от GM »
Зачем нам бумеранг? У нас грабли есть!

Оффлайн GM

  • Старожил
  • ****
  • Сообщений: 331
    • Просмотр профиля
НЧ-фильтр для ДВ DDS на микроконтроллере
« Ответ #4 : 02 Март 2019, 01:15:18 »
Наконец выдалось свободное время на то, чтобы рассчитать и сделать выходной НЧ фильтр для синтезатора. Схема фильтра показана на первом фото.

Номиналы элементов допустимы в пределах ±5%. Индуктивности намотаны на сердечниках от энергосберегаек, индуктивность примерно равна 2.5 мГн. Ёмкости конденсаторов удалось получить, используя всего два номинала 22 пФ и 27 пФ. С1=С3=22+27=49, С2=27+27 +(27--27 последовательно)=67.5.

Амплитудно-частотная характеристика фильтра - чебышевская, практически плоская от 0 до 600 кГц, все частоты выше 1400 подавляются на 50 дБ.

Фильтр должен быть нагружен на 10 кОм с обеих сторон. Поскольку выходное сопротивление ЦАПа примерно равно 10 кОм, то на входе больше ничего не надо подключать, на выходе должна быть подключена нагрузка 10 кОм, например, как показано на рисунке.
Зачем нам бумеранг? У нас грабли есть!

Оффлайн GM

  • Старожил
  • ****
  • Сообщений: 331
    • Просмотр профиля
НЧ-фильтр для ДВ DDS на микроконтроллере-2
« Ответ #5 : 02 Март 2019, 01:33:21 »
Добавлю ещё, в одном вложении файлы не помещаются.

На осциллограмме видно, что синусоидальный сигнал выглядит вполне прилично, никакого джиттера.

На спектрограмме видно, что у ДДС с НЧ фильтром на выходе пропали спуры, которые при перестройке частоты "выскакивали" в неожиданных местах. Вообще, шумовая "подошва" стала ровной до 50 МГц. Уровень несущей более, чем на 60 дБ выше уровня шумов. Точнее не могу сказать, т.к. при выключении сигнала уровень шума на анализаторе не изменяется. Вот доберусь до своего crony (закадычного дружбана), у него есть хьюлет-паккардовский анализатор, вот тогда померяю точно.
Зачем нам бумеранг? У нас грабли есть!

Оффлайн GM

  • Старожил
  • ****
  • Сообщений: 331
    • Просмотр профиля
Re: DDS для диапазона ДВ на микроконтроллере
« Ответ #6 : 15 Апрель 2019, 00:01:51 »
По просьбе Александра RN3AUS переработал программу синтезатора (http://136.su/index.php/topic,117.195.html). Протокол обмена немного изменился, но старый протокол можно по-прежнему использовать для управления частотой синтезатора.

ПРОТОКОЛ УПРАВЛЕНИЯ СИНТЕЗАТОРОМ

Программа написана для МК ATtiny2313, синхронизируемого кварцем 20 МГц. Программа затрачивает 10 тактов на одну выборку, т.е. частота выборок fS=2000 кГц.

Программа управляется по последовательному каналу уарт, скорость 115200 бод, формат данных 8N1.

В протоколе передачи используются пакеты двух типов. Первый тип используется для управления частотой, второй тип – для изменения фазы, сохранения когерентности сигнала и управления усилителем мощности. Оба пакета состоят из 4 байт. Нумерация байт слева направо, т.е. 1,2,3,4. Старший байт (№ 1) передаётся первым. Нумерация бит в байте справа налево, т.е. 7,6,..,0. 7-й бит первого байта является битом модификации. В качестве признака работоспособности программа возвращает по уарту принятый пакет, как квитанцию. Передача любого пакета заканчивается тайм-аутом 100 мкс.

1. Для установки частоты передается пакет, содержащий приращение фазы (так называемый код частоты). Признаком передачи первого пакета является наличие 0 в бите модификации. Допускаются любые значения от 0х00000000 до 0х7FFFFFFF. Переход к заданной частоте осуществляется примерно через 2 мкс после приёма последнего байта пакета.

2. Признаком передачи второго типа пакета является наличие 1 в бите модификации. Биты 6, 5 и 4 используются для указания контроллеру информации об изменении фазы, тона и PTT соответственно. Все биты независимы и могут передаваться в одном пакете.

2.1. Для передачи относительной фазы 6-й бит старшего байта устанавливается в 1. Код фазы передаётся во втором и третьем байтах. Второй байт является старшим байтом фазы. Дискретность фазы определяется единицей младшего бита 360/65536 = 0,0054932 градуса. Последний 4-й байт не несёт никакой информации и передается исключительно для получения равной длины обоих типов пакетов.

2.2. Для выключения тона (но сохранения когерентности синтезируемого сигнала) необходимо сбросить 5-й бит старшего байта. Для включения – соответственно установить его в 1.

2.3. Для включения передатчика (PD6 микроконтроллера) необходимо установить 4-й бит старшего байта. Для выключения – соответственно сбросить его в 0.

3. Программа микроконтроллера принимает пакеты и выполняет соответствующие действия, не прерывая генерации сигнала заданной частоты. После подачи питания программа вырабатывает синусоидальный сигнал частотой 137,5 кГц. Передатчик выключен.
« Последнее редактирование: 15 Апрель 2019, 17:54:25 от GM »
Зачем нам бумеранг? У нас грабли есть!

Оффлайн rn3aus

  • Ветеран
  • *****
  • Сообщений: 3648
    • Просмотр профиля
Re: DDS для диапазона ДВ на микроконтроллере
« Ответ #7 : 23 Апрель 2019, 21:09:05 »
Цитировать
Александр, ну что, не выходит каменный цветок :-)?
В процессе. :)
Отвечаю здесь, чтобы не запутаться где о каком изделии идет речь.
Прошил контроллер, установил его в один из своих синтезаторов (в самый первый, еще без кнопки управления). Заработало, на выходе идет синус, все в порядке.
Сегодня хорошо продвинулся с адаптацией программы DDS_ctrl под эту прошивку и протокол управления. Установка частоты, вкл-откл PTT  и Tone работают. Соответственно, заработали все режимы, где используется управление частотой: DFCW, HELL, VOICE-FM, WSPR, JT-9.
Интересно, обнаружилось, что включение тона инвертировано: когда ставлю управляющий бит в 1 - тон выкл, а при 0 - вкл.
Пока что не совсем разобрался с управлением фазой. Протокол обмена с МК разваливается, откуда-то на приеме возникает лишний байт. Возможно, в программе управления где-то я еще не углядел и не модифицировал какую-то команду. Надеюсь скоро это выяснить.

Работа идет не быстро, так как одновременно подкорректировал свои версии прошивок, добавилась новая функциональность, да и программу управления нужно отшлифовать и проверить тщательно.

Оффлайн GM

  • Старожил
  • ****
  • Сообщений: 331
    • Просмотр профиля
Re: DDS для диапазона ДВ на микроконтроллере
« Ответ #8 : 24 Апрель 2019, 00:24:45 »
Пока что не совсем разобрался с управлением фазой. Протокол обмена с МК разваливается, откуда-то на приеме возникает лишний байт
Имеется в виду, что МК посылает лишний байт?
Зачем нам бумеранг? У нас грабли есть!

Оффлайн GM

  • Старожил
  • ****
  • Сообщений: 331
    • Просмотр профиля
Re: DDS для диапазона ДВ на микроконтроллере
« Ответ #9 : 24 Апрель 2019, 00:28:45 »
Интересно, обнаружилось, что включение тона инвертировано: когда ставлю управляющий бит в 1 - тон выкл, а при 0 - вкл.
Скорее всего, рука пронесла :-). Ну, это легко поправить, вернее, инвертировать инверсию.
Зачем нам бумеранг? У нас грабли есть!

Оффлайн rn3aus

  • Ветеран
  • *****
  • Сообщений: 3648
    • Просмотр профиля
Re: DDS для диапазона ДВ на микроконтроллере
« Ответ #10 : 24 Апрель 2019, 22:28:47 »
Все получилось! Прошивка заработала во всех режимах с хорошим качеством. Подробности и сравнение в теме http://136.su/index.php/topic,117.msg23570.html#msg23570

Оффлайн GM

  • Старожил
  • ****
  • Сообщений: 331
    • Просмотр профиля
Ну, я рад. Так что, не надо инверсию тона менять?
Зачем нам бумеранг? У нас грабли есть!

Оффлайн GM

  • Старожил
  • ****
  • Сообщений: 331
    • Просмотр профиля
Re: DDS для диапазона ДВ на микроконтроллере
« Ответ #12 : 05 Ноябрь 2020, 00:51:41 »
По просьбе Виталия UA0AET скомпилировал прошивку под МК с тактовой частотой 15 МГц.
« Последнее редактирование: 05 Ноябрь 2020, 01:05:36 от GM »
Зачем нам бумеранг? У нас грабли есть!

Оффлайн GM

  • Старожил
  • ****
  • Сообщений: 331
    • Просмотр профиля
Re: DDS для диапазона ДВ на микроконтроллере
« Ответ #13 : 19 Ноябрь 2020, 16:01:47 »
Кое-у-кого могут возникнуть сомнения по поводу прошивки фьюзов.

Описание фьюзов можно посмотреть в ТО на ATtiny2313A (doc 8246B, p.179-180, раздел 20.2 Fuse Bits).

Мои фьюзы такие: 0xFFDFFF, то есть надо установить только SPIEN бит, остальные биты можно НЕ ТРОГАТЬ. У меня установить, означает запрограммировать или выставить в 0.

В АВР-студио это выглядит, как на фото.
Зачем нам бумеранг? У нас грабли есть!