Андрей Смирнов
Время чтения: ~15 мин.
Просмотров: 255

РадиоКот :: DDS генератор на AD9833

AD9833 — это программируемый генератор сигналов с низким энергопотреблением. Позволяет генерировать сигналы с частотой до 12.5МГц синусоидальной, треугольной и прямоугольной формы. Программирование осуществляется с использованием трехпроводного интерфейса SPI и не составляет труда. Ниже приведены основные характеристики микросхемы:

  • Цифровое программирование частоты и фазы.
  • Потребляемая мощность 12.65 мВт при напряжении 3 В.
  • Диапазон выходных частот от 0 МГц до 12.5 МГц.
  • Разрешение 28 бит (0.1 Гц при частоте опорного сигнала 25 МГц).
  • Синусоидальные, треугольные и прямоугольные выходные колебания.
  • Напряжение питания от 2.3 В до 5.5 В.
  • Трехпроводной интерфейс SPI.
  • Расширенный температурный диапазон: от –40°C до +105°C.
  • Опция пониженного энергопотребления.

Более подробную информацию вы можете найти в даташите. В характеристиках также заявлено, что микросхема не требует внешних компонентов, но здесь производитель лукавит: обвязка и источник опорной частоты все же нужны. На Али продаются модули AD9833 с необходимой обвязкой и кварцевым генератором на 25 МГц, как раз с таким модулем я и собираюсь экспериментировать. Данный модуль имеет следующие выводы:

  • VCC – плюс питания для цифровых и аналоговых цепей генератора.
  • DGND – цифровая земля.
  • SDATA – вход данных интерфейса SPI. Передача осуществляется 16-битными словами.
  • SCLK – вход тактового сигнала SPI. Используется второй режим работы: (CPOL = 1, CPHA = 0).
  • FSYNC – выбор микросхемы. Перед началом передачи данных должен быть установлен в 0, по завершении в 1.
  • AGND – аналоговая земля.
  • OUT – выход генератора.

Попробуем подключить этот модуль к Ардуино и научиться им управлять. Для начала ознакомимся с его функциональной схемой:AD9833_Functional_Diagram.png AD9833 состоит из следующих основных частей: два регистра выбора частоты, аккумулятор фазы, два регистра выбора фазы и сумматор смещения фазы (вместе эти компоненты составляют генератор с цифровым управлением — NCO), SIN ROM для преобразования информации о фазе в амплитуду и 10-разрядный цифро-аналоговый преобразователь. Из схемы видно, что данные с интерфейса SPI передаются в управляющий регистр, регистры выбора фазы и частоты. Именно они определяют сигнал на выходе генератора. И программирование генератора сводится к изменению содержимого указанных регистров.

Управляющий регистр

Это 16-разрядный регистр, управляющий работой генератора. Подробное описание его битов приведено ниже в таблице. Схема из даташита также наглядно демонстрирует их назначение:AD9833_Control_Bits.png

Бит Название Назначение
15, 14 DB15, DB14 Чтобы AD9833 понял, что принятое по SPI 16-битное слово содержит новое значение для управляющего регистра, два старших бита в слове должны быть установлены в 0.
13 B28 Регистры частоты AD9833 имеют разрядность 28 бит, поэтому для изменения их содержимого требуется передача двух 16-битных слов. Однако в некоторых случаях требуется изменить только старшую или младшую часть регистра частоты. Здесь и используется данный признак: B28 = 1 говорит о том, что необходимо обновить регистр частоты целиком и его новое значение будет передано двумя последовательными записями. Первая запись содержит 14 младших бит, вторая 14 старших бит. Первые два бита в обеих записях определяют регистр частоты, в который будет записано передаваемое значение и должны быть одинаковыми. Обновление регистра частоты происходит после получения полного слова, поэтому запись промежуточного значения в регистр исключена. B28 = 0 позволяет обновить отдельно старшую или младшую часть регистра. Какая именно часть будет изменена определяется управляющим битом HLB.
12 HLB Бит HLB определяет, какая из частей регистра частоты (младшая или старшая) будет перезаписана. Используется при B28 = 0. При B28 = 1 значение этого бита игнорируется. HLB = 1 позволяет обновить старшие 14 бит регистра частоты; HLB = 0 позволяет обновить младшие 14 бит регистра частоты.
11 FSELECT Бит FSELECT определяет, какой из регистров используется в аккумуляторе фазы – FREQ0 или FREQ1.
10 PSELECT Бит PSELECT определяет, данные какого из регистров PHASE0 или PHASE1 добавляются к выходу аккумулятора фазы.
9 Зарезервирован Данный бит зарезервирован и должен быть установлен в 0.
8 RESET RESET = 1 сбрасывает внутренние регистры генератора в 0. Сброс не затрагивает регистры управления, частоты и фазы.
7 SLEEP1 При SLEEP1 = 1 запрещается внутреннее тактирование, приостанавливается работа NCO и выход генератора остается в своем текущем состоянии. При SLEEP1 = 0 тактирование разрешено.
6 SLEEP12 При SLEEP12 = 1 отключается внутренний ЦАП. Это может быть полезно для генерации прямоугольных импульсов, при которой не требуется выполнение цифро-аналоговых преобразований. При SLEEP12 = 0 внутренний ЦАП активен.
5 OPBITEN Данный бит вместе с битом MODE управляют выходом генератора. При OPBITEN = 1 внутренний ЦАП отключается от выхода VOUT и для генерации выходного сигнала используется значение старшего значащего бита с входа ЦАП, что позволяет получить на выходе генератора прямоугольные импульсы.
4 Зарезервирован Данный бит зарезервирован и должен быть установлен в 0.
3 DIV2 Используется в паре со значением OPBITEN = 1. При DIV2 = 1 значение старшего значащего бита данных с входа ЦАП подается напрямую на выход VOUT. DIV2 = 0 позволяет задействовать делитель частоты и уменьшить частоту выходного сигнала вдвое. При OPBITEN = 0 значение данного бита игнорируется.
2 Зарезервирован Данный бит зарезервирован и должен быть установлен в 0.
1 MODE Данный бит вместе с битом OPBITEN управляют выходом генератора. При OPBITEN = 1 бит MODE должен быть установлен в 0. Значение MODE = 0 позволяет получить на выходе генератора синусоидальный сигнал. При MODE = 1 на выходе будет треугольный сигнал.
Зарезервирован Данный бит зарезервирован и должен быть установлен в 0.

И для лучшего понимания назначения битов OPBITEN, MODE и DIV2 я приведу таблицу с их допустимыми комбинациями и формой результирующих сигналов на выходе:

OPBITEN MODE DIV2 Сигнал на выходе VOUT
X Синусоидальный
1 X Треугольный
1 Прямоугольный с частотой F/2
1 1 Прямоугольный с частотой F
1 1 X Зарезервировано

Регистры частоты и фазы

Генератор AD9833 имеет 2 регистра частоты и 2 регистра фазы разрядностью 28 бит и 12 бит соответственно.  Выбор активного регистра частоты осуществляется установкой управляющего бита FSELECT: при FSELECT = 0 активным является FREQ0; при FSELECT = 1 активен регистр FREQ1. Результирующая частота на выходе генератора определяется следующим образом: (FMCLK / 228) * FREQREG, где FMCLK – это опорная частота, FREQREG – значение, загруженное в активный регистр частоты. Таким образом, если мы хотим получить на выходе генератора сигнал с частотой 400Гц при опорной частоте 25МГц, в активный регистр  должно быть загружено значение: FREQREG = FOUT*228 / FMCLK = 400Гц * 228 / 25МГц ≈ 4295 (2π / 212) * PHASEREG соответственно, значение для регистра фазы вычисляется по формуле: PHASEREG = PHASE*212 / 2π

Тестовая программа для AD9833 на Ардуино

Теперь мы можем написать первую программу для AD9833. Схема подключения модуля AD9833 к Ардуино и скетч приведены ниже.AD9833_Arduino.png С подключением все просто: общение с модулем происходит по интерфейсу SPI, для которого на Ардуино отведены следующие пины: D10 — SS (Slave Select — выбор ведомого), к нему подключаем вывод FSYNC модуля. D11 — MOSI (Master Out Slave In — выход ведущего, вход ведомого), к нему подключаем вывод SDATA. D13 — SCK (Serial Clock — Тактовый сигнал), к нему подключаем вывод SCLK.

voidsetup() {   SPI.begin();   WriteAD9833(0x2100);    WriteAD9833(0x50C7);    WriteAD9833(0x4000);    WriteAD9833(0xC000);    WriteAD9833(0x2000);  }  void WriteAD9833(uint16_t Data){   SPI.beginTransaction(SPISettings(SPI_CLOCK_DIV2, MSBFIRST, SPI_MODE2));   digitalWrite(SS, LOW);   delayMicroseconds(1);   SPI.transfer16(Data);   digitalWrite(SS, HIGH);   SPI.endTransaction(); }  voidloop() {   WriteAD9833(0x2000);    delay(5000);   WriteAD9833(0x2002);    delay(5000);   WriteAD9833(0x2020);    delay(5000);   WriteAD9833(0x2028);    delay(5000);  }

В данном скетче выполняются следующие действия:

  • При первом вызове функции WriteAD9833 производится установка управляющего регистра: бит RESET устанавливается в 1 для выполнения сброса; бит DB28 устанавливается в 1 для перезаписи всего содержимого регистра частоты; биты FSELECT и PSELECT содержат 0, поэтому для генерации выходного сигнала будут использоваться регистры FREQ0 и PHASE0.
  • Следующие два вызова передают значение 4295 в регистр частоты FREQ0. Данное значение умещается в 14 младших разрядах, поэтому в старшие разряды регистра записываем нули.
  • Сдвиг по фазе не требуется — запишем в регистр PHASE0 значение 0
  • Последним вызовом WriteAD9833 в процедуре setup снимаем бит RESET, разрешая тем самым работу генератора. Результирующий сигнал поступает на вывод VOUT.
  • Следующие вызовы WriteAD9833 в функции loop обновляют содержимое управляющего регистра, перебирая комбинации битов MODE, OPBITEN и DIV2 для генерации сигнала синусоидальной, треугольной и прямоугольной форм.

Вот как выглядит выходной сигнал генератора в виртуальном осциллографе:

Синусоидальный сигнал (биты MODE и OPBITEN сброшены в 0)
Треугольный сигнал (MODE = 1, OPBITEN = 0)
Прямоугольный сигнал (OPBITEN = 1, MODE = 0, DIV2 = 1)
Прямоугольный сигнал (OPBITEN = 1, MODE = 0, DIV2 = 0)

Обратите внимание: при генерации синусоидальных и треугольных импульсов, когда сигнал снимается с выхода ЦАП, его амплитуда изменяется в диапазоне 38мВ…0,65В. При генерации импульсов прямоугольной формы мы имеем дело с обычным цифровым сигналом с соответствующими уровнями напряжения. Так в последних двух осциллограммах логической единице соответствует напряжение ~4,5В.

Генератор на AD9833 с дисплеем и энкодером

Разобравшись с управлением AD9833 можно приступать к созданию генератора с интерфейсом управления и индикацией. Для этого добавим в нашу схему энкодер вращения и жидкокристаллический дисплей:Ранее я писал о том, как можно сделать меню на Ардуино с энкодером вращения. И сейчас я взял такое меню за основу скетча, добавив в него функционал для работы с AD9833. Скачать скетч можно по ссылке. При включении питания AD9833 настраивается на генерацию синусоидального сигнала частотой 100Гц, соответствующая информация отображается на дисплее. Вращая ручку энкодера можно изменять его частоту, а при нажатии вызывается меню. В меню доступны следующие опции:

  • Установка частоты (можно задать произвольное значение от 1 до 12,5МГц).
  • Установка фазы (0 — 360°).
  • Выбор формы сигнала.
  • Выбор значения, на которое изменяется частота при вращении ручки энкодера.

Остается только поместить все компоненты в подходящий корпус и получится законченное устройство. Результат работы в следующем ролике:

  • Цена: $ 1.61

Плата с 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 в качестве частотомера.

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

Синус 1 КГц10 КГц, 50 КГц, 100 КГц, 500 КГц, 2 МГц, 4 МГц, 8 МГц10 КГц 50 КГц 100 КГц 500 КГц 2 МГц 4 МГц 8 МГц Пила 1 КГц10 КГц, 50 КГц, 100 КГц, 500 КГц, 2 МГц, 4 МГц, 8 МГц10 КГц 50 КГц 100 КГц 500 КГц 2 МГц 4 МГц 8 МГц На 2 МГц уже видно плавающие пики пилы. На 4 МГц видно уже очень отчетливо. Ну и на 8 МГц у нас получается 25/8 = 3,125 отсчета на период. Исключительно ради изучения своего осциллографа и щупов, попробовал меандр. Правда сетку частот пересчитывать было лень. В режиме меандра, период в 2 раза длиннее, поэтому частоты получились другие. 5 КГц25 КГц, 250 КГц, 1 МГц, 2 МГц, 4 МГц25 КГц 250 КГц 1 МГц 2 МГц 4 МГц 4 МГц более развернуто Начиная с 1 МГц ясное дело джиттер, на 2 МГц его видно на осциллограмме. Кстати (для тех, кто не в курсе), важно, что на высоких частотах, чтобы не портить фронты, нужно использовать щуп в режиме 1:10, чтобы он меньше влиял на схему (а еще лучше не использовать крокодил). Но потребуется усилить сигнал в 10 раз уже на осциллографе. Так же, не стоит забывать подстраивать делитель для правильного отображения, диэлектрической отверточкой. Для сравнения, фото, как выглядит один и тот же сигнал — меандр 2 МГц, но 1Х или 10Х 2 МГц — 1х 2 МГц — 10х Кстати, родной щуп от С1-112А тоже не плох 2 МГц — 10х Ну и в конце, самое главное:

Эпиграф Понадобился мне, в мойх поделках, генератор сигналов различной формы, а именно: синус, меандр, треугольник ну и плюс постоянное напряжение (но это уже другой вопрос), да не простой а чтобы занимал мало места на плате а главное программно управляемый. После недолгого гугления наткнулся на семейство DDS синтезаторов от Analog Devices, которые все это в себе совмещают (кроме постоянного напряжения). Три из четырех очень неплохо (подумал я) и прикупил парочку.Принципы работы DDS синтезаторов частоты DDS — принцип не новый, а значит теории по этому вопросу в инете и не только — навалом. Лично мне хватило пары статей, чтобы «войти в курс дела». Одну из них, со скромным названием «All About Direct Digital Synthesis», можно почитать на сайте Analog Devices. Для тех кто не дружит с английским языком, есть перевод данной статьи.Почему AD9833? У этого DDS синтезатора есть ряд преимуществ, по сравнению со своими собратьями: низкая стоимость, малое потребление, последовательный интерфейс обмена данными (всего три проводка), простые команды и вычисления, минимальный обвес AD9833, относительно высокая точность выходного сигнала (10-битный ЦАП, 28-битный фазовый аккумулятор, который позволяет получить выходной сигнал с точностью до 0.1 Гц, при максимальном тактирующем сигнале в 25.0 МГц), отличное соотношение Сигнал/Шум без применения какой либо фильтрации ~ 60dB. Также AD9833 обладает несколькими режимами энергосбережения, что тоже не маловажно.Описание схемыРис.1 Цоколевка AD9833 Как видно из цоколевки, разработчики буквально поделили AD9833 на две части: первая часть — управляющая, в которую входят линии ввода команд/данных, тактирующий и выходной сигналы, и вторая часть отвечающая за питание ИС. Поскольку я впервые имел дело с AD9833, то решил сделать отдельный подопытный модуль, плюс такой модуль обладает большой мобильностью и при желании его можно использовать в нескольких проектах, а также легко локализовать и исправить неполадки (разделяй и властвуй). На рис.2 показана схема сего модуля, в которой все управляющие линии, выходной сигнал и питание собраны в коннекторе CONN1 (этакий интерфейс), через который он будет общаться с управляющей частью.Рис.2 Схема тестового модуляОсновные требования к модулю Как было упомянуто раньше, AD9833 очень неприхотливая ИС и для того чтобы получить готовый выходной сигнал ей нужны буквально пара конденсаторов, тактовый генератор и операционный усилитель, поскольку необработанный выходной сигнал составляет ~0.65V (peak-to-peak), плюс небольшой оффсет ~40mV, в режимах с использованием ЦАП’a.Тактовый генератор — в качестве источника тактового сигнала следует выбрать резонатор со встроенным генератором (Crystal Clock Oscillator), обычный кварц здесь не подойдет.CAP/2.5V — при напряжении питания больше 2.7V, к этому пину надо подключить конденсатор в 100 нФ (на рис.2 показано перемычкой), в противном случае (напряжение питания меньше 2.7V), этот пин следует подключать напрямую к источнику питания (ставить перемычка между CAP/2.5V и VCC).Операционный усилитель — при выборе ОУ следует исходить из предусмотренной, максимальной частоты выходного сигнала, генерируемого AD9833. Это означает что амплитудо-частотная характеристика ОУ должна соответствовать (превышать) этой самой максимальной частоте, иначе вместо усиления сигнала получим подавление. Кстати у меня такого ОУ не оказалось, пришлось заказывать парочку высокочастотных. Но к моему счастью, потребности разрабатываемого прибора ограничиваются несколькими килогерцами, так что и низкочастотные ОУ пойдут в дело.Пример: чтобы обработать выходной сигнал с максимально-возможной частотой, которую способен воспроизвести AD9833, а это MCLKмакс/2 = 12,5 МГц (половина частоты опорного тактирующего сигнала, по закону Найквиста), диапазон рабочих частот ОУ должен быть как минимум 13МГц, а лучше и все 20МГц — кто знает что за ОУ попадется.Примечания к созданию фильтра нужных низких частот Как я уже говорил, соотношение Сигнал/Шум у AD9833 приличное и без всякой фильтрации, а поскольку генератор будет работать на очень большом диапазоне частот, то избавиться от оставшихся «хвостов» не получится, если только не использовать программируемый цифровой фильтр, но те что мне встречались работали с частотами до 50..100 КГц (для меня в самый раз, но в остальных случаях не пойдут), так что, по сути, конденсатор C5 является единственным фильтром! Но несмотря на это я все-же использовал фильтр Баттерворта 4-го порядка на 100 КГц, для фильтрации высокочастотного шума исходящего от тактового генератора и управляющей логики (микроконтроллера). Кстати я тут рассусоливаю про фильтрующий конденсатор а сам забыл его вставить в свой подопытный модуль.Заземление — в общем заземление должно соответствовать всем требованием заземления в системах со смешанными сигналами: заземляющая площадь должна быть как можно больше, цифровая и аналоговая земля должны соединятся только в одной точке. Подробней об этом можно почитать в статье: Заземление в системах со смешанными сигналами.Рис.3 Подопытный модуль — вид сверхуРис.4 Подопытный модуль — вид снизуПрограммная реализация В качестве управляющего мк я использовал ATMega16. AD9833 может изменять значение частотных регистров двумя способами: путем последовательной записи двух 14-битных слов (проще говоря записи 28-битного слова), либо записывать по отдельности старших/младших 14-бит (так называемый coarse/fine tuning). Данная библиотека работает только в режиме 28-битного слова, то есть происходит полное обновление значения частотного регистра (все 28-бит).BONUS!!! Как я уже говорил, в моей поделке мне необходим также и ЦАП. Чтобы не цеплять внешний, решил использовать внутрений 10-битный ЦАП AD9833. Следующая функция позволяет использовать AD9833 в качестве простого ЦАП’a. В зависимости от напряжения питания (VSUPPLY) AD9833 можно получать постоянное напряжение от 0 до VSUPPLY. Напряжение питания следует указать в макросе VSUPPLY — в милливольтах. В этой функции используется фазовый регистр № 0. Описание функции: если кратко то сбрасываем AD9833, тем самым обнуляем все внутренние регистры, устанавливаем частоту в 0.0 Гц и треугольную форму сигнала, чтобы уровень напряжения был в прямой зависимость от значения фазы, а дальше при помощи фазового регистра прибавляем нужную фазу. Также ниже есть график небольшого эксперимента с использованием различных форм сигнала. Эксперимент состоял в определении зависимости и соответсвии подоваемого мной цифрового значения (шаг 500 — который должен был соответствовать 500мВ), и получения на выходе соответствующего значения напряжения. Из графика виден оффсет при использовании внутреннего ЦАП’a: ~0.38mV * K, где К — коэффициент усиления ОУ. Также из графика видно, что я этот самый коэффициент усиления не докрутил до значения при котором можно получить на выходе AD9833 напряжение VSUPPLY. Если подытожить эксперимент, то на выходе получил изменение напряжение с равным шагом (~0.4V) а также прямая зависимость VOUT от цифры. Так что при последующей реализации сего модуля надо будет предусмотреть компенсацию оффсета, соответствующий коэффициент усиления и не забыть про фильтрующий конденсатор :). Ну и на последок функция инициализации. Первым делом следует сбросить все внутренние регистры, затем установить желаемые значения в фазовые и частотные регистры, так как их значение при сбросе не изменяется и по началу там находится мусор. После всех этих операции AD9833 стартует с так называемого midscale значения. Это значение соответствует половине VSUPPLY. Это означает что по умолчанию, AD9833 стартует с 2.5В (VSUPPLY/2), при 90о — VOUT равно 5В и так далее по синусоидальной/треугольной траектории. Я же привык чтобы синус стартовал с минимального значения, плюс в случае инициализации AD9833 с частотой 0.0 Гц, не желательно чтобы на выходе AD9833 торчало 2.5V (VSUPPLY/2). Для этого, в используемый фазовый регистр (по умолчанию это регистр № 0) загонаю 270о градусов, для старта с минимального значения. Во второй «от нечего делать» загнал 180о градусов. Ну и в конце выбираем форму выходного сигнала.Рис.6 Траектории со смещением в 270о и без смещенияТестируем код Зубцы на форме выходного сигнала отчасти «работа» осциллографа, ну и конечно сказывается отсутствие фильтрующего конденсатора. На сайте Analog Devices можно поиграться с AD9834 Interactive Design Tool, хотя AD9833 и AD9834 чуть отличаются.Скачать статьи по AD9833Скачать библиотеку по управлению DDS синтезатором AD9833Используемые источники:

  • /2018/06/ad9833.html
  • https://mysku.ru/blog/aliexpress/79168.html
  • http://we.easyelectronics.ru/grand1987/dds-sintezator-ad9833.html

Рейтинг автора
5
Подборку подготовил
Максим Уваров
Наш эксперт
Написано статей
171
Ссылка на основную публикацию
Похожие публикации