ШИМ в Arduino: принцип работы, частоты и альтернативы

ШИМ в Arduino: принцип работы, частоты и альтернативы

Что такое широтно-импульсная модуляция, как она имитирует напряжение, какие пины Arduino её поддерживают и когда нужен внешний генератор или ЦАП.

Идея широтно-импульсной модуляции

ШИМ, или PWM (pulse-width modulation), представляет собой последовательность импульсов, то есть переходов напряжения с низкого уровня на высокий и обратно, идущих с постоянной частотой. Импульсы можно менять по высоте (амплитудная модуляция) или по длительности (широтная). У стандартных контроллеров AVR встроенного ЦАП нет, вывод умеет выдавать только 0 или 5 В, поэтому остаётся второй путь: менять долю времени, в течение которой уровень высокий.

Импульсы ШИМ с заполнением 10% и 80%

При одинаковой частоте и амплитуде импульсы различаются только заполнением: в одном случае высокий уровень занимает 10% периода, в другом 80%. Эту величину в источнике называют скважностью и выражают в процентах или в долях единицы. Крайние случаи — ровная линия низкого уровня при 0% и высокого при 100%.

Среднее напряжение

Смысл приёма в среднем напряжении: оно пропорционально заполнению. Если на выводе Arduino с максимумом 5 В организовать ШИМ с заполнением 50%, среднее значение составит 2,5 В. Так контроллер без ЦАП имитирует любое напряжение от нуля до максимума.

Среднее напряжение при ШИМ

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

Приближение ШИМ к аналоговому сигналу

Встроенный ШИМ Arduino

Простейший ШИМ получается из стандартного примера с миганием светодиода. Если уменьшить задержки с 1000 до 10 мс, глаз перестаёт различать вспышки и видит ровное свечение примерно в половину яркости: это ШИМ с частотой 50 Гц. Обнаружить такое мерцание можно, быстро поводив взглядом вокруг источника света: след распадается на светлые и тёмные участки. Способ работает примерно до ста герц и годится также для подсветки мониторов.

Писать такой код вручную не требуется, поскольку в Arduino есть аппаратный генератор. ШИМ доступен на выводах, помеченных тильдой; у Uno это 3, 5, 6, 9, 10 и 11. Задействованы все три таймера, и если таймер используется ещё для чего-то, частота может «плавать».

Выводы Arduino с поддержкой ШИМ

Запускается ШИМ командой analogWrite(n, s), где n — номер пина, а s — коэффициент заполнения от 0 до 255 (255 соответствует 100%). Например, analogWrite(3, 127) даёт на третьем пине заполнение около 50%.

Пины ШИМ на Uno3, 5, 6, 9, 10, 11
Коэффициент заполнения0–255 (8 бит)
Частота на пинах 3, 9, 10, 11488,28 Гц
Частота на пинах 5 и 6976,56 Гц
Диапазон перенастройки частоты15–62 500 Гц

Стандартных частот хватает почти для всех задач, и большинство датчиков и исполнительных устройств рассчитаны именно на них. Изменение частоты требует работы с регистрами таймеров и знакомства с даташитом; тем же путём можно поднять разрешение с 8 до 9 или 10 бит. Произвольную частоту аппаратными средствами задать нельзя, только выбрать из доступных значений.

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

Внешний генератор PCA9685

Когда шести пинов мало, например для шагающего робота на сервоприводах, манипулятора или поэтапной подсветки лестницы, используют внешний генератор. Наиболее известен модуль на PCA9685. Он подключается по I2C, то есть занимает два пина, и даёт 16 каналов ШИМ с разрешением 12 бит (заполнение от 0 до 4095) и частотой от 24 до 1526 Гц. Несколько плат работают одновременно, если задать им разные адреса перемычками. Готовые библиотеки позволяют выставить сигнал на канале одной командой вида pwm.setPWM(канал, 0, длительность).

ЦАП и RC-цепочка

Есть задачи, где нужно настоящее напряжение: подсветка для глаз, чувствительных даже к высокочастотному мерцанию, формирование синусоиды или треугольного сигнала, управление зеркалами лазера, воспроизведение звука. Здесь применяют цифро-аналоговый преобразователь, который по команде контроллера выставляет заданное напряжение. В источнике в качестве примера выделен чип MCP4921: простой в подключении, быстрый и точный. ЦАП даёт реальный аналоговый уровень с точностью до 0,025%, но он одноканальный и требует усилителя, так как выходной ток очень мал.

Для нетребовательных случаев ЦАП грубо имитируют RC-цепочкой из резистора и конденсатора, сглаживающей импульсы. Сглаживание инертно (в десятки раз медленнее периода ШИМ), не даёт идеально ровного напряжения и требует точного расчёта, однако иногда этого достаточно.

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

← Все статьи