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

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

Оффлайн GM

  • Пользователь
  • **
  • Сообщений: 76
    • Просмотр профиля
Коллеги, предлагаю вашему вниманию программу, формирующую синусоидальный сигнал методом прямого синтеза (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

  • Пользователь
  • **
  • Сообщений: 76
    • Просмотр профиля
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 »

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

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

Оффлайн GM

  • Пользователь
  • **
  • Сообщений: 76
    • Просмотр профиля
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 »