Меню

Dds генератор сигналов ардуино

DDS-генератор синусоидального сигнала

В данном проекте рассмотрим изготовление генератора синусоидального сигнала при помощи метода прямого синтеза (DDS-метод). Для реализации этого проекта нам не потребуется какого-либо дополнительного оборудования кроме самого контроллера Arduino. Частотный диапазон генератора от 0 до 16 кГц, с точностью до 1 мкГц! Данное устройство может пригодится не только для генерирования звуковых сигналов, но в тестовом и измерительном оборудовании радиолюбителя. Например в телекоммуникационном оборудовании DDS генератор можно использовать для ЧМ и ФМ модуляции (FSK и PSK).

DDS-метод

В программной части проекта, для реализации DDS метода, нам понадобится 4 вещи:
аккумулятор и tuning word, который в нашем случае состоит из двух long integer переменных;
таблица значений синусоидального сигнала (один период);
цифро-аналоговый преобразователь, который обеспечивается внутренним ШИМ Arduino (analogWrite);
генератор тактовых импульсов (используем внутренний hard-таймер от ATMega).
Большинство значащих байт аккумулятор используется для адресов таблицы синусоидального сигнала. Весь циклический процесс, работает по прерыванию от внутреннего тактового генератора.

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

Для работы данного скетча на Arduino Diecimila или Duemilenove подключите потенциометр к аналоговому выводу 0 и к GND и +5В. Выход генератора находится на выводе 11, куда вы можете подключить активные колонки, или ФНЧ фильтр описанный ниже.

Результат

Ниже представлена осциллограмма, на верхней части которой изображен ШИМ-сигнал на 11 выходе, а в нижней части этот же сигнал после фильтра низких частот (ФНЧ). Синусоида выглядит не очень чистой, но это в основном из-за ограниченной разрешающей способности цифрового осциллографа.

Спектрограмма показала неожиданно хороший результат. Большой пик — это на частоте около 1000 Гц. Все нежелательные искажения находятся ниже 50 дБ, возникшие из-за того, что использовался 8 битный ЦАП (1/256 = 48 дБ).

Выходной фильтр низких частот

Для начала, вы можете подсоединить 11 пин контроллера к активным колонкам. Но скорее всего, вам еще понадобится ФНЧ-фильтр, который также будет отфильтровывать частоту дискретизации 32 кГц. Ниже представлена схема такого фильтра с частотой среза 12 кГц.

Аппаратная реализация DDS

Данная программная реализация алгоритма DDS имеет некоторые недостатки, связанные с ограниченной скоростью алгоритма программы, а также возможностями микроконтроллера ATMega. Специализированные DDS-микросхемы лишены этих недостатков и покрывают диапазон от 0 до 100 МГц.

Извещатель о прохождении слабого сигнала (Weak Signal Propagation Reporter) — программное обеспечение позволяющее передавать и принимать сигналы радиомаяков, задействуя не только передатчик, но и интернет. При помощи данного DDS-генератора можно генерировать 4 тоновых последовательности частотой 1497.8 1499.3 1500.7 1502.2 Гц.

Источник

Генерирование и чтение сигналов

Начнём с самого простого: генерация импульса заданной длины, такое часто бывает нужно. Проще всего сделать это на delay() и delayMicroseconds() :

Нужно помнить, что digitalWrite() сам по себе выполняется в районе 3.6 мкс (58 тактов процессора). Для ускорения можно использовать например библиотеку directIO или прямую работу с регистрами портов.

Генерирование квадратного сигнала

Программное

Квадратный сигнал может быть использован для тактирования и управления, а также для генерации звука через усилитель. Самый базовый пример, Blink, по сути тоже является генератором квадратного сигнала:

Если заменить 1000 например на 10 , то получится квадратный сигнал с частотой 50 Гц. Этот способ называется программной генерацией сигнала, то есть микроконтроллер своими силами считает время и сам вручную дёргает ногой. Это как мешает работе остального кода, так и остальной код может сбивать частоту. Такую генерацию можно сделать более мене асинхронной на миллисе:

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

Функция tone()

В ядре Arduino есть встроенная функция для полуаппаратной генерации квадратного сигнала – tone(pin, frequency, duration) :

  • pin – цифровой пин, с которого будет генерироваться сигнал.
  • frequency – частота в Герцах. Диапазон 31.. 8’000’000 Гц, целые числа. С увеличением частоты растёт шаг изменения реальной частоты.
  • duration – продолжительность сигнала в миллисекундах. Опциональный параметр, если не указывать – сигнал будет генерироваться всё время.

Для ручной остановки генерации сигнала можно вызвать noTone() . Также у генерации при помощи tone() есть особенности:

  • Генерация является полуаппаратной: пин дёргается МК “вручную” по прерыванию таймера, что на высокой частоте может чуть тормозить код.
  • Генерация использует Timer 2, перенастройка или использование его для других целей (включая ШИМ на пинах D3 и D11 у Nano) отключит активную генерацию или изменит её частоту.
    • При вызове tone() таймер перенастраивается на генерацию, то есть можно использовать таймер в своих целях между вызовами tone() .
  • Генерация работает только на одном пине в один момент времени, причём для включения генерации на другом пине нужно сначала отключить текущую генерацию, то есть вызвать noTone() .

ШИМ сигнал

Аппаратный таймер позволяет генерировать квадратный сигнал аппаратно и полностью асинхронно работе остального кода, не тратя ни такта процессорного времени: время считается самим таймером, и сам же таймер управляет состоянием ноги МК. Для генерации ШИМ сигнала в среде Arduino есть функция analogWrite(pin, duty) , подробнее мы говорили в ней в уроке про ШИМ. Чтобы сделать ШИМ квадратным, нужно запустить его с duty , равной 128 . Что касается частоты полученного сигнала, то Ардуино настраивает таймеры так, что частота в зависимости от таймера может быть 490 или 980 Гц. Частоту можно изменить с довольно большим шагом, об этом мы говорили в уроке про увеличение частоты ШИМ.

Аппаратный таймер

Можно вручную настроить аппаратный таймер на генерацию квадратного сигнала. Тонкости настройки регистров таймера мы в рамках этих уроков не разбираем, но это можно сделать и при помощи библиотеки, например GyverTimers. Работу библиотеки мы разбирали в уроке о прерываниях таймера. Данная библиотека позволяет настроить генерацию квадратного сигнала с максимально возможной точностью и частотой, а также поднять на одном таймере генерацию двух или трёх (Arduino MEGA) меандров со смещением по фазе. Пример:

ШИМ сигнал

Аппаратный

Для генерации ШИМ сигнала с заданным заполнением есть стандартная функция analogWrite(pin, duty) , подробнее обсуждали в уроке про ШИМ сигнал, а частоту можно изменить перенастройкой таймера, как в уроке об увеличении частоты ШИМ. На самом деле таймеры позволяют настроить ШИМ сигнал с более точной или более высокой частотой и другими диапазонами заполнения (до 10 бит), но в ядре Arduino это не предусмотрено. Если такое будет нужно, можно воспользоваться библиотекой GyverPWM. Пример:

Программный

Программная генерация ШИМ сигнала может пригодиться, если не хватает лишнего таймера или частота ШИМ низкая и не повлияет на остальной код, а он на неё. Шим сигнал на миллисе можно организовать вот таким образом:

Полуаппаратный ШИМ

Можно снизить нагрузку на процессор, отдав счёт времени аппаратному таймеру. Примеры на базе GyverTimers:

Если не хватает количества стандартных ШИМ-выходов, можно поднять полуаппаратный ШИМ на таймере на несколько пинов сразу:

Библиотека Servo

Как известно, RC сервоприводы управляются при помощи ШИМ сигнала с частотой

50 Гц и длительностью импульса от

2500 микросекунд. В стандартной библиотеке Servo.h реализована генерация полуаппаратного ШИМ сигнала, причём количество пинов можно менять во время работы. Библиотеку можно использовать как генерацию ШИМ, если его параметры подходят для использования.

Чтение сигналов

Чтение цифрового сигнала сводится к измерению времени между его импульсами, то есть изменениями состояния HIGH-LOW: так можно измерить период и частоту квадратного сигнала, заполнение и частоту ШИМ и вообще любой другой сигнал.

Функция pulseIn()

В ядре Ардуино есть готовые функции для измерения импульсов:

    pulseIn(pin, value, timeout) – для импульсов от 10 мкс до

3 минут, работает на счёте тактов процессора, лучше работает при отключенных прерываниях, более точно измеряет короткие импульсы.
pulseInLong(pin, value, timeout) – для импульсов от 10 мкс до

3 минут, основано на micros() (т.е. на Таймере 0), не работает при отключенных прерываниях, более точно измеряет длинные импульсы.

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

  • pin – цифровой пин (GPIO), на котором ожидается импульс.
  • value – направление импульса, HIGH или LOW .
  • timeout – тайм-аут ожидания импульса в микросекундах. Необязательный параметр, по умолчанию равен 1’000’000 мкс (1 секунда).

Как это работает: пусть мы настроили импульс на HIGH , функция будет ожидать изменение значения с LOW на HIGH . Если скачок с LOW на HIGH не произошёл за время, установленное тайм-аутом, функция завершит выполнение и вернёт 0.

Для превращения длины импульса (мкс) в частоту (Гц) достаточно поделить на него секунду (точнее, 1’000’000 мкс).

Измеряем сигналы вручную

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

Библиотека тахометра

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

Источник

Лабораторный генератор сигналов на DDS под управлением Arduino

Прототипом этого генератора стала найденная автором в Интернете конструкция [1]. Она дополнена аттенюатором, которым управляет микроконтроллер, буферный усилитель собран на микросхеме другого типа, внесены изменения в программу микроконтроллера модуля Arduino Nano.

Микросхемы прямого цифрового синтеза частоты (DDS) обычно применяют в задающих генераторах и перестраиваемых гетеродинах радиостанций [2, 3], лабораторных генераторах сигналов [4, 5]. Микроконтроллерное управление ими легко позволяет реализовать генератор качающейся частоты [6]. В последнее время сложилась ситуация, когда приобретение отдельно микросхемы DDS и микроконтроллера дороже, чем готовых содержащих их модулей. В предлагаемом лабораторном генераторе синусоидальных сигналов применены модуль синтезатора частоты HC-SR08 на микросхеме DDS AD9851 и микроконтрол-лерный модуль Arduino Nano.

Генератор имеет три режима работы:

1 — генерация синусоидального сигнала частотой от 1 Гц до 70 МГц, устанавливаемой с минимальным шагом 1 Гц;

2 — генерация сигнала качающейся частоты. Качание происходит от установленного на ЖКИ значения в сторону повышения частоты. Полосу и шаг качания можно устанавливать произвольно во всём диапазоне генерируемых частот, но шаг должен быть меньше полосы. Число шагов в одном цикле качания равно ширине полосы качания, делённой на длину шага, плюс единица. Период повторения циклов равен этому числу, умноженному на 660 мкс. В начале каждого цикла качания для синхронизации развёртки осциллографа генерируется импульс низкого логического уровня длительностью 11 мкс;

3 — генерация сигнала, частота которого отличается от заданной на одно из следующих фиксированных значений: 450 кГц, 455 кГц, 460 кГц, 465 кГц, 1,6 МГц, 1,8 МГц, 5,5 МГц, 10,7 МГц и 21,4 МГц. Выходная частота равна сумме установленного на индикаторе значения и выбранного смещения.

Аттенюатор ослабляет выходной сигнал на 0-110 дБ ступенями по 10 дБ. Экспериментально снятые графики зависимости амплитуды выходного напряжения от частоты при различном ослаблении аттенюатора показаны на рис. 1. Генератор, внутреннее сопротивление которого 50 Ом, был нагружен только входным сопротивлением осциллографа (около 1 МОм).

Рис. 1. Экспериментально снятые графики зависимости амплитуды выходного напряжения от частоты при различном ослаблении аттенюатора

Принципиальная схема генератора изображена на рис. 2. Он состоит из готовых модулей Arduino Nanо (А1), HC-SR08 (A2) на базе микросхемы DDS AD9851 и самодельных плат питания и органов управления, аттенюатора (2 шт.), буферного усилителя. Позиционные обозначения элементов, находящихся на самодельных платах, снабжены цифровыми префиксами, равными условному номеру платы. Информация о работе генератора выводится на ЖКИ HG1.

Рис. 2. Принципиальная схема генератора

Внешнее напряжение питания генератора (14,5. 20 В) подают на разъём 3XS1 от внешнего источника. Потребляемый от него ток не превышает 150 мА. Выключатель питания 3SA1 расположен на передней панели корпуса генератора. На плате питания и органов управления установлены три интегральных стабилизатора: на 12 В (3DA1), на 10 В (3DA3) и на 5 В (3DA2). Напряжение 10 В на выходе стабилизатора 3DA3 точно устанавливают подборкой резисторов 3R7 и 3R8. Конденсаторы 3C1-3C9 и 4C1-4C4 фильтруют питающие напряжения.

Модуль A1 питается напряжением 12 В от стабилизатора 3DA1, при этом действует установленный в модуле стабилизатор напряжения 5 В, которое использовано для питания ЖКИ HG1. Напряжением 12 В питают реле, установленные на платах аттенюаторов. Модуль A2 получает питание от стабилизатора 3DA2, что позволило избавиться от помех, создаваемых микроконтроллером модуля A1. ОУ 4DA1 в буферном усилителе питается напряжением 10 В от стабилизатора 3DA3.

Всеми узлами генератора управляет по загруженной в него программе микроконтроллер ATmega168P или ATmega328P, установленный в модуле Arduino Nano. Применён модуль с индексом R3, в котором преобразователь интерфейса USB-COM выполнен на микросхеме CH340G.

ЖКИ HG1 и меет две строки по 16 символов и встроенный контроллер, совместимый с HD44780. Плата ЖКИ была подвергнута доработке. Имевшийся на ней резистор R8 (рис. 3) сопротивлением 100 Ом, ограничивающий ток подсветки экрана, был заменён резистором сопротивлением 220 Ом. Это понизило ток, потребляемый подсветкой, с более чем 20 мА до 10 мА. При этом яркость подсветки практически не уменьшилась. На этой же плате были смонтированы после подборки резисторы R1 и R2, задающие контрастность изображения на экране индикатора.

Вращением ручки энкодера3S1 увеличивают или уменьшают генерируемую частоту шагами, длину которых можно изменять нажатиями на эту ручку. Нажатиями на кнопку 3SB1 изменяют коэффициент ослабления аттенюатора, а с помощью кнопки 3SB2 сменяют режимы работы генератора. В режиме 1 нажатием на кнопку 3SB3 устанавливают шаг перестройки равным 1 кГц. Нажатиями на эту же кнопку в режиме 2 циклически выбирают частоту начала сканирования, ширину полосы качания и длину шага перестройки частоты. В режиме 3 этой кнопкой задают смещение генерируемой часто-ты относительно показанной на индикаторе. Все входы модуля A1, к которым подключены контакты кнопок и энкоде-ра, соединены с цепью питания +5 В через резисторы 3R1-3R6 для поддержания на них высокого логического уровня при разомкнутых контактах.

Детали стабилизаторов напряжения питания и органов управления размещены на односторонней печатной плате, представленной на рис. 4. Кнопки и энкодер устанавливают на ней со стороны печатных проводников. Энкодер крепят гайкой к корпусу генератора. К нему же без изоляционных прокладок прижимают теплоотводящие фланцы стабилизаторов 3DA1 и 3DA2. Стабилизатор 3DA3 работает без дополнительного теплоотвода. Конденсаторы 3C3 и 3C5 монтируют на плату лишь при необходимости устранить сбои в работе энкодера.

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

Рис. 5. Внешний вид модуля HC-SR08

Чтобы уменьшить искажения сигнала, рекомендуется отключить встроенный в микросхему AD9851 компаратор, формирующий прямоугольный выходной сигнал. Для этого необходимо перевести движок установленного на плате модуля подстроечного резистора R13 в одно из крайних положений.

С модуля DDS сигнал поступает на буферный усилитель с коэффициентом усиления 2, собранный на ОУ 4DA1 (OPA642N), через конденсаторы 4C5 и 4C6, не пропускающие его постоянную составляющую. С помощью резисторов 4R1, 4R2 и блокировочных конденсаторов 4C1-4C4 создана искусственная средняя точка питания ОУ. Для устранения постоянной составляющей выходной сигнал ОУ поступает на аттенюатор через конденсаторы 4C7 и 4C8. Резистором 4R6 задано выходное сопротивление генератора.

Буферный усилитель собран на односторонней печатной плате, изображённой на рис. 6. Она рассчитана на установку компонентов для поверхностного монтажа. Резисторы и конденсаторы — типоразмера 1206, допускается установка резисторов типоразмера 0805.

Рис. 6. Печатная плата буферного усилителя

Усиленный сигнал поступает через аттенюаторы на выходной разъём XW2 (СР50-73). Для управления коэффициентом ослабления в аттенюаторах использованы реле HLS-4098-DC12V с сопротивлением обмотки 720 Ом. Транзисторы 1VT1, 1VT2, 2VT1, 2VT2 управляют этими реле по командам модуля A1. Обмотки реле для подавления выбросов напряжения самоиндукции зашунтированы диодами 1VD1, 1VD2, 2VD1, 2VD2.

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

Рис. 7. Платы двух аттенюаторов

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

На практике почти невозможно найти резистор, сопротивление которого в точности равно написанному на нём номиналу. Поэтому необходимо, измерив реальное сопротивление имеющихся в наличии резисторов, выбрать тот, сопротивление которого близко к требуемому Rрасч, но больше его. Затем, подставив сопротивление выбранного резистора R1 в формулу R2 = (Rрасч — R1 )/Rрасч · R1 найти сопротивление резистора R2, который следует подключить параллельно первому. В таблице представлены некоторые возможные комбинации резисторов для различных ступеней аттенюаторов.

Источник

Adblock
detector