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

Digitrode

цифровая электроника вычислительная техника встраиваемые системы

  • Вычислительная техника
    • Микроконтроллеры микропроцессоры
    • ПЛИС
    • Мини-ПК
  • Силовая электроника
  • Датчики
  • Интерфейсы
  • Теория
    • Программирование
    • ТАУ и ЦОС
  • Перспективные технологии
    • 3D печать
    • Робототехника
    • Искусственный интеллект
    • Криптовалюты

Чтение RSS

Генератор сигналов своими руками на Arduino

Каждый инженер, который любит поработать с электроникой, в какой-то момент времени захочет иметь собственную лабораторию. Мультиметр, осциллограф, измеритель LCR, функциональный генератор, двухрежимный источник питания и автоматический трансформатор – это минимальное оборудование для достойной лаборатории. В то время как все они могут быть приобретены, мы также можем легко собрать самостоятельно несколько приборов, таких как генератор функций и двухрежимный источник питания.

В этой статье мы узнаем, как быстро и легко мы можем создать собственный генератор сигналов с помощью Arduino. Этот генератор может создавать прямоугольный сигнал или меандр (5 В / 0 В) с частотой от 1 Гц до 2 МГц, частоту сигнала можно контролировать с помощью регулятора, а скважность (обратная рабочему циклу) жестко закодирована на 50%, но ее легко изменить в программе. Кроме того, генератор может также производить управление частотой.

Ниже приведена полная принципиальная схема этого генератора сигналов на основе Arduino. Как вы можете видеть, у нас есть Arduino Nano, который действует как мозг нашего проекта и ЖК-дисплей 16×2 для отображения значения частоты, которая в настоящее время генерируется. У нас также есть угловой кодер, который поможет нам установить частоту. Подача питания осуществляется от USB-порта самого Arduino.

Схема довольно проста; мы создаем прямоугольный сигнал на выводе D9, который может быть использован как таковой, частота этого прямоугольного сигнала контролируется поворотным кодером. Затем, чтобы получить синусоидальную волну, мы получаем сигнал SPWM (синусоидальная ШИМ) на выводе D5, частота этого сигнала должна быть связана с частотой PWM (ШИМ), поэтому мы заводим этот сигнал ШИМ на контакт D2, чтобы он действовал как прерывание, а затем используем ISR для управления частотой.

Люди, которые используют Arduino, могут быть знакомы с тем, что Arduino может генерировать сигналы ШИМ, просто используя функцию аналоговой записи. Но эта функция ограничивается только контролем рабочего цикла сигнала ШИМ, а не частоты сигнала. Но для генератора сигналов нам нужен сигнал ШИМ, частота которого может контролироваться. Это можно сделать, непосредственно управляя таймерами Arduino и переключая на него контакт GPIO. Но есть некоторые готовые библиотеки, которые делают то же самое и могут использоваться как таковые. Библиотека, которую мы используем, является библиотекой настройки частоты Arduino PWM Frequency Library (https://code.google.com/archive/p/arduino-pwm-frequency-library/downloads).

Есть и некоторые недостатки в этой библиотеке, потому что библиотека изменяет настройки Timer 1 и Timer 2 по умолчанию в Arduino. Следовательно, вы больше не сможете использовать серво-библиотеку или любую другую библиотеку, связанную с таймером. Также функция аналоговой записи на контактах 9,10,11 и 13 использует таймер 1 и таймер 2, поэтому вы не сможете создавать SPWM на этих контактах.

Преимущество этой библиотеки в том, что она не мешает таймеру 0 вашего Arduino, который более важен, чем таймер 1 и таймер 2. Из-за этого вы можете без проблем использовать функцию задержки и функцию millis(). Также контакты 5 и 6 управляются таймером 0, поэтому у нас не будет проблем с использованием аналоговой записи или управления сервомотором на этих контактах.

Поскольку мы знаем, что микроконтроллеры – это цифровые устройства, и они не могут генерировать синусоидальную волну простым кодированием. Но есть два популярных способа получения синусоидальной волны от микроконтроллера – это использование ЦАП и создание синусоидального ШИМ сигнала (SPWM). К сожалению, платы Arduino (кроме Due) не поставляются со встроенным ЦАП для создания синусоидальной волны, но вы всегда можете создать свой собственный ЦАП, используя простой метод R2R, а затем использовать его для создания приличной синусоидальной волны. Но для уменьшения аппаратной работы лучше использовать более оптимальный метод создания сигнала SPWM и затем преобразовать его в синусоидальную волну.

Сигнал SPWM очень похож на PWM, но для него рабочий цикл управляется таким образом, чтобы получить среднее напряжение, подобное напряжению синусоидальной волны. Например, при 100%-ном рабочем цикле среднее выходное напряжение будет 5 В, а для 25% мы будем иметь 1,25 В, таким образом, управляя рабочим циклом, мы можем получить предварительно определенное переменное среднее напряжение, которое является ничем иным, как синусоидальной волной. Этот метод обычно используется в инверторах.

В приведенном выше изображении синим сигналом является сигнал SPWM. Обратите внимание, что рабочий цикл волны изменяется от 0% до 100%, а затем обратно до 0%. График строится в диапазоне напряжения от -1,0 до + 1,0 В, но в нашем случае, поскольку мы используем Arduino, масштаб будет составлять от 0 до 5 В.

Преобразование SPWM в синусоидальную волну требует наличие H-мостовой схемы, которая состоит из минимум 4 коммутаторов питания. Мы не будем углубляться в его принцип работы, поскольку мы не используем его здесь. Эти схемы H-мостов обычно используются в инверторах. Они используют два сигнала SPWM, где один сдвинут по фазе от другого, и оба сигнала применяются к переключателям питания в H-мосте, чтобы включить и выключить диагональные противоположные ключи в одно и то же время. Таким образом, мы можем получить волновую форму, которая похожа на синусоидальную волну, но она будет зашумленная. Чтобы получить чистый результат, мы должны использовать фильтр, подобный фильтру нижних частот, который состоит из катушки индуктивности и конденсатора.

Однако в нашей схеме мы не будем обеспечивать на выходе столь чистый синусоидальный сигнал, поэтому обойдемся простым RC-фильтром. Вы также можете попробовать LC-фильтр для получения лучших результатов, но здесь мы выберем RC для простоты. Значение резистора составляет 620 Ом, а конденсатор – 10 мкФ. На приведенном выше рисунке показан сигнал SPWM (желтый) с вывода 5 и синусоида (синий), который был получен после прохождения через RC-фильтр.

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

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

Подключите щуп к выводу квадратного сигнала и выводу синусоидального сигнала. Используйте два светодиода на этих двух контактах, если у вас нет осциллографа. Включите схему, и вас поприветствует вводное сообщение на ЖК-дисплее. Затем поверните вал энкодера и установите требуемую частоту, чтобы вы могли наблюдать прямоугольную волну и синусоидальную волну, как показано ниже. Если вы используете светодиод, вы должны заметить, что светодиод мигает с разными интервалами в зависимости от частоты, которую вы установили.

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

Генератор сигнала (т.н. функциональный генератор) может быть использован для тестирования и отладки схем. Я часто использую его для проверки частотных характеристик электронных компонентов, например ОУ и датчиков. Этот генератор сигналов построен на плате Arduino. Он может выдавать четыре типа сигнала: синусоидальный, треугольный, прямоугольный и пилообразный, частота каждого из которых может регулироваться от 1Гц до 50 кГц. Частота, длительность импульса и амплитуда (усиление) сигналов управляется тремя потенциометрами. Я также добавил опциональный светодиодный индикатор, который указывает какой сигнал сейчас на выходе.

Термоусадка.
Провод №22.
Припой.
Дрель со сверлами.
Термоклей.
Клей

Подготовка Arduino Proto Shield

Arduino Proto Shield — это удобный способ добавления своей схемы к Arduino, но я решил немного его урезать, чтобы он занимал меньше места в корпусе. Сначала я укоротил выводы при помощи кусачек. Потом я убрал шести контактный разъем. После этого я удалил разъемы с верхней части платы.

Корпус

Я решил использовать лазерный резак для изготовления корпуса. Я разработал корпус используя AutoCAD, Autodesk 123D Make, и Corel Draw. Все файлы проекта можно скачать внизу статьи. Если у вас нет доступа к лазерному резаку, вы можете сделать все детали корпуса вручную по двумерным чертежам.

На картинке показаны отверстия на передней панели:
(3x) 7мм отверстие для потенциометров усиления, частоты и ШИМ.
(3x) 7мм отверстие для четырех кнопок — синусоидальный, треугольный, прямоугольный и пилообразный сигналы.
(1x) 10мм отверстие для аудио разъема.

Я вырезал изображения всех четырех сигналов для того чтобы их можно было подсвечивать, но вы можете просверлить простые отверстия 5мм для светодиодов под каждой кнопкой.
Также есть прямоугольное (высота11мм, ширина 12 мм) отверстие для USB-порта Arduino в задней части устройства.

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

Пайка проводов к кнопкам

Припаяйте 10 кОм резистор к одному из выводов каждой кнопки. Припаяйте зеленый провод к месту соединения кнопки и резистора и красный провод к резистору как показано на фото. Черный провод припаяйте к другому контакту кнопки. Все эти соединения надо заизолировать термоусадкой во избежание короткого замыкания.

Установка аудио разъема

Свинтите пластиковый корпус с аудио разъема. Припаяйте красный провод к двум стерео контактам и черный провод к GND как показано на фотографии. Я использовал термоклей для предотвращения короткого замыкания и дополнительной фиксации проводов и пайки. После этого, вставьте гнездо в отверстие в корпусе и закрепите его термоклеем.

Установка кнопок

Снимите с кнопок верхнюю часть и установите их в корпус, зафиксировав термоклеем. После его высыхания, установите верхнюю часть кнопок обратно.

R2R ЦАП на Arduino Shield

Припаяйте восемь резисторов 20кОм на Arduino Proto Shield. Один из выводов каждого резистора должен быть подключен к цифровым контактам Arduino 0-7.

Припаяйте семь резисторов 10кОм на Arduino Proto Shield так, чтобы они были между выводами ранее припаянных восьми резисторов 20 кОм.

Припаяйте резистор 10кОм на Arduino Proto Shield так, чтобы один вывод резистора 10кОм был присоединён к цифровому контакту 0 Arduino, а другой вывод к GND.

Читайте также  Резисторы, ток и напряжение

Панелька для микросхем

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

Фильтр нижних частот

В качестве ФНЧ (Фильтр Нижних Частот) выступают резистор и конденсатор, соединенные последовательно. ФНЧ пропускает низкие частоты и подавляет ступеньки на сигнале.

Вот как я рассчитал номиналы компонентов в своем ФНЧ:
Частота среза = 1/(2*pi*R*C)

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

Если я использую резистор 300 Ом, и хочу иметь частоту среза 50 кГц:
50000 = 1/(6.28*300*C)
C = 1.06*10^-8 F
Если немного округлить:
C = 0.01 мкФ

Подключите один вывод резистора 300 Ом к резистору 10 кОм, подключенному к цифровому выводу 7. Подключите конденсатор к другому выводу резистора 300 Ом. Второй вывод конденсатора подключается к GND.

Усилитель

Подключите положительный вывод конденсатора 220мкФ к соединению резистора и конденсатора в ФНЧ. Второй вывод конденсатора 220мкФ подключается к резистору 20 кОм, второй вывод которого подключается к 3 выводу панельки для микросхемы. Резистор 4.7 кОм подключается между 3 и 4 контактами панельки. К 4 выводу панельки подключается GND.

Подключите положительный вывод второго конденсатора 200мкФ к 5 контакту панельки. Позже, второй его вывод будет к подключен к потенциометру «Усиление». Подключите 6 контакт панельки к Vin, 2 контакт к GND и вставьте микросхему в панельку.

Подключение потенциометра «Усиление»

Громкость или усиление звукового сигнала будет управляться аудио потенциометром 10 кОм с выключателем. Подключите выход усилителя и GND к потенциометру, как показано на фото. Средний контакт это аудио выход, который будет подключен непосредственно к разъему.

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

Подключение батареи

Подключить черный провод от разъема для батареи к GND Arduino Shield. Один провод от выключателя в потенциометре подключите к красному проводу, а второй провод от выключателя потенциометра к Vin Arduino Shield. Пока не подсоединяйте батарею.

Подключение аудио разъема

Соедините выход усилителя (отрицательный вывод конденсатора подключенного к 5 пятому выводу панельки) с красным проводом присоединенным к аудио разъему раньше. Черный провод подключите к GND Arduino Shield.

Подключение кнопок

Подключите все красные провода от кнопок к 5В и все черные провода к GND Arduino shield. Подключите зеленые провода к аналоговым контактам 0-3 в следующем порядке:
Аналоговый контакт 0 = Прямоугольный
Аналоговый контакт 1 = Треугольный
Аналоговый контакт 2 = Пилообразный
Аналоговый контакт 3 = Синусоидальный

Подключение потенциометров «Частота» и ШИМ

Подключите красный, черный, и зеленый провода к потенциометрам 10кОм и 50кОм, как показано на фотографии. Подключите красный провод к 5В и черный провод к GND Arduino shield. Подключите зеленые провода к аналоговым контактам 4 (ШИМ) и 5 (Частота).

Установка потенциометров

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

Подключение светодиодов

Подсоедините резистор 470 Ом к катоду каждого из четырех светодиодов. Припаяйте черный провод ко второму выводу резистора и красный провод к аноду светодиода. Заизолируйте всё термоусадкой во избежание короткого замыкания. Припаяйте черные провода от всех четырех светодиодов на GND Arduino shield. Припаяйте красные провода к цифровым контактам 8-11.

Установка светодиодов

Приклейте светодиоды в корпусе так, что каждый из них подсвечивал один символ на передней панели :
Цифровой контакт 8 = Прямоугольный
Цифровой контакт 9 = Треугольный
Цифровой контакт 10 = Пилообразный
Цифровой контакт 11 = Синусоидальный

Черный свето рассеиватель

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

Программа

Прошейте Arduino кодом в файле function_generator.ino. В коде используются прерывания по таймеру на частоте 100 кГц для отправки новых данных в ЦАП. Остальная часть кода следит за состоянием кнопок и потенциометров. Так как прерывания происходят на высокой частоте, я должен сделать программу обработки прерываний в ISR(TIMER1_COMPA_vect)<> как можно короче. Математические операции с плавающей точкой и с помощью функции sin() занимают слишком много времени. Я рассмотрел с нескольких проектов, и получил это: Для треугольного и пилообразного сигнала я создал переменные sawByte, triByte, sawInc, и triInc. Каждый раз, когда частота меняется, я подсчитываю сумму на которую частота треугольного и пилообразного сигналов должна измениться с частотой 100 кГц:

То есть все, что должно быть сделано в прерывании, является простой математикой:

Для синусоидально сигнала, я написал простой скрипт на Python, который выводит 20000 значений 127+127 sin(х) за один полный цикл:

Я сохранил этот массив в памяти Arduino под названием sine20000[] и беру из него значения которые необходимо отправить в ЦАП. Это намного быстрее, чем вычислять значения каждый раз.

Последние штрихи

Подключите shield к Arduino. Подключите 9В батарею к разъему. Закрепите эти элементы внутри корпуса. Убедитесь, что USB-порт Arduino доступен снаружи. После запуска вы должны увидеть светящийся индикатор синусоиды.

Установка задней панели и ручек

Просверлите четыре отверстия на задней панели и закрепите её с помощью винтов. Привинтите ручки на потенциометры.

Тестирование

Немного поверните ручку усиление, чтобы включите генератор. Включите штекер в гнездо и подключите к нему осциллограф. Проверяйте каждый сигнал и меняйте его частоту, чтобы убедится, что всё в порядке. Переключитесь на Прямоугольный сигнал и проверьте наличие ШИМ сигнала.

Вы заметите, что прямоугольный сигнал является единственным, который по настоящему регулируется от 1 Гц до 50 кГц. Поскольку частота дискретизации 100 кГц, синусоидальный, треугольный, и пилообразный сигналы становятся немного неузнаваемыми примерно после 25 кГц (4 отсчета за такт-100kHz/25kHz). Пилообразный и треугольный сигналы понижаются примерно 100 Гц, иначе значения triInc и sawInc станут настолько низким, что они округляются до нуля. Синусоидальный сигнал понижается до 1 Гц, но на самом деле до 5Гц, так как Arduino имеет достаточно памяти только для хранения около 20 тыс. значений.

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

Начнём с самого простого: генерация импульса заданной длины, такое часто бывает нужно. Проще всего сделать это на 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 мкс).

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

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

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

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

Генератор сигналов прямоугольной и синусоидальной формы на Arduino

Каждый инженер, увлекающийся электроникой, на определенном этапе своей деятельности мечтает о создании своей мини лаборатории. Мультиметр, осциллограф, генератор сигналов специальной формы, источник питания, трансформатор – вот лишь минимальный обязательный набор для подобной лаборатории. Конечно, сейчас все это можно купить, но чтобы сэкономить свои деньги, часть из этих устройств можно сделать самостоятельно на основе платы Arduino. Например, генератор сигналов или осциллограф.

В этой статье мы рассмотрим как на основе платы Arduino достаточно просто сконструировать генератор сигналов прямоугольной и синусоидальной формы. При формировании сигналов прямоугольной формы данный генератор может формировать прямоугольную волну с перепадами уровней 5V/0V с частотой от 1 Гц до 2 МГц. Частотой формируемого сигнала можно будет управлять с помощью инкрементального энкодера. Коэффициент заполнения (цикл занятости) данного сигнала будет равен 50%, но его можно изменить, внеся соответствующие изменения в программу. Рассматриваемый нами генератор не является промышленным устройством и его не рекомендуется использовать на серьезном производстве, но для домашних условий использования он вполне подойдет.

Также на нашем сайте вы можете посмотреть проекты более «продвинутых» генераторов для формирования сигналов прямоугольной и синусоидальной формы:

Если же вам нужно исключительно простое решение для формирования сигналов прямоугольной формы с частотой до 1 МГц с помощью платы Arduino, то рекомендуем этот проект.

Необходимые компоненты

  1. Плата Arduino Nano (купить на AliExpress).
  2. Алфавитно-цифровой ЖК дисплей 16х2 (купить на AliExpress).
  3. Инкрементальный энкодер, угловой кодер (Rotary Encoder) (купить на AliExpress).
  4. Резисторы 5,6 кОм и 10 кОм (купить на AliExpress).
  5. Конденсатор 0,1 мкФ (купить на AliExpress).
  6. Перфорированная плата.
  7. Набор для пайки.

Работа схемы

Схема генератора сигналов на основе платы Arduino представлена на следующем рисунке.

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

Схема запитывается от USB кабеля Arduino. Необходимые соединения в схеме представлены в следующей таблице.

Контакт платы Arduino Куда подключен
D14 контакт RS ЖК дисплея
D15 контакт RN ЖК дисплея
D4 контакт D4 ЖК дисплея
D3 контакт D5 ЖК дисплея
D6 контакт D6 ЖК дисплея
D7 контакт D7 ЖК дисплея
D10 to Rotary Encoder 2
D11 to Rotary Encoder 3
D12 to Rotary Encoder 4
D9 выход прямоугольного сигнала
D2 контакт D9 платы Arduino
D5 выход SPWM сигнала

В схеме мы будем формировать прямоугольную волну (сигнал прямоугольной формы) на контакте D9 платы Arduino. Его частоту мы будем регулировать с помощью углового кодера. Для формирования синусоидального сигнала мы будем формировать SPWM сигнал (синусоидальный ШИМ (широтно-импульсной модуляции) сигнал) на контакте D5, его частота будет зависеть от частоты сигнала прямоугольной формы, которая будет подаваться на контакт D2 и будет действовать как прерывание и затем мы с помощью процедуры обработки (обслуживания) прерывания будем управлять частотой синусоидального сигнала.

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

Формирование прямоугольного сигнала с изменяемой частотой

Если вы знакомы с Arduino, то вы должны знать что плата Arduino может достаточно просто формировать ШИМ сигнал (с помощью функции analogwrite) на ряде своих контактов. Но с помощью этой функции можно управлять только коэффициентом заполнения (скважностью) ШИМ сигнала, но нельзя управлять его частотой – а это как раз и нужно для нашего генератора сигналов. Управление частотой сигнала прямоугольной формы можно осуществить используя таймеры платы Arduino и непосредственно переключая состояние контактов на их основе. Помочь нам в этом может библиотека Arduino PWM Frequency Library (библиотека управления частотой ШИМ сигнала), более подробно работу с ней мы рассмотрим далее в статье.

Но в использовании этой библиотеки есть ряд слабых сторон. Дело в том, что данная библиотека изменяет настройки по умолчанию Таймера 1 (Timer 1) и Таймера 2 (Timer 2) платы Arduino. В связи с этим вы уже не сможете, к примеру, использовать библиотеку для управления серводвигателем или другие библиотеки, задействующие эти таймеры платы Arduino. Также функция analogwrite на контактах 9,10,11 & 13 использует Timer 1 и Timer 2, следовательно, вы уже не сможете формировать SPWM сигнал (синусоидальный ШИМ сигнал) на этих контактах.

Но преимуществом этой библиотеки является то, что она не мешает работа Таймера 0 (Timer 0) платы Arduino, который в нашем случае является более важным чем Timer 1 и Timer 2 потому что в этом случае вы можете без проблем использовать функцию задержки (delay) и функцию millis(). Также контакты 5 и 6 управляются Таймером 0, поэтому мы без проблем сможем использовать на этих контактах функцию analogwrite или осуществлять управление сервомотором.

Формирование синусоидальной волны (колебания) с помощью Arduino

Мы знаем, что микроконтроллеры являются цифровыми устройствами, поэтому они не могут формировать синусоидальную волну в «чистом» виде. Но есть два способа формирования синусоидальной волны с помощью микроконтроллера: первый заключается в использовании ЦАП (цифро-аналогового преобразователя), а второй — в использовании синусоидального ШИМ сигнала (SPWM). К сожалению, в платах Arduino (за исключением платы Arduino Due) нет встроенного ЦАПа для формирования синусоидальной волны. Конечно, можно было бы использовать внешний ЦАП, но мы решили не усложнять таким образом схему проекта и использовать метод формирования синусоидального ШИМ сигнала с дальнейшим преобразованием его в синусоидальный сигнал (волну).

Что такое SPWM сигнал

SPWM расшифровывается как Sinusoidal Pulse Width Modulation и переводится как синусоидальная широтно-импульсная модуляция (синусоидальная ШИМ). Этот сигнал в определенной степени похож на обычный ШИМ сигнал, но в нем коэффициент заполнения контролируется таким образом чтобы получить среднее напряжение похожее на синусоидальную волну. Например, при коэффициенте заполнения (скважности) 100% среднее выходное напряжение будет 5V, а при коэффициенте заполнения 25% оно будет всего лишь 1.25V, таким образом, управляя скважностью (коэффициентом заполнения) мы можем получить заранее определенные изменяемые значения среднего напряжения, то есть синусоидальную волну. Этот метод обычно используется в инверторах.

Принцип формирования SPWM сигнала показан на следующем рисунке.

Синим цветом на этом рисунке показан SPWM сигнал. Заметьте, что его скважность (коэффициент заполнения) изменяется от 0% до 100%, а затем снова возвращается в 0%. Представленный график построен для диапазона изменения напряжений от -1.0 до +1.0V, но в нашем случае, поскольку мы используем плату Arduino, масштаб подобного графика будет от 0V до 5V. Мы рассмотрим как в программе для Arduino формировать SPWM сигнал далее в статье.

Преобразование SPWM сигнала в синусоидальную волну

Преобразование SPWM сигнала в синусоидальную волну обычно требует использования схемы H-моста (H-bridge), которая состоит минимум из 4-х переключателей мощности (power switches). Подобные схемы обычно используются в инверторах. Мы не будем в статье подробно рассматривать эти вопросы поскольку нам с помощью нашей синусоидальной волны не нужно запитывать какое-либо устройство, нам всего лишь нужно ее сформировать. К тому же с помощью H-моста невозможно получить чистую синусоидальную волну – для этой цели необходимо использовать фильтр нижних частот (ФНЧ), состоящий из конденсаторов и индуктивностей.

Читайте также  Использование ис семейства tl494 в преобразователях питания

Но мы в целях упрощения проекта для этой цели применили простой RC-фильтр. Если же вы хотите повысить качество формирования синусоидальной волны, то вы можете вместо RC-фильтра применить LC-фильтр. Значение сопротивления резистора в нашем RC-фильтре составляет 620 Ом, а значение емкости конденсатора составляет 10 мкФ (номиналы отличаются от тех, которые приведены в начале статьи в разделе «необходимые компоненты», но я надеюсь в комментариях к данной статье более опытные в этих вопросах специалисты подскажут где же здесь правда – статья переведена с другого сайта и там присутствует эта опечатка, к сожалению). На представленном рисунке желтым цветом показан SPWM сигнал с контакта 5 платы Arduino, а синим цветом — синусоидальный сигнал, полученный после прохождения SPWM сигнала через наш RC-фильтр.

Библиотека для управления частотой ШИМ сигнала в Arduino

Эту библиотеку вы можете скачать по следующей ссылке — Arduino PWM Frequency Library.

По представленной ссылке вы скачаете библиотеку в виде ZIP файла. После извлечения информации из этого ZIP файла вы получите каталог (папку) с именем PWM. Перейдите в папку с библиотеками Arduino IDE (для пользователей операционной системы Windows эта папка будет располагаться по адресу C:UsersUserDocumentsArduinolibraries) и скопируйте туда эту PWM папку. Возможно, в библиотеках Arduino IDE у вас уже есть папка с именем PWM – в этом случае вам ее необходимо заменить на новую (скачанную) папку.

Объяснение программы для Arduino

Полный код программы приведен в конце статьи, здесь же мы рассмотрим его наиболее важные фрагменты. Перед компиляцией программы не забудьте добавить в библиотеки Arduino указанную библиотеку Arduino PWM Frequency Library, иначе компиляция программы будет выдавать вам ошибку.

Нам необходимо формировать ШИМ сигнал с изменяемой частотой на контакте 9 платы Arduino. Эта частота будет устанавливаться с помощью углового кодера, а ее значение будет отображаться на экране ЖК дисплея. А когда ШИМ сигнал будет формироваться на контакте 9 он также будет создавать прерывание на контакте 2 поскольку мы соединили оба этих контакта. Используя это прерывание мы можем управлять частотой SPWM сигнала, который будет формироваться на контакте 5.

Как обычно вначале программы мы должны подключить используемые библиотеки. Библиотека для работы с ЖК дисплеем встроена в Arduino IDE, а библиотеку для изменения частоты ШИМ сигнала мы только что скачали.

Делаем генератор частоты на базе Ардуино микроконтроллера

Генератор частоты на Ардуино – это прибор для преобразования электрической энергии источника постоянного тока.

Что такое генератор

Генератор производит преобразование в энергию, не поддающуюся затуханию, для расчета и частоты и образованной формы электрических колебаний.

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

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

Такой прибор, как генератор сигналов на Ардуино, легко сделать в домашних условиях. Основа конструкции – микроконтроллер Arduino.

Где применяется генератор частоты на Ардуино

Роль частотного генератора в мире электроники – настройка и определение технической характеристики тактов сигнальных волн. Другое применение – для регулировки узлов и элементов приемников, передающих радио-колебания.

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

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

Поэтому устройства с такими свойствами играют немаловажную роль в конструировании электронных приборов. Перечислим другие значительные функции Ардуино-генератора:

  1. Поиск расположения мест, где можно проложить кабели и трубопроводы. Причем поисковая работа проводится на дальних расстояниях.
  2. Поисковые работы для находки мультичастотной технологии с помощью процесса излучения сразу нескольких частотных волн.
  3. Создание аналоговых синтезаторов. Синтезирующие устройства применяются для сборки электронных устройств без использования множества блоков. Все сигнальные волны мелькают между разными блоками строго по стандартам.

Комплектующие

Для создания генератора прямоугольных импульсов на Ардуино понадобятся следующие компоненты:

  1. Arduino Uno R3 в антистатической упаковке;
  2. Шилд DFRobot LCD Keypad Shield;
  3. Модуль генератора сигналов AD9850 DDS;
  4. Проводы для присоединения частей конструкции – 8 штук;
  5. USB-провод или кабель.

Также во втором случае можно собрать устройство на основе AD9850 DDS модуля и 1,8-дюймового TFT-дисплея (контроллер ST7735).

В таком случае схема соединения будет выглядеть так:

Код для Ардуино

Листинг программы для проекта «генератор импульсов с регулировкой частоты на Ардуино» для первого нашего варианта:

Во втором случае программный код будет таким (позаимствовано на просторах интернета):

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

Для второго варианта нужны следующие технические спецификации:

И библиотеки для Arduino:

Сборка генератора

Алгоритм сборки проекта Arduino-генератор импульсов:

  1. Скачиваем и устанавливаем последнюю версию бесплатной среды разработки для программирования микропроцессора Ардуино. На нашем сайте указано, как правильно произвести первичную настройку. Также пользователь найдет все возможные ответы на свои вопросы по работе с данной средой.
  2. С помощью USB-кабеля подключаем микропроцессор к компьютерному устройству. Далее перемещаем программу, код которой указан в разделе выше, в память платформы.

Настройка

Если по окончанию загрузки пользователь получил сообщение «Done uploading», значит, генератор сигналов на Ардуино с дисплеем готов к работе. Следующий шаг – соединение модулей.

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

  • QOUT1,
  • QOUT2 (прямоугольный),
  • ZOUT1,
  • ZOUT2 (синусоидальный).

После сборочных работ следует тщательно проверить, правильно ли подключены все контакты. Если все правильно подключено – подаем питание в устройство из электросети.

По истечению пары секунд на дисплее загорится стандартное значение частоты – 10 кГц. Значение можно изменить в любое время – для этого в листинге выше запрограммированы кнопки вверх, вниз, влево и вправо.

Проверка работы

В первом случае после конструирования должен получиться стандартный мотор-редуктор Ардуино синусоидальных и прямоугольных волновых сигналов, диапазон которых регулируется от до 40 МГц.

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

Во втором случае итоговое решение будет выглядеть так:

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

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

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

в Ардуино 0 2,884 Просмотров

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

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

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

Схема содержит плату 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.