Основы PWM (широтно-импульсной модуляции)
Разбираемся, как работает PWM и как применять его в скетчах Arduino для управления яркостью светодиода и другими аналоговыми эффектами.
Пример Fading демонстрирует использование аналогового вывода (PWM) для плавного изменения яркости светодиода. Его можно найти в меню File → Sketchbook → Examples → Analog в среде разработки Arduino.
Что такое PWM
Широтно-импульсная модуляция, или PWM — это способ получить аналоговый результат цифровыми средствами. Микроконтроллер создаёт прямоугольный сигнал: он быстро переключается между состояниями «включено» и «выключено». Меняя соотношение времени в состоянии «включено» к общему периоду, можно имитировать любое напряжение между 0 В и полным напряжением питания платы (5 В на UNO, 3,3 В на платах серии MKR). Длительность активного состояния называется шириной импульса, и именно её мы модулируем — отсюда и название метода.
Если переключать светодиод достаточно быстро, глаз не успевает заметить мерцание — воспринимается ровный свет, яркость которого зависит от доли времени, когда светодиод был включён.
Как это устроено
На диаграмме ниже зелёные линии отмечают границы одного периода. Период — это величина, обратная частоте PWM. У Arduino частота PWM составляет около 500 Гц, значит каждый период длится примерно 2 мс.
Функция analogWrite() принимает значения от 0 до 255:
analogWrite(255)— рабочий цикл 100% (сигнал всегда включён);analogWrite(127)— рабочий цикл 50% (сигнал включён половину времени);analogWrite(0)— рабочий цикл 0% (сигнал всегда выключен).

Диаграмма широтно-импульсной модуляции: пять уровней рабочего цикла — от 0% до 100% — с соответствующими вызовами analogWrite(). Чем больше доля «включённого» времени (Duty Cycle), тем выше эффективное напряжение на выходе.
Какие пины поддерживают PWM
На некоторых микроконтроллерах PWM доступен только на определённых выводах. Сверьтесь с распиновкой вашей платы, чтобы узнать, какие пины можно использовать для PWM. Они обозначены символом тильды (~), например: ~3, ~5, ~6, ~9, ~10, ~11 на Arduino UNO.
Типичная ошибка: подключить светодиод или другой компонент к пину без поддержки PWM и вызвать analogWrite() — в этом случае пин будет вести себя непредсказуемо или просто не изменит яркость. Всегда проверяйте распиновку.
Практический эксперимент
Когда пример заработает, возьмите Arduino в руку и быстро помашите ею из стороны в сторону. Движение превращает время в пространство: глаз видит не отдельные вспышки, а светящиеся черточки разной длины. Когда светодиод ярче — черточка длиннее, когда темнее — короче. Именно так можно «увидеть» ширину импульса своими глазами.
Где пригодится PWM
- Плавное управление яркостью светодиодов и RGB-лент.
- Регулировка скорости двигателей постоянного тока через драйвер.
- Управление сервоприводами (там используется особый вид PWM с фиксированным периодом).
- Генерация аналогового напряжения через RC-фильтр (простой ЦАП).
- Управление нагревательными элементами и вентиляторами.
Автор оригинала: Timothy Hirzel
PWM