Генерация кода для Arduino (генерация ШИМ сигнала)¶
В этом примере мы покажем, как в Engee можно сгенерировать программный код для генерации ШИМ на платформе Arduino.
Введение¶
Создать широтно-импульсно модулированный сигнал (ШИМ) можно множеством способов. Мы реализуем модель из базовых компонентов, максимально похожую на демонстрационный пример arduino_blink
. То есть нам предстоит управлять временной задержкой между событиями включениям и выключения светодиода.
Другие способы, которым можно воспользоваться:
- Сравнивать плавно меняющийся аналоговый сигнал с пилообразным сигналом и переключать диод в момент пересечения
- Использовать одну из встроенных функций Arduino
Подготовка платформы¶
Для этого примера нам потребуется Arduino-совместимая платформа (Uno, Leonardo, Iskra и другие) и подходящий у ней шнур USB. Также нужно будет установить на ваш компьютер среду Arduino IDE, найти и поставить дополнительные драйверы (если необходимо) и подключить имеющуюся плату через порт USB.
Описание модели¶
В этом примере мы будем генерировать код из модели pwm.engee
.
Интерфейс модели совпадает с интерфейсом в примере arduino_blink
. На каждом шаге вычислений она:
- переключает состояние светодиода при помощи выхода
out_LED_BUILTIN
(изначально равно 1, с каждым циклом меняется на "противоположное"), - возвращает Arduino значение временной задержки при помощи выхода
param_WAIT_MS
(значение в миллисекундах).
Скважность будет изменяться по синусоиде с частотой, заданной в блоке Sine
. Максимальное значение задается в качестве амплитуды этого же блока, а задаваемое там же смещение позволяет значению задержки никогда не становиться меньше 0, что вызовет ошибку на платформе Arduino и остановит выполнение программы.
Именно при помощи значения param_WAIT_MS
мы будем управлять скважностью импульса, включая и выключая "бортовой" светодиод платформы Arduino импульсами разной длины.
ШИМ-сигнал характеризуется тем, что в течение фиксированного периода $T_d$ он сменяет состояние 1
и состояние 0
, длительность которых в сумме равна $T_d$, но отношение которых изменяется при помощи параметра $w$ (скважность).
Мы будем использовать этот сигнал для имитации плавного управления яркостью светодиода на платформе Arduino.
Приведение типов данных¶
В основном, блоки модели Engee находят прямое отражение в коде для Arduino. Не все платформы используют одинаковые стандарты языков С/С++. Естественно, при создании кода всегда приходится думать о низкоуровневых деталях реализации.
В этом примере проблемой, которую мы преодолеваем в Engee, является автоматическое приведение типов. На платформе Arduino:
- При сложении булевого типа данных с численным на выходе получается булевый
- При сложении типа данных double с беззнаковым целым числом на выходе получается беззнаковое целое число (работа синусоиды оказывается неверной, если не указать особый тип данных)
Где возникают проблемы с типами данных?