Arduino uno как сделать генератор синусоидального сигнала
Перейти к содержимому

Arduino uno как сделать генератор синусоидального сигнала

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

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

DDS-генератор на Arduino

DDS-метод

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

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

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

Результат

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

Осциллограмма DDS-генератора

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

Спектрограмма DDS-генератора

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

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

Схема фильтра низких частот

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

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

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

Генератор синусоиды на Arduino или ЦАП R-2R


Предыстория.
У меня есть хороший друг. Тоже «радиолюбитель», самоучка и весьма энергичный молодой человек. Так вот. Попался ему как-то в руки сгоревший «синим пламенем» источник бесперебойного питания (ИБП) – не лучший образец продукции «поднебесной». Починить его оказалось неподъемной задачей. Однако, трансформатор оказался одним из «живучих» элементов, и Дима задумал изготовить небольшой преобразователь 12В в 220В для какого-то применения (в купе с автомобильным аккумулятором) на дачном участке. Немного погуглив и собрав кучу распечаток из Интернета, он обратился ко мне (зная мои поделки на Ардуино) со странным вопросом: «А «красивую» синусоиду твоя Ардуина может генерить?»

А вот тут и начинается текст по делу

Итак. Синусоида. Значит из цифр (которыми оперирует Ардуинка) нам нужно получить аналоговый сигнал… А значит нам нужен Цифро-Аналоговый Преобразователь (или ЦАП, или DAC -по ненашему).
Меня это не сильно испугало. Я уже сталкивался с ЦАП-ми, а конкретнее в детстве паял вариант R-2R. Те, кто постарше наверняка помнят такие чудесные поделки, как Covox ( http://ru.wikipedia.org/wiki/Covox ). В те годы (примерно 90-ые), мне только доводилось мечтать о звуковой карте, а вот вышеупомянутое устройство, да еще сделанное своими руками – доставило столько приятных минут
Итак, сказано – сделано!
Ну, будучи до конца честным, признаюсь. Я для начала поискал готовые решения для Ардуино в просторах Интернета. (Вот один из вариантов, с применением ШИМ-сигнала: http://electronics.stackexchange.com/questions/41738/possible-to-output-sinusoidal-signal-with-an-arduino. Не понравился.)

Итак, нам нужено изготовить простейший цифро-аналоговый преобразователь: R-2R.
Вот буржуйское описание: http://en.wikipedia.org/wiki/Resistor_ladder

(B7..B0 — это биты, B7 — старший, B0 — младший).
Своё название (R-2R) данный ЦАП получил из-за номиналов применяемых в нём резисторов с сопротивлениями R и 2*R. Сопротивления по идее могут быть любыми (1k-2k; 10k-20k и т.д). Однако, я чаще всего встречал варианты с номиналами 1k и 2k.
Как же эта штука работает?
Каждый вход ЦАПа вносит свою лепту в выходной сигнал пропорционально своей «значимости». Т.е. левый вход оказывает самое большое влияние на выходной сигнал (половина опорного напряжения), следующий за ним ¼ , следующий – 1/8 и т.д. Ну а самый последний (правый) вход изменяет выходной сигнал на ничтожные милливольты. Подставляя значение битов на входе ЦАП выходное напряжение можно рассчитать так:
Uвых=Uпит * (B7 * 1/2 + B6 * 1/4 + B5 *1/8+ B4*1/16+B3*1/32+B2*1/64+B1*1/128+B0*1/256).
Если выставить на вход ЦАП-а значение 255 (бинарное 11111111), то получаем самый высокий выходной сигнал. Если же 00000000 — ноль.
Uпит – напряжение питания микроконтроллера. Таким образом, наш восьмибитный ЦАП способен выдать 256 различных напряжений с шагом около 20 милливольт, при опорном напряжении 5 Вольт.
Желательно чтобы ЦАП (8-ми разрядный, как у нас) был подключен к целому порту. Тогда выводить любое значение в ЦАП — будет очень просто:

Итак, прикидываем на макетке:

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

Теперь математическая составляющая.
Вооружившись школьным учебником алгебры (шучу… шучу, конечно же Википедия!) вспоминаем, что такое Синусоида: http://ru.wikipedia.org/wiki/Синусоида


Адаптируем к нашим условиям. ЦАП может выдавать значения от 0 до 255. Причем, за нулевое значение (мы будем оперировать только целыми положительными числами) примем 127. Длительность волны примем 255 шажков (опять же для удобства). Т.е., для одного периода значение функции поменяется 255 раз. Естественно, чем больше «шажков» мы уместим в этот период, тем точнее получим синусоиду.

Синим цветом я постарался обозначить значения напряжения, получаемые на выходе ЦАП, при «контрольных» значениях точек на оси Х.
Общая формула синусоиды:
Y=a+b*SIN(c*X)

Итак, наша синусоида стартует со значением 127 (для ЦАП) и заканчивается этим значением. Для этого, вводим значение смещения по оси У а=127. a характеризует сдвиг графика по оси Oy. Чем больше a, тем выше поднимается график.

Значение синуса может меняться от -1 до 1 (Кто бы мог подумать. ). Чтобы растянуть график по вертикали, вводим второе значение b, характеризующее растяжение графика по оси Oy. Чем больше увеличивается b, тем сильнее возрастает амплитуда колебаний; Ну, тут тоже понятно, что при максимальном значении в (254-127) b=127

с характеризует растяжение графика по оси Ox.

Длина периода =2*Pi. Мы условились, что этот период мы делим на 255 «шагов». Т.е., 255-ый шаг должен иметь значение 2*Pi. Для нашего случая С=2*Pi*(1/255) или 2*Pi*0.0392 или Pi*0.007843
Окончательно получаем следующую формулу расчета: Y=127+127*SIN(Pi*X*0.007843).
(Желающие получить БОЛЕЕ точные результаты, могут использовать, допустим 512 шажков. Только нужно пересчитать константу).

Давайте проверим нашу формулу на «ключевых» значениях X:
0 (0) = 127
64 (Pi/2) =253
128(Pi) =125
192 (3*Pi/2) =0
255 (2Pi) =126

Весьма правдоподобно. Итак далее, тут можно поступить двумя способами: высчитывать значение по ходу дела – способ НАВЕРНЯКА не самый быстрый, а можно заранее рассчитать эти значения и брать их из таблицы. Я предпочел второй способ.
Программист из меня не важный (Бейсик – в детстве, Паскаль – в школе, ФОРТРАН – в институте), поэтому я не стал тратить время на поиски того же Борланд паскаля или изучение Питона, «напрягом» знакомого программиста… Как впрочем и на калькуляторе высчитывать 255 значений мне показалось «времярасточительным» занятием. НО у меня же есть Ардуинка! (И я ОЧЕНЬ стараюсь использовать ее по полной программе.). Вот ее и заставим произвести нужные мне расчеты.

Вот наша таблица значений :

Набрасываем скетчик для вывода значений таблицы в ЦАП:

Вроде как и все. Но, как говорят французы, «аппетит приходит во время еды», а именно, оказывается нужно две синусоиды.
А, была-не была. Тем более, столько уже проделано. Макетим.

«Допиливаем» скетч, сделаем небольшое смещение синусоид offset 128. (Кстати, огромная благодарность Юре, за идею «склейки» пинов для получения «полного» порта).

Делаем контрольный замер, подключив выходы ЦАП-ов к осциллографу (красиво совмещаем выдаваемые Ардуинкой синусоиды):

Красота! То, что и желали получить. Все, мой приятель остался очень доволен. Я отдал ему прошитую Atmeg-у для дальнейшего применения.

Функциональный генератор сигналов с регулируемой частотой на Ардуино с дисплеем 1602. Схема и описание

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

Авторский прототип представлен на следующем рисунке:

Функциональный генератор сигналов с регулируемой частотой

Принципиальная схема функционального генератора

Схема содержит плату Ardunio Uno (Board1), ЖК-дисплей 1602 (LCD1), два потенциометра по 10 кОм (VR1, VR2) и несколько дополнительных компонентов.

Функциональный генератор на Ардуино - схема

Потенциометр VR1, подключенный к контакту 3 LCD1, используется для управления контрастностью LCD1. Потенциометр VR2, подключенный к выводу A0 аналогового входа платы Arduino Uno, используется для настройки периода времени выходных сигналов (частоты).

В качестве выходов использованы контакты 3, 9 и 10 платы Arduino:

  • контакт 3 — для прямоугольной волны
  • контакт 9 — для синусоидальной волны
  • контакт 10 — для пилообразной волны

Сигналы с выводов 9 и 10 фактически являются широтно-импульсными модулированными (ШИМ) сигналами, несущими аналоговые сигналы. Необходимая форма сигнала получаются с помощью простой схемы резистивно-конденсаторного фильтра. Прямоугольный сигнал на выводе 3 снимается без фильтра.

Эти формы сигналов синтезируются с использованием функций управления прерыванием Timer0 и Compare-Match микроконтроллера Arduino (ATmega328). Таймер1 ATmega328 запрограммирован на частоту 10 кГц для генерации выходных сигналов ШИМ.

Переключатель S2, подключенный к контакту 8 платы Board1, используется для изменения частотного диапазона. В программе предусмотрено два частотных диапазона: от 30 до 250 Гц и от 250 до 2500 Гц для покрытия среднего диапазона звуковых частот. Эти сигналы от CON2 до CON4 можно просмотреть на осциллографе.

Скетч функционального генератора

Программа должна быть загружена в Ардуино с помощью программного обеспечения Arduino IDE. С USB-кабелем, подключенным между Arduino и ПК, значение частоты можно посмотреть на дисплее LCD1, а на последовательном плоттере в Arduino IDE посмотреть форму сигнала.

Переключатель S1, подключенный к контакту 2 платы Board1, используется для переключения отображения между LCD1 и последовательным плоттером в Arduino IDE. Если контакт 2 заземлен, осциллограммы (синусоидальный, квадратный и пилообразный сигнал) можно просматривать на последовательном плоттере, как на цифровом осциллографе:

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

Каждая форма сигнала имеет величину около 5 В. Таким образом, синусоидальная волна изменяется от 0 до 5 В и не переходит в отрицательную.

Подключения LCD1 выполняются на печатной плате с помощью 16-контактной гребенки. Резистор на 470 Ом (R1), подключенный к выводу 15, используется для подсветки LCD1. Питание для ЖК-дисплея берется с контактов 5В и Gnd платы Arduino.

USB-кабель используется для подключения Arduino к ПК или ноутбуку. После загрузки программы плату Arduino и LCD1 можно запитать от адаптера / аккумулятора напряжением 9 вольт.

Строительство и испытания

Компоновка печатной платы (см. плата своими руками) генератора частоты и расположение его компонентов показано на следующем рисунке:

Печатная плата

После сборки схемы на печатной плате загрузите исходный код на плату Arduino. Отсоедините плату от компьютера и подключите ее к источнику питания 9 В через разъем CON1.

Вы можете просмотреть сгенерированное значение частоты на ЖК-дисплее, разомкнув переключатель S1, или проверить различные формы сигналов на последовательном плоттере, замкнув S1.

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

Ваш адрес email не будет опубликован.