Главная chevron_right Уроки chevron_right Микроконтроллеры chevron_right Основы PWM (широтно-импульсной модуляции)

Основы 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