Глиф Учебники

Что такое ШИМ (PWM) в Arduino

Справочник · Arduino · 2 минуты чтения

ШИМ (широтно-импульсная модуляция, по-английски PWM — pulse width modulation) — способ получить «промежуточное» действие от цифрового вывода, который умеет только 0 и 5 В. Вывод очень быстро включается и выключается, а меняется доля времени, когда он включён. Светодиод от этого кажется тусклее, мотор крутится медленнее.

Скважность и частота

Среднее напряжение на выводе пропорционально заполнению: при 50 % — в среднем 2,5 В. Но в каждый момент на выводе либо 0, либо 5 В — это не настоящее аналоговое напряжение.

analogWrite

В Arduino ШИМ включается функцией analogWrite(вывод, значение), значение — от 0 до 255:

ЗначениеЗаполнениеСреднее напряжение
00 %0 В
6425 %около 1,25 В
128около 50 %около 2,5 В
191около 75 %около 3,75 В
255100 %5 В

Расчёт: заполнение = значение / 255. Например, 128 / 255 ≈ 0,502, то есть около 50 %, и среднее напряжение 5 × 0,502 ≈ 2,5 В. 64 / 255 ≈ 0,251 → 5 × 0,251 ≈ 1,25 В.

Arduino
void setup() {
  pinMode(9, OUTPUT);
  analogWrite(9, 64);   // светодиод на выводе 9 — примерно на четверть
}

void loop() {
}

Вызывать pinMode перед analogWrite не обязательно, но и не вредно.

Какие выводы умеют ШИМ

Только выводы, отмеченные на плате значком ~:

ПлатаВыводы с ШИМ
Uno R3, Nano3, 5, 6, 9, 10, 11
Uno R4 Minima и WiFi3, 5, 6, 9, 10, 11
Mega 25602–13, 44–46

На других выводах analogWrite с ШИМ не работает: при значении меньше 128 вывод выключен, от 128 — включён.

Тонкости

Где ШИМ подходит, а где нет

Подходит: яркость светодиода, скорость мотора постоянного тока (через драйвер или транзистор), громкость и тон простой пищалки, нагрев через транзистор.

Не подходит там, где нужно ровное напряжение: питание датчика или микросхемы, опорное напряжение. Ровное напряжение из ШИМ получают фильтром из резистора и конденсатора или берут микросхему ЦАП (цифро-аналогового преобразователя).

Сервопривод управляется импульсами, но не через analogWrite: у него свои требования к длине импульса, для этого есть библиотека Servo (справка Как управлять сервоприводом).