Документация Engee
Notebook

Генерация кода для Arduino (генерация ШИМ сигнала)

В этом примере мы покажем, как в Engee можно сгенерировать программный код для генерации ШИМ на платформе Arduino.

Введение

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

Другие способы, которым можно воспользоваться:

  • Сравнивать плавно меняющийся аналоговый сигнал с пилообразным сигналом и переключать диод в момент пересечения
  • Использовать одну из встроенных функций Arduino

Подготовка платформы

Для этого примера нам потребуется Arduino-совместимая платформа (Uno, Leonardo, Iskra и другие) и подходящий у ней шнур USB. Также нужно будет установить на ваш компьютер среду Arduino IDE, найти и поставить дополнительные драйверы (если необходимо) и подключить имеющуюся плату через порт USB.

image_2.png

Описание модели

В этом примере мы будем генерировать код из модели pwm.engee.

Интерфейс модели совпадает с интерфейсом в примере arduino_blink. На каждом шаге вычислений она:

  1. переключает состояние светодиода при помощи выхода out_LED_BUILTIN (изначально равно 1, с каждым циклом меняется на "противоположное"),
  2. возвращает Arduino значение временной задержки при помощи выхода param_WAIT_MS (значение в миллисекундах).

image_2.png

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

Именно при помощи значения param_WAIT_MS мы будем управлять скважностью импульса, включая и выключая "бортовой" светодиод платформы Arduino импульсами разной длины.

ШИМ-сигнал характеризуется тем, что в течение фиксированного периода $T_d$ он сменяет состояние 1 и состояние 0, длительность которых в сумме равна $T_d$, но отношение которых изменяется при помощи параметра $w$ (скважность).

image.png

Мы будем использовать этот сигнал для имитации плавного управления яркостью светодиода на платформе Arduino.

Приведение типов данных

В основном, блоки модели Engee находят прямое отражение в коде для Arduino. Не все платформы используют одинаковые стандарты языков С/С++. Естественно, при создании кода всегда приходится думать о низкоуровневых деталях реализации.

В этом примере проблемой, которую мы преодолеваем в Engee, является автоматическое приведение типов. На платформе Arduino:

  • При сложении булевого типа данных с численным на выходе получается булевый
  • При сложении типа данных double с беззнаковым целым числом на выходе получается беззнаковое целое число (работа синусоиды оказывается неверной, если не указать особый тип данных)

Где возникают проблемы с типами данных?