Сайт

 Звонок  по  России  бесплатный

8-800-20002-74

 Челябинск: 8 (351) 267-20-10
   xxx-xxx         
  xxx    
Главная Контакты Карта сайта

Авто на заказ

  • Логин:
    Пароль:
Зарегистрироваться | Забыли пароль?
» »

Как создать собственный генератор функций с помощью AD9833 от Analog Devices

  1. Что такое генератор функций?
  2. Создай свой собственный
  3. аппаратные средства
  4. Блок питания
  5. Плата AD9833
  6. Программного обеспечения
  7. Библиотека AD9833
  8. Основная рутина

Узнайте, как создать собственный генератор сигналов произвольной формы, используя ATmega328p, ИС-генератор функций DDS, операционный усилитель, несколько пассивных элементов и некоторую тяжелую работу.

Статьи по Теме:

Иметь дома свою собственную лабораторию электроники - это замечательно, единственным недостатком является то, что даже базовое оборудование может быть дорогим. Создавать свои собственные устройства не только легче на вашем кошельке, но это также отличный способ улучшить свои знания. Поэтому в этой статье я собираюсь объяснить, как создать собственный генератор функций.

Поэтому в этой статье я собираюсь объяснить, как создать собственный генератор функций

Что такое генератор функций?

Во-первых, генератор функций (также называемый генератором тонов) представляет собой электронное устройство, которое может выводить конкретную форму волны с заданной частотой. Например, можно генерировать синусоидальный сигнал на частоте 60 Гц. Вы можете использовать его, чтобы проверить внутреннюю работу аудиоусилителей, найти характеристики операционных усилителей и диодов, сделать прикольные шумы - список приложений можно продолжить.

Генератор функций DDS - это цифровой генератор сигналов произвольной формы, то есть для создания сигнала используется цифроаналоговый преобразователь (ЦАП). Он также имеет постоянное запоминающее устройство (ПЗУ), в котором хранятся значения амплитуды для конкретных сигналов в различные интервалы времени на основе частоты дискретизации (Fs).

Допустим, у нас есть генератор сигналов DDS с 8-разрядным ЦАП, который выводит синусоидальный сигнал на частоте 100 Гц с частотой дискретизации 800 Гц. Поскольку Fs в восемь раз больше частоты синусоидальной волны, инженеру или, что более вероятно, компьютеру необходимо извлечь из реальной синусоидальной волны восемь значений амплитуды от t = 0 до t = 2π. Этот интервал амплитуды равен [0, 255] (1111 1111 в двоичном виде = 255), что соответствует интервалу [-1, 1] с реальной синусоидальной волной. Поскольку картинка стоит тысячи слов, ниже приведено сравнение между реальной синусоидальной волной и той, которую выдает наш воображаемый (и низкоэффективный) генератор функций DDS.

Поскольку картинка стоит тысячи слов, ниже приведено сравнение между реальной синусоидальной волной и той, которую выдает наш воображаемый (и низкоэффективный) генератор функций DDS

Создай свой собственный

Цель состоит в том, чтобы создать надежный генератор функций, который может работать на частоте до 1 МГц, с амплитудой до 9 В и который позволяет выбирать между синусоидальными, треугольными и тактовыми (т. Е. Прямоугольными с 50% -ным рабочим циклом) сигналами. Чтобы помочь вам понять, почему я выбрал используемые компоненты, как они работают вместе и как была написана прошивка, я собираюсь разделить эту статью на две большие части: аппаратное и программное обеспечение.

аппаратные средства

Аппаратный аспект этой сборки состоит из двух основных частей: блока питания и основной печатной платы, содержащей ИС функционального генератора и микроконтроллер.

Блок питания

На главной печатной плате потребуются две шины напряжения: + 12В и -12В. Симметричные источники необходимы для окончательного усиления сигнала. Меньшая шина + 5 В будет создаваться непосредственно на главной плате путем регулирования + 12 В; это необходимо для питания микроконтроллера, AD9833, ИС функционального генератора и, наконец, кварцевого генератора 24 МГц. Ниже вы можете найти схему платы питания:

Ниже вы можете найти схему платы питания:

Для получения этих напряжений будет использоваться трансформатор, от 230 В или 110 В (в зависимости от вашего региона) до двух линий 12 В переменного тока (на трансформаторе обычно пишется что-то вроде 12 В-0 В-12 В). Выходной ток 200 мА более чем достаточен.

Помните, что на выходе трансформатора есть переменный ток, и нам нужен постоянный ток. Для этого мы будем использовать простой мостовой выпрямитель. Это изменит синусоиду в положительный сигнал. Они обычно поставляются как отдельные компоненты, но вы можете альтернативно использовать четыре универсальных диода, например 1N4001.

Мы не будем использовать его в стандартной конфигурации, так как нам нужен симметричный выход, поэтому мы подключим их, как показано на схеме выше: концы трансформатора подключены к выпрямителю, а центральный отвод - к земле. Чтобы сгладить выходной сигнал, мы сначала будем использовать два больших конденсатора, каждый на 1000 мкФ с номиналом 35 В. Ниже вы можете найти выходные сигналы для линий питания на разных этапах:

Ниже вы можете найти выходные сигналы для линий питания на разных этапах:

Кроме того, для удаления пульсации используются два регулятора напряжения, классический LM7812 и его брат LM7912, который используется для отрицательных напряжений. В довершение всего мы добавляем конденсатор 100 мкФ и конденсатор 100 нФ, оба рассчитаны на 25 В, на каждый выход ИС регулятора. Мы хотим, чтобы это питание было как можно более плавным, поскольку мы будем использовать их для компенсации нашего конечного выходного напряжения, а любые компоненты переменного тока будут распространяться на выход.

Плата AD9833

Давайте перейдем к основной печатной плате. Линейный регулятор LM1117-5V используется для создания шины + 5В от источника питания +12 В. Чтобы все было гладко, мы добавляем конденсаторы как к входным линиям напряжения (+12 В и -12 В), так и к выходу регулятора напряжения.

Чтобы все было гладко, мы добавляем конденсаторы как к входным линиям напряжения (+12 В и -12 В), так и к выходу регулятора напряжения

В левой части схемы вы найдете микроконтроллер ATMega328p-AU, который используется в Arduino Uno, но в пакете SMD. Для программирования MCU рядом с ним расположен 6-контактный разъем AVR-ISP. Он имеет два контакта для питания (+ 5 В и GND) и четыре других контакта для связи: MISO, MOSI, CLK и RESET.

Мы будем использовать только один компонент пользовательского ввода - поворотный энкодер со встроенным переключателем. Это будет наш элемент управления для установки частоты, типа сигнала и других настроек. Сигналы от поворотного энкодера направляются на два контакта прерывания на микроконтроллере, PD2 и PD3 (D2 и D3 на Uno), и коммутатор переходит на доступный вывод, который может действовать как вход; Я выбрал PD1 (D1 на Uno). Мы не будем добавлять подтягивающие резисторы, так как будем использовать встроенные в микроконтроллер. Поскольку механические контакты не идеальны, когда мы поворачиваем кодер, вместо идеального импульса, появляется дрожащий сигнал, но это может быть легко исправлено программным или аппаратным обеспечением с использованием конденсатора. Для встроенного переключателя мы будем использовать программный метод, а для вращающихся контактов - два конденсатора по 100 нФ.

Простой зеленый светодиод подключен к контакту PD7 (D7 на Uno), для целей отладки или для отображения статуса. Используемый дисплей представляет собой простой ЖК-дисплей с контроллером HD44780, который имеет 16 строк и две колонки и имеет подсветку. Для уменьшения количества соединительных проводов использовалась плата адаптера, так что единственными контактами, необходимыми для управления ЖК-дисплеем, являются 2 для данных через I2C и еще 2 для питания (+ 5 В и GND). Линии I2C на микроконтроллере находятся на выводах PC4 для SDA и PC5 для SCL. На Arduino Uno они называются A4 и A5 соответственно.

Наконец, последнее соединение для микроконтроллера сделано между ним и интегральной схемой AD9833. Он использует однонаправленную шину SPI, что означает, что данные могут передаваться только в одном направлении, от MCU к IC. Это сигналы MOSI (Master Out - Slave In), CLK (Clock) и CS (Chip Select, называемый FSYNC на AD9833). В заключение о микроконтроллерной части я должен упомянуть, что для каждого контакта блока питания требуются развязывающие конденсаторы со значением 100 нФ.

Прежде чем перейти к последней части схемы, части с ИС генератора функций, позвольте мне указать на некоторые ключевые особенности AD9833. Хотя я собираюсь походить на продавца, давайте начнем. Это программируемый генератор сигналов типа DDS, поэтому он принимает тактовый сигнал с максимальной частотой 25 МГц (для этой конкретной ИС), который затем делится на основе значения, передаваемого микроконтроллером (максимум 228) через шину SPI, и используя 10-битный ЦАП, он выводит сигнал, выбранный микроконтроллером. Выход имеет пиковое значение 0,65 В - 0,038 В (максимум VOUT - минимум VOUT) и имеет смещение (0,65 В - 0,038 В) / 2. Это означает, что минимум VOUT очень близок к 0 В. Важным примечанием является то, что выход тактового сигнала (прямоугольный сигнал) имеет амплитуду 2,5 В, то есть напряжение, генерируемое внутренним регулятором напряжения устройства.

Теперь, когда мы это получили, давайте посмотрим на последнюю часть схемы. Кристаллический генератор используется для подачи тактового сигнала 24 МГц на главный тактовый вход AD9833. FSYNC, SCLK и SDATA подключены к шине SPI микроконтроллера. Рядом с выводом VDD используются два развязывающих конденсатора, один со значением 0,1 мкФ, а другой со значением 10 мкФ. Еще один развязывающий конденсатор необходим для внутреннего регулятора напряжения 2,5 В; это рядом с выводом CAP и имеет значение 0,1 мкФ. Еще один конденсатор необходим между контактами COMP и VDD для развязки напряжения смещения ЦАП; он имеет значение 10 нФ, как указано в спецификации.

Еще один конденсатор необходим между контактами COMP и VDD для развязки напряжения смещения ЦАП;  он имеет значение 10 нФ, как указано в спецификации

В нескольких параграфах выше, когда я говорил о соединениях микроконтроллеров, я также написал эквиваленты выводов Arduino Uno. Я сделал это, потому что схема AD9833, описанная в предыдущем параграфе, доступна у различных китайских производителей в качестве платы коммутации, которую вы можете подключить к Arduino Uno. Имейте в виду, что выходной сигнал идет прямо от микросхемы, без дополнительных схем, которые я буду продолжать объяснять ниже.

Выход микросхемы подается на неинвертирующий вход операционного усилителя с использованием резистора 1,3 кОм. Триммер POT1 (переменный резистор), боковые контакты которого подключены к -12 В и + 12 В, имеет подметальную машину, подключенную к входной клемме переключателя для обеспечения напряжения смещения. Другая входная клемма переключателя SPDT подключена непосредственно к земле, а выходная клемма подключена к неинвертирующему входу операционного усилителя с другим резистором 1,3 кОм. Эта конфигурация в сочетании с потенциометром 50 кОм позволяет нам иметь переменное усиление от 1 до приблизительно 20. Это было вычислено с использованием Теорема Миллмана и тот факт, что операционный усилитель сохраняет свои входы, V + и V-, на том же напряжении:

$$ V ^ {^ {+}} = \ frac {\ frac {V_ {in}} {R3} + \ frac {V_ {offset}} {R4}} {\ frac {1} {R3} + \ frac {1} {R 4}} $$

$$ V ^ {^ {-}} = \ frac {\ frac {V_ {out}} {POT2}} {\ frac {1} {POT2} + \ frac {1} {R2}} $$

$$ V ^ {^ {+}} = V ^ {^ {-}} $$

$$ V_ {out} \ около 20 $$

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

  1. Напряжение смещения устанавливается на -350 мВ с помощью триммера POT1. Когда переключатель находится в положении 3 (R4 подключен к земле), выходное напряжение является выходом микросхемы, сигналом с амплитудой 350 мВ и смещением 350 мВ, умноженным на коэффициент усиления, установленный потенциометром POT2. Когда переключатель находится в положении 1 (R4 подключен к напряжению смещения, полученному триммером POT1), выходной сигнал остается таким же, как и раньше, за вычетом напряжения смещения, по сути, это сигнал с амплитудой 350 мВ и без смещения, умноженный на коэффициент усиления.
    При такой конфигурации выходное напряжение может колебаться от -7 В до + 7 В или от 0 В до уровня, на который способен операционный усилитель (что-то около + 12 В).
  2. Напряжение смещения установлено на минимум VOUT AD9833. Затем это умножается на усиление, которое может варьироваться от 1 до 20.
  3. Вместо триммера POT1 вы можете использовать потенциометр и установить его на передней панели, чтобы иметь переменное смещение. Просто помните, что на смещение также влияет усиление, поэтому целесообразно сначала установить усиление, выбрать необходимое пиковое напряжение, а после этого использовать потенциометр смещения, чтобы отрегулировать вертикальное положение сигнала. Я не рекомендую эту настройку; если вам нужно переменное смещение, я предлагаю добавить отдельный операционный усилитель в качестве суммирующего усилителя с фиксированным усилением 2, как показано на схеме ниже.

$$ V_ {out} = 40 \ cdot V_ {in} + V_ {offset} $$


$$ V_ {out} = 40 \ cdot V_ {in} + V_ {offset} $$

Чтобы обернуть усиливающую часть схемы, я должен упомянуть, что вам понадобятся развязывающие конденсаторы 100 нФ как для положительного, так и для отрицательного источника питания, и что вам нужно выбрать операционный усилитель, который может выдерживать напряжения источника питания ( + 12 В и -12 В), и это имеет очень хорошую скорость нарастания, так что он может не отставать от сигналов с высоким усилением.

В идеале эта схема должна быть построена на печатной плате, разработанной специально для этого приложения, а не на плате-прототипе. Я предоставлю вам уже разработанную печатную плату в KiCad через файлы ниже. Однако, если вы хотите сделать свой собственный, имейте в виду следующее:

Все необходимые компоненты для этого можно найти в спецификации, включенной в zip-файл в нижней части статьи.

Теперь, когда мы закончили с построением схем, давайте погрузимся в программирование.

Программного обеспечения

Чтобы написать код, который будет загружен в память микроконтроллера, мы будем использовать IDE Arduino. В следующих нескольких параграфах я объясню, как написать библиотеку для AD9833, а затем основную часть программного обеспечения, которая позволяет нам связывать микроконтроллер с AD9833, ЖК-дисплеем и поворотным кодером. AD9833 имеет эти так называемые регистры, которые в основном являются ячейками памяти, в которые мы можем помещать данные, и на основе этих значений интегральная схема меняет свой режим работы; он выбирает, какую форму волны выводить, фазу и коэффициент деления. Мы будем работать с пятью регистрами: контрольный регистр; двухфазные регистры, PHASE0 и PHASE1; и два частотных регистра, FREQ0 и FREQ1.

Библиотека AD9833

Мы создадим два файла, AD9833.cpp, файл, который будет содержать исходный код, и AD9833.h, его заголовок.

Внутри заголовка мы указываем имя класса (AD9833) и, как русская матрешка, внутри него переменные и функции, которые мы будем вызывать для связи с ИС генератора сигналов и изменения его параметров, таких как частота и тип формы волны. Это может быть один из двух типов: public, который мы можем вызывать извне методов (функций) класса, или private, который мы можем вызывать только тогда, когда мы находимся внутри метода класса. Я добавил комментарии, чтобы у вас было представление о назначении каждой функции и переменной; например:

// Инициализация AD9833 // _ FYNC - это вывод на uC, к которому подключен FYNC // _ mclk - частота кварцевого генератора AD9833 (int _FSYNC, unsigned long _mclk);

Переходя к исходному файлу, когда мы инициализируем новый объект типа AD9833, произойдет несколько вещей; это внутри функции « AD9833 :: AD9833 (int _FSYNC, unsigned long _mclk) ». Сначала мы обращаем внимание на вывод FSYNC, который мы передали в качестве аргумента, и устанавливаем его в качестве выходного вывода. При записи в AD9833 этот вывод будет НИЗКИМ. Внутри этого метода мы также устанавливаем некоторые значения по умолчанию для регистров, чтобы вывести синусоидальный сигнал на частоте 1 кГц, используя регистр FREQ0. В последних строках SPI устанавливается на mode2, который используется микроконтроллером и AD9833 для связи.

Осталось только внимательно прочитать таблицу и посмотреть, какие значения мы должны установить в регистрах AD9833, чтобы манипулировать выходным сигналом и его работой. Таким образом, мы напишем функции для следующих операций: записать данные, установить частоту, установить фазу, режим ожидания, сброс, режим и выбрать регистр частоты / фазы.

Мы будем работать напрямую на уровне битов. Иногда нам может потребоваться изменить значение всего регистра, например, для регистра частоты, но иногда мы хотим изменить только несколько битов всего слова. Для этого мы будем использовать следующие операции:

  • «& =» Чтобы установить некоторые биты на 0, оставляя остальные в покое. (0 = установить в 0, 1 = оставить все как есть). Пример:

controlRegister & = 0xF3FF; // Устанавливаем D11 и D10 в регистре управления на 0

  • «| =» Чтобы установить некоторые биты в 1, оставляя остальные в покое. (1 = установить в 1, 0 = оставить все как есть). Пример:

controlRegister | = 0x0C00; // Установить D11 и D10 в регистре управления на 1

В таблице ниже я извлек из таблицы данных, какие биты должны быть установлены для выполнения операций.

Задание значения регистра операций Частота FREQ0 FREEQ0: D15 = 0, D14 = 1 Установка частоты FREQ1 FREEQ1: D15 = 1, D14 = 0 Установка фазы PHASE0 PHASE0: D15 = 1, D14 = 1, D13 = 0 Установка фазы PHASE1 PHASE0: D15 = 1, D14 = 1, D13 = 1 установленный режим - синусоида CNTRL D5 = 0, D1 = 0 установленный режим - треугольный CNTRL D5 = 0, D1 = 1 установленный режим - тактовый сигнал CNTRL D5 = 1, D1 = 0 установленный частотный регистр CNTRL D11 = 0 (выберите FREQ0); D11 = 1 (выберите FREQ1); Сброс CNTRL D8 = 0 или 1 Sleep - без отключения питания CNTRL D7 = 0, D6 = 0 Sleep - ЦАП выключен CNTRL D7 = 0, D6 = 1 Sleep - Внутренние часы отключены CNTRL D7 = 1, D6 = 0 Sleep - DAC выключен и внутренние часы отключены CNTRL D7 = 1, D6 = 1

Регистры имеют разные размеры. Регистр управления имеет длину 16 бит, фазовые регистры имеют длину 12 бит, а частотные регистры имеют 28 бит. Для вывода данных через SPI мы отправляем по одному байту за раз, как это видно из функции «writeData», начиная с младшего байта (сначала 8 битов из целого числа данных), а затем старшего байта.

Установка частоты немного сложнее, потому что мы напрямую не посылаем нужную частоту. Согласно данным, аналоговый выход fMCLK / 228 × FREQREG. Таким образом, частотный регистр должен быть установлен на:

$$ FREQREG = \ frac {частота \ cdot 2 ^ {28}} {f_ {mclk}} $$

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

Остальные методы должны быть простыми, если вы будете следовать таблице выше и моим указаниям в комментариях.

Основная рутина

Для основного кода, который соединит наш AD9833, LCD, поворотный кодер и микроконтроллер, мы собираемся немного обмануть и использовать некоторые очень хорошо написанные библиотеки для ЖК , который использует шину I2C, а для поворотный энкодер ,

Наш генератор сигналов произвольной формы плохо использует функциональность фазы; Я решил оставить эту функцию недоступной, но вы можете использовать ее, раскомментировав директиву «// # define usePhase». Однако при этом отключается возможность выбора между регистрами FREQ0 и FREQ1.

Я пытался сделать программное обеспечение максимально удобным для пользователя. С самого начала на ЖК-дисплее вы можете видеть частоту в верхнем левом углу и менять ее цифра за цифрой, в верхнем правом углу - состояние питания аналогового выхода, которое может быть включено или выключено, то есть вы можете включить отключить выход без выключения устройства. В левом нижнем углу вы можете выбрать регистр, используемый для хранения частоты, либо FREQ0, либо FREQ1. Это полезно, если вы хотите легко переключаться между двумя разными частотами. И наконец, в правом нижнем углу отображается тип сигнала, который вы хотите вывести: синусоида, треугольная волна или прямоугольная волна. Имейте в виду, что выход тактового сигнала всегда будет иметь более высокую амплитуду, поскольку AD9833 выдает его при напряжении 2,5 В, а не 0,65 В для синусоидальных и треугольных сигналов.

Имейте в виду, что выход тактового сигнала всегда будет иметь более высокую амплитуду, поскольку AD9833 выдает его при напряжении 2,5 В, а не 0,65 В для синусоидальных и треугольных сигналов

Вот как вы вносите изменения: нажатие на энкодер делает курсор активным, а затем вы поворачиваете энкодер для «прокрутки» (перемещения) между четырьмя настройками (частота, ON / OFF, FREQ0 / 1 и тип сигнала). После выбора параметра, подлежащего изменению, нажатие на энкодер либо изменит настройку (если выбрано значение ON / OFF или FREQ0 / 1), либо вы можете изменить значение настройки, вращая энкодер (вращение увеличивает / уменьшает текущую цифру или изменяет тип сигнала в зависимости от выбранной настройки). Повторное нажатие применяет настройку (для типа сигнала) или переходит к следующей цифре (для частоты).

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

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

Ниже приведены некоторые формы выходного сигнала для вас:

синусоида, 1 В от пика до пика, 1 кГц, без смещения

синусоида, 1 В от пика до пика, 1 кГц, без смещения

треугольная волна, 1 В от пика до пика, 1 кГц, без смещения

тактовый сигнал, 11 В от максимума, 500 Гц, со смещением

тактовый сигнал, 11 В от максимума, 500 Гц, со смещением

Скачать код





Хиты продаж!

Акции!

Нам 66 лет!

В наличии


Новости