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

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

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

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

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

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

Работа схемы

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

Схема генератора сигналов прямоугольной и синусоидальной формы на основе платы 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, то вы должны знать что плата 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 сигнала

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

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

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

Вид сформированной в нашем генераторе синусоидальной волны

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

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

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

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

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

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

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

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

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

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

Далее мы должны использовать такую важную в нашем случае команду как InitTimerSafe, которая инициализирует timer 1 и timer 2 для формирования ШИМ сигнала с изменяемой частотой. Помните, что как только вы используете эту функцию, все настройки по умолчанию для этих таймеров будут сброшены.

Также мы используем внешнее прерывание на контакте 2. То есть всегда, когда будет изменяться состояние контакта 2, будет вызываться процедура обработки прерывания (ISR — Interrupt service routine). В нашем случае этой процедурой обработки прерывания выступает функция generate_sine.

Далее, в функции void loop нам необходимо проверять произошел ли поворот оси энкодера и только когда это произошло нам следует корректировать (изменять) частоту ШИМ сигнала. Если вы впервые сталкиваетесь с таким устройством как инкрементальный энкодер, то вначале рекомендуем прочесть статью о его подключении к плате Arduino.

Если ось инкрементального энкодера вращается по часовой стрелке нам необходимо увеличивать частоту формируемого сигнала при помощи изменения коэффициента умножения. По умолчанию мы устанавливаем его значение равным 32768 что соответствует коэффициенту заполнения (скважности) ШИМ 50% потому что 32768 составляет 50% от 65536. Далее, изменяя это значение, мы можем изменять и коэффициент заполнения ШИМ. После установки коэффициента умножения функция SetPinFrequencySafe используется для установки частоты выходного сигнала на контакте 9.

Внутри функции для обработки прерывания (ISR) нам необходимо написать код для формирования SPWM сигнала. Существует много способов формирования SPWM сигнала в плате Arduino – можно найти даже библиотеки, специально написанные для этой цели. Мы выбрали самый простой из этих способов – мы будем использовать функцию sin(), доступную в Arduino. Функция sin() возвращает изменяющееся значение в диапазоне от -1 до +1 и если мы построим ее зависимость от времени мы как раз получим синусоидальную волну.

После этого все, что нам остается сделать, это преобразовать значение из диапазона от -1 до +1 в диапазон от 0 до 255 и затем передать его в функцию analogWrite. В данном случае мы использовали простое умножение на 255 и затем применили функцию map для преобразования значения из диапазона от -255 до +255 в диапазон от 0 до +255. Затем это значение просто подается на контакт 5 с помощью функции analogWrite. Значение переменной angle (а она у нас имитирует время) увеличивается на 0.2 каждый раз при вызове процедуры (функции) обработки прерывания, что позволяет нам управлять частотой формируемого синусоидального сигнала.

Тестирование работы генератора сигналов

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

Тестирование работы генератора сигналов

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

Тестирование генератора сигналов прямоугольной и синусоидальной формы с помощью осциллографа

Более подробно работу проекта вы можете посмотреть на видео, приведенном в конце статьи.

Исходный код программы (скетча)

Видео, демонстрирующее работу схемы

Источник статьи

(Проголосуй первым!)
Загрузка...
160 просмотров

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *