DEV Community

Cover image for Плата DDS генератора AD9833
Alexey Bolshakov
Alexey Bolshakov

Posted on

Плата DDS генератора AD9833

Image AD9833

Плата с DDS генератором частоты на базе микросхемы AD9833. Приобретена в качестве источника тактового сигнала, перестраиваемого по частоте. На плате установлен генератор на 25 МГц. Может генерировать сигналы от 0 до 12.5 МГц (но не во всем диапазоне вас устроит форма сигнала). Можно переключать форму сигнала: синус, пила, меандр. Всё, что нужно, выведено на штыревые контакты. Управляется по SPI. Архитектурно содержит один 28-битный регистр аккумулятора, два регистра приращения, два регистра фазы. В один момент времени может быть выбрана только одна из двух пар. Это позволит, если необходимо, сформировать частотную модуляцию сигнала без разрыва фазы или фазовую модуляцию. Однако, отдельного входа выбора пары нет, переключение возможно только командами по SPI.

Далее осциллограммы


Стенд

Для управления DDS нужно подавать команды по SPI. Использую STM8 (STM8S105K4T6) и его аппаратный SPI. Очень важно было найти правильный режим работы SPI. Для STM8 (и наверняка для STM32) это будет mode 2 (CPOL = 1 and CPHA = 0). Подробнее, см. документацию(RM0016 - STM8S Series and STM8AF Series 8-bit microcontrollers (20.4 SPI registers)). Осциллограф С1-112А полоса 10 МГц, щуп китайский на 100 китайских МГц (P6100). Мультиметр Aneng M20 в качестве частотомера.

Прошивку для микроконтроллера в привычном для всех виде я не писал. Просто поставил на микроконтроллер STM8 систему eForth и далее подключался к нему через консоль. И уже в консоли отправлял команды через SPI, задав перед этим необходимые промежуточные слова. Выглядело это примерно вот так

...

: word.hi $0100 / ;
: word.lo $00ff and ;

: spi_wr8 SPI_DR c! TXE? ;
: spi_wr16  dup word.lo swap word.hi spi_wr8 spi_wr8 ;
: spi_wr16n dup word.lo swap word.hi nss.lo spi_wr8 spi_wr8 BSY? nss.hi ;
: spi_wr32n nss.lo spi_wr16 spi_wr16 bsy? nss.hi ;

...

$2100 spi_wr16n         // reset
$5c20 $4a3d spi_wr32n   // freq0
%0111111111111111 %0100000000000000 spi_wr32n   // freq0
%0111111111111111 spi_wr16n %0100000000000000 spi_wr16n
$9c29 $8a3d spi_wr32n   // freq1
$c000 spi_wr16n         // phase0f
$e000 spi_wr16n         // phase1
$2000 spi_wr16n         // sine
$2020 spi_wr16n         // square
$2002 spi_wr16n         // saw      
Enter fullscreen mode Exit fullscreen mode

Получилось, что я пользовался системой интерактивно, а не перепрошивая каждый раз. Мне такой подход напоминает работу с Erlang виртуальной машиной, когда можно на ходу отлаживать и менять работающий код.

Image stage

Осциллограммы

Синус 1 КГц

Image Синус 1 КГц

10 КГц, 50 КГц, 100 КГц, 500 КГц, 2 МГц, 4 МГц, 8 МГц
10 КГц
Image 10 КГц

50 КГц
Image 50 КГц

100 КГц
Image 100 КГц

500 КГц
Image 500 КГц

2 МГц
Image 2 МГц

4 МГц
Image 4 МГц

8 МГц
Image 8 МГц


Пила 1 КГц
Image Пила 1 КГц

10 КГц, 50 КГц, 100 КГц, 500 КГц, 2 МГц, 4 МГц, 8 МГц
10 КГц
Image 10 КГц

50 КГц
Image 50 КГц

100 КГц
Image 100 КГц

500 КГц
Image 500 КГц

2 МГц
Image 2 МГц

4 МГц
Image 4 МГц

8 МГц
Image 8 МГц


На 2 МГц уже видно плавающие пики пилы. На 4 МГц видно уже очень отчетливо. Ну и на 8 МГц у нас получается 25/8 = 3,125 отсчета на период.

Исключительно ради изучения своего осциллографа и щупов, попробовал меандр. Правда сетку частот пересчитывать было лень. В режиме меандра, период в 2 раза длиннее, поэтому частоты получились другие.

5 КГц

25 КГц, 250 КГц, 1 МГц, 2 МГц, 4 МГц
25 КГц
Image 25 КГц

250 КГц
Image 250 КГц

1 МГц
Image 1 МГц

2 МГц
Image 2 МГц

4 МГц
Image 4 МГц

4 МГц более развернуто
Image 4 МГц wide




Начиная с 1 МГц, ясное дело - джиттер, на 2 МГц его видно на осциллограмме.

Кстати (для тех, кто не в курсе), важно, что на высоких частотах, чтобы не портить фронты, нужно использовать щуп в режиме 1:10, чтобы он меньше влиял на схему (а еще лучше не использовать крокодил). Но потребуется усилить сигнал в 10 раз уже на входном усилителе осциллографа.

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

Для сравнения, фото, как выглядит один и тот же сигнал - меандр 2 МГц, но 1Х или 10Х

2 МГц - 1х
Image 2 МГц - 1х

2 МГц - 10х
Image 2 МГц - 10х

Кстати, родной щуп от С1-112А тоже неплох
Image щуп от С1-112А

2 МГц - 10х
Image 2 МГц - 10х

Выводы

Эту плату я брал для экспериментов в области создания гибридного синтеза звука своего синтезаторного проекта. В дальнейшем планируется использовать для модуля генератора DCO (Digital VCO) но не с фиксированной частотой Master Clock а с частотой, кратной частоте генерации, для того, чтобы DAC в DCO использовал всю свою шкалу и разрядность, не пропускал шаги. Все это в рамках борьбы с потерей точности генерации, борьбы с алиасингом... Но это уже совсем другая история

Ссылки

1 Исходная версия этой статьи

https://mysku.club/blog/aliexpress/79168.html

2 eForth - язык Forth для микроконтроллеров

https://github.com/TG9541/stm8ef/wiki/STM8-eForth-Programming

3 Ссылки по моему синтезаторному проекту

https://github.com/UA3MQJ/fpga-synth/wiki

https://github.com/VitaSound/hdl-modules

https://soundcloud.com/vitasynth

http://www.youtube.com/channel/UCGi-A9KGhKhKzVT_baVw3HA

https://vk.com/vitasound

https://boosty.to/vitasound

Top comments (0)