Как нам уже известно из первых уроков, любой микроконтроллер умеет хорошо работать с цифровыми сигналами. Он легко справляется с арифметическими операциями над цифровыми данными, принимает и передаёт цифровые сигналы по линиям связи. А что значит «цифровые» в данном случае?
В самом первом уроке мы зажигали и гасили светодиод с помощью Ардуино. Для того, чтобы зажечь светодиод, мы подавали на его анод высокий уровень сигнала. А чтобы погасить — низкий уровень. Получается, для управления мы использовали только два уровня напряжения: высокий и низкий. Светодиод либо будет гореть, либо не будет. Третьего — не дано. Оперируя только двумя состояниями означает, что мы работаем с цифровым сигналом.
Но что делать, если нам нужно зажечь этот самый светодиод только на половину яркости? Или запустить двигатель, на 30% его мощности? Для решения этой задачи используют подход, называемый широтно-импульсной модуляцией сигнала. О том, что такое ШИМ и как это работает, мы узнаем на сегодняшнем уроке.
Широтно-импульсная модуляция — ШИМ
Разберем понятие ШИМ на примере управления скоростью вращения двигателя постоянного тока. Поставим своей целью запустить мотор на 50% от его максимальной скорости. Пусть наш двигатель идеальный и чтобы достичь заданной скорости, нам нужно в единицу времени передавать на мотор в два раза меньше мощности. Как это сделать, не меняя источник питания?
Проведем мысленный эксперимент (а кто-то может и натуральный — ничего сложного). Возьмём мотор постоянного тока с массивным маховиком, закрепленным на валу (таким маховиком может служить колесо). Подадим питание от аккумулятора и мотор начнет набирать обороты. Через какое-то время, мотор достигнет номинальной мощности, а его ротор максимальной скорости вращения. Отключим питание, и мотор постепенно начнет замедляться вплоть до полной остановки.
Следующий опыт. Снова включим мотор, и когда его скорость достигнет половины от максимальной — выключим. Заметив, что скорость падает — снова включим. И так далее. Включая и выключая питание мотора, мы заставим ротор вращаться со скоростью, близкой к половине от максимальной!
Разумеется, в силу человеческой медлительности, мотор будет удерживать заданную скорость с некоторой погрешностью. Другими словами, скорость будет «плавать» вокруг заданного значения. Чтобы минимизировать эти отклонения, нам потребуется увеличить частоту переключений. Тут уже не обойтись без автоматики.
А как заставить мотор вращаться медленнее или быстрее? Количество переданной мотору энергии будет зависеть от отношения времени когда мотор включен — tвкл к времени когда он выключен — tвыкл.

Так, для передачи мотору 50% мощности, tвкл будет равно tвыкл. Такой случай как раз изображен на графике. Чтобы мотор вращался еще медленнее, скажем с мощностью 25% от номинальной, придется время включения мотора уменьшить до этих самых 25% от общего периода управления T.

Таким образом, имея возможность менять ширину импульсов, мы можем достаточно точно управлять скоростью вращения мотора.
Собственно, рассмотренный способ управления мощностью и называется широтно-импульсной модуляцией сигнала, а сокращённо — ШИМ. Теперь рассмотрим параметры которые характеризуют ШИМ сигнал и которые следует учитывать при написании программ для микроконтроллеров.
Коэффициент заполнения (duty cycle)
Начнем с самого главного параметра — коэффициента заполнения D (он же duty cycle). Этот коэффициент равен отношению периода ШИМ сигнала к ширине импульса:
D = T / tвкл
Пример ШИМ сигнала для разных значений D:

Чем больше D, тем больше мощности мы передаем управляемому устройству, например, двигателю. Так, при D = 1 двигатель работает на 100% мощности, при D = 0,5 — наполовину мощности, при D = 0 — двигатель полностью отключен.
Кстати, кроме коэффициента заполнения для характеризации ШИМ применяют и другой параметр — скважность S. Эти два параметра связаны выражением:
S = 1/T
Скважность, как и коэффициент заполнения — величина безразмерная. В отличие от D, она может принимать значения от 1 до бесконечности. Но чаще всего, особенно в англоязычных источниках, используют именно D.
Частота ШИМ
Частота ШИМ определяет период импульса — T (см картинку выше). Требования к этой частоте диктуются несколькими факторами, в зависимости от типа управляемого устройства.
В случае управления светодиодами одним из главных факторов становится видимость мерцания. Чем выше частота, тем менее заметно мерцание излучаемого света. Высокая частота также помогает снизить влияние температурных скачков, которые светодиоды не любят. На практике для светодиодов достаточно иметь частоту ШИМ в пределах 100-300 Гц.
С моторами постоянного тока дела обстоят немного иначе. С одной стороны, чем больше частота, тем более плавно и менее шумно работает мотор. С другой — на высоких частотах падает крутящий момент. Нужен баланс. Более подробно о моторах мы поговорим в одной из будущих статей, а пока рекомендуем для большинства DIY задач использовать частоту ШИМ 2кГц.
Плюс, общая проблема для всех случаев управления силовой нагрузкой — потери в цепях силовой коммутации (в транзисторах, и не только), которые увеличиваются с ростом частоты ШИМ. Чем больше частота, тем большее время транзисторы находятся в переходных состояниях, активно выделяя тепло и снижая эффективность системы.
Разрешение ШИМ
Ещё один важный параметр — разрешение ШИМ сигнала. Этот параметр показывает, с какой точностью мы можем менять коэффициент заполнения. Чем больше разрешение, тем плавнее будет меняться мощность на управляемом устройстве.
Например, у платы Ардуино с базовыми настройками, разрешение ШИМ — 256. То есть мы можем изменять сигнал от 0 до 255 — не густо, но для большинства DIY задач хватает.
ШИМ и микроконтроллеры
Простейший генератор ШИМ можно собрать и без всяких микроконтроллеров, только лишь с микросхемой таймера 555. Разумеется, любой микроконтроллер тоже умеет работать с ШИМ сигналом.
Например, у платы Ардуино имеется 6 контактов: 3, 5, 6, 9, 10 и 11, которые можно настроить для генерации аппаратного ШИМ. По-умолчанию, на контактах 5 и 6 частота сигнала будет 1кГц, на остальных — скромные 500Гц. Как ими пользоваться ШИМ на Ардуино подробно рассказывается на уроке «Ардуино: ШИМ» (скоро будет).
STM32F103 — гораздо более серьёзный микроконтроллер. У него целых 20 контактов имеют возможность генерации ШИМ. Частота этого микроконтроллера — 72МГц, что делает возможным плавное и точное управление моторами постоянного тока, не говоря уже о светодиодах. Узнаём подробности в уроке про STM32 и ШИМ.
Кстати, микроконтроллеры умеют не только генерировать ШИМ, но и детектировать подобные сигналы. Про это можно почитать в соответствующей статье на нашем портале (скоро будет).