RSS

Arduino DDS — синтезатор частоты на базе AD9851 под управлением Arduino.

19 Сен
Arduino DDS — синтезатор частоты на базе AD9851 под управлением Arduino.

Это мой вариант широко известного синтезатора частоты на базе китайской
платы на микросхеме AD9851 под управлением Arduino UNO.
Синтезатор частоты обладает несколькими дополнительными функциями, вроде генератора качающейся частоты и работы в качестве гетеродина (с вычитанием промежуточной частоты). Подробно об этом под катом.

view1


примерная схема платы DDS такова: (представлена для варианта на AD9850)
ad9850-module
В моём варианте устройства предусмотрены 3 режима работы (переключение тумблером на 3 положения):

1. Режим генератора.
В этом режиме синтезатор работает как генератор синусоидального сигнала от 5Гц до 60МГц (микросхема AD9851 позволяет синтезировать частоты до 70 мгц, но, учитывая снижение при частотах выше 50 МГц амплитуды сигнала и его качества, я ограничил диапазон). Шаг изменения можно последовательно менять кнопкой энкодера от 1 ГЦ до 1 МГц (1Гц, 10Гц, 100Гц, 1КГц, 10КГц, 100КГц, 1МГц). Так же при нажатии на дополнительную кнопку в режиме генератора происходит переключение к величине шага 1КГц из любой позиции.

2. Режим работы в качестве гетеродина
В этом режиме на дисплей выводится частота с учётом ПЧ (Fвых = Fдисп + Fпч).
Нужные значения ПЧ заносятся в программу перед заливкой её в Arduino. Выбор ПЧ
последовательно осуществляется дополнительной кнопкой.

3. Режим качания частоты
В этом режиме происходит качание частоты начиная от частоты на дисплее и вверх до достижения выбранного предела. Ширина качания в этом режиме выбирается нажатием на дополнительную кнопку.

В данной программе установлены следующие величины ширины качания:
1КГц — шаг 1Гц
5КГц — шаг 1Гц
10КГц — шаг 2Гц
50КГц — шаг 5Гц
100КГц — шаг 10Гц

При необходимости величины ширины и шага можно настроить самостоятельно в программе перед заливкой её в Arduino.

Схема соединений следующая:

ardu_dds_dig

Китайская плата обеспечивает размах выходного напряжения порядка 0.8-1.0 Vp-p.
Я решил добавить в своё устройство выходные усилители.
Первый — на операционном усилителе TL082C.

ARDU_DDS_LF.JPG

Диапазон частот этого усилителя 5Гц-100КГц. Максимальный неискажённый сигнал в диапазоне частот при напряжении питания 12V составил 8Vp-p. Входным потенциометром я выставил уровень входного сигнала для получения на выходе 4Vp-p. Конденсатор С4 служит для компенсации возможного снижения коэффициента усиления на ВЧ (мне не понадобился).

Второй усилитель предназначен для усиления в диапазоне 10КГц — 60МГц. (Реально коэффициент усиления линеен от 5 КГц)

ardu_dds_hf

Конденсатор С3 (необязателен) служит для компенсации снижения амплитуды сигнала выше 30 Мгц. Регулировкой  потенциометра R2 добиваются напряжения на эммитере VT2 равного половине напряжения питания. (Получается порядка 180-200 ом, можно попробовать запаять простой резистор).
Кроме того на схеме не обозначено, что питание на усилитель идёт через RC цепочку R=27Ом, С=0.1мкф.
Входным потенциометром я так же выставил уровень выходного сигнала 4Vp-p.

Кроме того я добавил переключатель, включающий между DDS и усилителями аттенюатор (резистор 20к) дающий ослабление порядка -20ДБ.

Печатная плата усилителей (двухсторонняя):

amp_plate

Фото платы усилителей:

amp_pic

Главная плата:

main

Схемы питания не отображены на принципиальных схемах. Лишь замечу, что использованный трансформатор выдаёт по вторичке 7V — использовано для питания Arduino и получения 5V стаб. для платы DDS и LCD, и 14V — получено 12V стаб. для питания выходных усилителей. Стабилизаторы простейшие на 7805 и 7812. По плате «разбросаны» конденсаторы по питанию 0.1 мкф. В общем всё стандартно — даже лень рисовать.

topview

Скачать печатные платы для Sprint Layout 6.

Программа для Arduino UNO лежит по этой ссылке. Тут же и библиотека для энкодера. Возможно программа несовершенна, но работоспособна и снабжена большим количеством комментариев. Так что флаг в руки — если кто интересуется, разбирайтесь переделывайте, совершенствуйте.

Вид сзади:

back
Примеры устройства в работе:

mode_osc

Режим генератора

mode_sweep

Генератор качающейся частоты (sweep)

mode_vco

Режим гетеродина (отображение ПЧ = 455кГц)

sweep

Гифка — демо в режиме ГКЧ. Начальная частота 1 КГц, ширина качания — 5КГц

ССЫЛКИ:
Печатные платы для Sprint Layout 6.
Библиотека «rotary» для обработки энкодера под Arduino.
Программа синтезатора частоты под Arduino.

Сохранить

Реклама
 
45 комментариев

Опубликовал на 19.09.2016 в Электроника

 

Метки: , , ,

45 responses to “Arduino DDS — синтезатор частоты на базе AD9851 под управлением Arduino.

  1. Андрей

    14.12.2016 at 22:42

    Доброго времени суток В написании программ не шибко силен возможно в программе изменить назначение выводов А2 , А3 , А4 , А5 наоборот? (А2-reset A3-data A4-FU_UD A5-clk)

     
  2. krepsky

    18.12.2016 at 19:56

    В этих строках программы определяются назначения выводов.
    //Определения
    #define W_CLK A2 // A2 — connect to AD9851 module word load clock pin (CLK)
    #define FQ_UD A3 // A3 — connect to freq update pin (FQ)
    #define DATA A4 // A4 — connect to serial data load pin (DATA)
    #define RESET A5 // A5 — connect to reset pin (RST)
    Можно назначить их по своему усмотрению

     
  3. Аноним

    24.12.2016 at 20:19

    Добрый вечер Благодарю

     
  4. Андрей

    24.12.2016 at 20:20

    Благодарю!

     
  5. Андрей

    26.12.2016 at 19:30

    Доброго времени суток При компиляции выдает ошибку «DIR_CW» не обьявлена в этой области Указанную Вами библиотеку на энкодер установить не удалось (программа ругается пишет что библиотеку нельзя подключить) Я нашел похожую установил думаю что какието отличия все же есть Вы не подскажете что это за переменная? Судя из кода программы я думаю что «DIR_CW» и «rx2» это одно и тоже Обьясните пожалуйста Заранее благодарю Андрей

     
  6. krepsky

    29.12.2016 at 15:16

    DIR_CW — это результат работы подпрограммы энкодера. Он означает, что вращение было по часовой стрелке, следовательно частоту (rx) надо увеличить. Для работы программы нужна именно версия библиотеки, ссылка на которую приведена тут.
    Немного не понимаю, что значит «не удалось установить библиотеку». Просто папку «Rotary» из приложенного архива кладём сюда:
    c:\Program Files (x86)\Arduino\libraries\
    и в начале своей программы подключаем библиотеку (видно в оригинале программы).

     
  7. Андрей

    29.12.2016 at 20:40

    С Наступающим Вас Новым годом! Здоровья и творческих успехов в новом году! Благодарю за помощь буду дерзать дальше. Библиотека была в списке библиотек но не подключалась в исходнике (#includ этой надписи не было) и она называлась ritary.h почему-то. Подключал обычным способом с помощью «скетч» и далее. Благодарю Андрей.

     
  8. Андрей

    29.12.2016 at 21:09

    Большое Вам спасибо !!! Все нормально установилось и все работает. Андрей

     
  9. Геннадий

    29.12.2016 at 21:50

    Благодарность автору за проделанную работу и опубликованный исходник!
    Все отлично работает. За неимением валкодера поставил 2 обычные микрокнопки и пару резисторов к ним 10к с +5V, без которых на входах процессора нулевой потенциал. Ограничение набора частоты увеличил до 100 МГц, но реально на аппаратном уровне ограничение происходит на частоте 90 МГц, что проверено приемником, осциллограф выходной сигнал на такой частоте уже не отображает.

     
  10. Вячеслав

    05.01.2017 at 18:59

    Здравствуйте!Большое спасибо за вашу разработку!Подскажите,как синхронизировать ваш гкч с осциллографом чтоб можно было на осциллографе смотреть ачх?

     
  11. Геннадий

    05.01.2017 at 21:27

    Вячеслав: Тоже думал над этим вопросом. На мой взгляд, осциллограф использовать для снятия АЧХ, (из-за низкой скорости качания частоты) не так удобно, как компьютер. Будет гораздо лучше, если, например, выходной сигнал (от исследуемого объекта) выпрямить и подать на свободных вход АЦП Ардуино, который, в свою очередь, передаст по USB каналу информацию на компьютер, где по полученной таблице из терминала в Excel , а лучше в специально написанном для того приложении, можно построить график АЧХ.

     
  12. Вячеслав

    06.01.2017 at 11:04

    А можно приспособить дисплей чтоб получилась автономная система?Есть отличный дисплей под arduino mega цветной с нормальными библиотеками.Если у вас есть время,не смогли бы Вы набросать код для отрисовки?Я бы прислал Вам дисплей и мегу для экспериментов.

     
  13. Геннадий

    06.01.2017 at 13:10

    Тоже хорошая идея. К сожалению, тот дисплей, что есть у меня, имеет два ряда рабочих контактов и в данном проекте его не применить, но на будущее можно обдумать вариант. Короче, нужен OLED Дисплей с интерфейсом I2C.

     
  14. Вячеслав

    06.01.2017 at 13:20

    Oled дорогие дисплеи а с i2c полагаю будет очень медленная прорисовка,я бы хотел предложить такой дисплей для меги https://ru.aliexpress.com/item/3-2-inch-TFT-LCD-screen-module-Ultra-HD-320X480-for-Arduino-MEGA-2560-R3-Board/32604352555.html?spm=2114.13010608.0.0.uVsm3b он луший из дешевых,достаточно большой и шустрый,после для более быстрой работы можно будет использовать due.Наверно на вход лучше поставить логарифмический усилитель ad8310.

     
  15. Аноним

    18.01.2017 at 12:21

    Не могу разобрать номиналы конденсаторов С1,С3. в схеме усилителя

     
  16. Геннадий

    18.01.2017 at 13:58

    Там, где стоят операционники, С1, С3 — электролиты 10 мкФ.

     
  17. Аноним

    18.01.2017 at 14:56

    Схема на транзисторах. 1мкф?

     
  18. Геннадий

    18.01.2017 at 15:55

    Да, 1 мкФ.

     
  19. Аноним

    23.01.2017 at 11:53

    Приветствую всех! 2 вопроса по схеме: можно применить AD9850 частота 125МГц?. Почему не изменяется частота на дисплее (пробовал с энкодером и просто кнопки)
    Заранее спасибо!

     
  20. Геннадий

    23.01.2017 at 15:00

    Энкодер не работает если нет резисторов 10к на +5V от его контактов.

     
  21. Андрей

    30.01.2017 at 18:03

    почему такая ошибка?
    и можно ли ставить AD9850 вместо AD9851 ?они одинаковы по коду?

    AD9851_rev2_rotary.ino: In function ‘void setup()’:
    AD9851_rev2_rotary:56: error: ‘PCICR’ was not declared in this scope
    AD9851_rev2_rotary:56: error: ‘PCIE2’ was not declared in this scope
    AD9851_rev2_rotary:57: error: ‘PCMSK2’ was not declared in this scope
    AD9851_rev2_rotary:57: error: ‘PCINT18’ was not declared in this scope
    AD9851_rev2_rotary:57: error: ‘PCINT19’ was not declared in this scope
    AD9851_rev2_rotary:12: error: ‘A3’ was not declared in this scope
    AD9851_rev2_rotary.ino:59:11: note: in expansion of macro ‘FQ_UD’
    AD9851_rev2_rotary:11: error: ‘A2’ was not declared in this scope
    AD9851_rev2_rotary.ino:60:11: note: in expansion of macro ‘W_CLK’
    AD9851_rev2_rotary:13: error: ‘A4’ was not declared in this scope
    AD9851_rev2_rotary.ino:61:11: note: in expansion of macro ‘DATA’
    AD9851_rev2_rotary:14: error: ‘A5’ was not declared in this scope
    AD9851_rev2_rotary.ino:62:11: note: in expansion of macro ‘RESET’
    AD9851_rev2_rotary.ino: At global scope:
    AD9851_rev2_rotary:253: error: expected constructor, destructor, or type conversion before ‘(‘ token

     
  22. Андрей

    30.01.2017 at 18:39

    всё отлично, не та плата выбрана была. компиляция прошла.

     
  23. Андрей

    31.01.2017 at 18:19

    Экран работает, энкондер тоже, но нет выхода частоты, возможно ли то что я применил AD9850?

     
  24. Андрей

    01.02.2017 at 19:21

    Вечер добрый Посмотри в скетче // расчет частоты на основе документации… В строке tfr_byte(0x000); для 9850 должно быть 0х000 !!!

     
  25. Андрей

    01.02.2017 at 19:22

    Я собрал на ардуино-нано и ад9850

     
  26. Андрей

    01.02.2017 at 23:40

    tfr_byte(0x000); // Final control byte, LSB 1 to enable 6 x xtal multiplier on 9851 set to 0x000 for 9850

    огромное спасибо, как то и не заметил в коде 🙂
    Спасибо и автору!!!

     
  27. Андрей

    02.02.2017 at 18:36

    Вечер добрый. Не за что. Главное что получилось:)

     
  28. Андрей

    08.02.2017 at 09:53

    хочу встроить вольтметр для вых напряжения генератора , вот код
    void setup() {
    // put your setup code here, to run once:
    const int analogInPin = A1; // Analog input pin
    float outputValue = A1

    }

    void loop() {

    outputValue = float(analogRead(analogInPin))/204,6;

    lcd.setCursor(14,1);
    lcd.print(«V «);
    lcd.print(outputValue);
    delay(500);
    }

    но куда его встроить в код?
    пробовал в некоторые места, но цифры от 0-100кгц на пределе пляшут
    если выставить 100кгц и более то нормально, видать кто то в коде обрывает показания считывания.
    измеряю пока напряжения 5в.
    может у кого получится. спасибо

     
  29. Андрей

    08.02.2017 at 23:00

    Доброго времени суток. Выходной сигнал -это переменный ток Есть амплитудное значение есть действующее (в корень из 2 меньше амплитудного). По идее надо в схему детектор ставить и после него измерять

     
  30. Андрей

    09.02.2017 at 09:46

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

     
  31. Андрей

    09.02.2017 at 12:21

    День добрый. По логике измерения надо производить после установки и отправки частоты в синтезатор. Задержка будет .АЦП ведь надо время на преобразование измеренного напряжения.

     
  32. Андрей

    09.02.2017 at 13:42

    после установки и отправки частоты в синтезатор.
    а не подскажите в какой кусок кода вставить его? я уже пробовал разные варианты, толку нет.
    но заметил такую особенностьт, если мы измеряем когда генератор работает с вычетом ПЧ, то вольтметр работает отлично на разных диапазонах, но как только я ставлю
    int_fast32_t wif=450000; // рабочее значение IF переделываю в
    int_fast32_t wif=000000; // рабочее значение IF
    оно всё возвращается назад. показания пляшут.

     
  33. Андрей

    09.02.2017 at 21:29

    Я не силен в программировании но думаю так , что надо выделить измерение напряжения в отдельную подпрограмму , а потом вставить ее. В скетче есть раздел с программами — код написать там а потом пробывать .

     
  34. Андрей

    09.02.2017 at 21:33

    В скетче есть раздел с подпрограммами-код написать в нем , а потом вставить ее в основной код.

     
  35. Андрей

    09.02.2017 at 21:51

    я тоже, но спасибо и за это 🙂

     
  36. Денис

    01.03.2017 at 19:36

    КТО нибудь помогите, не могу понять как настроить правильно свой синтез к трансиверу на кварцах 8Мгц, на примере диапазона 3.500-3.800 Мгц Есть изменяемые параметры
    DDS-SYSTEM-CLK от 30до 190 Мгц.
    MIN_RX_DDS_FREQ это я так понял сюда вбить 3.500Мгц
    MAX_RX_DDS_FREQ сюда 3.800Мгц
    SSB_OFFSET:
    CW_OFFSET регулирование тонкой настройки я так думаю
    OFFSET_FREQ тут можно вбить Мгц на + и на — какойто сдвиг
    Вот такой вот дивайс есть перевод описания где ни чего не понять https://ru.aliexpress.com/item/0-55MHz-AD9850-Module-DDS-Signal-Generator-Shortwave-radio-Wave-band-for-HAM-Radio-SSB6-1/32659063125.html?spm=2114.03010208.8.14.DOTBmx

     
  37. Стас

    28.03.2017 at 13:43

    Добрый день. Хорошое устройство, но для полноты ГКЧ необходим или детектор для снятия ачх и вывод данных в РС или выход синхронизации для осцилографа. А так фунция ГКЧ вобщем-то не нужна. Могло бы получится устройство на подобии NWT.

     
  38. Артем

    19.04.2017 at 20:28

    Как выполнить полноценный синтезатор частоты, чтобы пч складывалась и отнималась?

     
  39. krepsky

    06.05.2017 at 07:35

    В исходнике программы в общем то видно, где делается сложение ПЧ. Точно так же прописываем вычитание. Как вариант — заносим значение ПЧ с отрицательным знаком. Только с индикацией надо будет разобраться — что-бы корректно выводился «минус». Если есть базовые знания в среде Arduino IDE — ничего сложного.

     
  40. krepsky

    06.05.2017 at 07:45

    А про функцию ГКЧ — полностью согласен. Ввёл её чисто по принципу — раз делается легко, то почему бы и не сделать. По правде эта часть программы сильно не оптимизировалась. ГКЧ можно сделать и получше. Но и в таком виде несколько раз использовал для простых задач.

     
  41. Алексей

    27.05.2017 at 07:22

    Подскажите пожалуйста, при нажатии кнопки (именно кнопки шага частоты) энкодера или выбора режима работы генератора на дисплее видно как например шаг частоты устанавливается с 1кГц на 10кГц но ч-з секунду само устанавливается в 1кГц, тоже самое с режимами работы генератора. Единственное что корректно работает — это изменение частоты. После изменения частоты, на дисплее она остается такой, какой я её установил. Скетч оригинальный, ничего не исправлял, использую ардуино уно. В чем может быть проблема?

     
  42. Алексей

    27.05.2017 at 07:23

    Ещё заметил что значение «1 KHz» на дисплее с большой частотой моргает, как будто быстро обновляется.

     
  43. Алексей

    27.05.2017 at 07:57

    И как переводить генератор в другие режимы работы? Я пробовал поочередно цеплять 0 и 1 пины ардуины на землю, но при этом просто начинают расти значения SWP и IF, т.е. самого переключения в эти режимы не происходит (сужу визуально по дисплею, сам AD9851 не подключен). И как только снимаю с земли 0 или 1 пины то на дисплее снова включается OSC.MODE

     
  44. krepsky

    28.05.2017 at 07:15

    Кнопка S4 не зажата ли случайно?

     
  45. Юрий

    02.06.2017 at 16:14

    Помогите . Скетч взят отсюда ,исправлено в нем только для 9850 должно быть 0х000 . Показывает на экране только OSC MODE.Переключатель переключаю НИЧЕГО НЕ МЕНЯЕТСЯ на экране.Энкодер кручю НИЧЕГО НЕ МЕНЯЕТСЯ (резисторы подключены на +) ,кнопкой энкодера меняется диапазон 1кгц…10мгц. Доп.кнопкой переключает на 1кгц..На выходе генератора не мерил сигнал .пока нечем…..

     

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

 
%d такие блоггеры, как: