Что такое ШИМ (PWM) в Arduino
ШИМ (широтно-импульсная модуляция, по-английски PWM — pulse width modulation) — способ получить «промежуточное» действие от цифрового вывода, который умеет только 0 и 5 В. Вывод очень быстро включается и выключается, а меняется доля времени, когда он включён. Светодиод от этого кажется тусклее, мотор крутится медленнее.
Скважность и частота
- Коэффициент заполнения (duty cycle, в русских текстах часто говорят «скважность») — какую часть периода вывод включён: 0 % — всегда выключен, 50 % — половину времени, 100 % — всегда включён.
- Частота — сколько раз в секунду повторяется цикл «включить — выключить». На Uno и Nano — около 490 раз в секунду (490 Гц), на выводах 5 и 6 — около 980 Гц. Глаз такого мигания не видит.
Среднее напряжение на выводе пропорционально заполнению: при 50 % — в среднем 2,5 В. Но в каждый момент на выводе либо 0, либо 5 В — это не настоящее аналоговое напряжение.
analogWrite
В Arduino ШИМ включается функцией analogWrite(вывод, значение), значение — от 0 до 255:
| Значение | Заполнение | Среднее напряжение |
|---|---|---|
| 0 | 0 % | 0 В |
| 64 | 25 % | около 1,25 В |
| 128 | около 50 % | около 2,5 В |
| 191 | около 75 % | около 3,75 В |
| 255 | 100 % | 5 В |
Расчёт: заполнение = значение / 255. Например, 128 / 255 ≈ 0,502, то есть около 50 %, и среднее напряжение 5 × 0,502 ≈ 2,5 В. 64 / 255 ≈ 0,251 → 5 × 0,251 ≈ 1,25 В.
void setup() {
pinMode(9, OUTPUT);
analogWrite(9, 64); // светодиод на выводе 9 — примерно на четверть
}
void loop() {
}Вызывать pinMode перед analogWrite не обязательно, но и не вредно.
Какие выводы умеют ШИМ
Только выводы, отмеченные на плате значком ~:
| Плата | Выводы с ШИМ |
|---|---|
| Uno R3, Nano | 3, 5, 6, 9, 10, 11 |
| Uno R4 Minima и WiFi | 3, 5, 6, 9, 10, 11 |
| Mega 2560 | 2–13, 44–46 |
На других выводах analogWrite с ШИМ не работает: при значении меньше 128 вывод выключен, от 128 — включён.
Тонкости
- Выводы 5 и 6 на Uno и Nano дают заполнение чуть больше заданного, потому что их таймер общий с
millis()иdelay(). Заметно это на малых значениях, например при плавном угасании светодиода. Значения 0 и 255analogWriteвыполняет как обычное выключение и включение вывода. - Библиотека Servo на Uno и Nano отключает ШИМ на выводах 9 и 10.
- Функция
tone()(звук на пищалке) на Uno и Nano мешает ШИМ на выводах 3 и 11. - Яркость на глаз меняется неравномерно: от 0 до 30 разница огромная, от 200 до 255 почти не видна.
Где ШИМ подходит, а где нет
Подходит: яркость светодиода, скорость мотора постоянного тока (через драйвер или транзистор), громкость и тон простой пищалки, нагрев через транзистор.
Не подходит там, где нужно ровное напряжение: питание датчика или микросхемы, опорное напряжение. Ровное напряжение из ШИМ получают фильтром из резистора и конденсатора или берут микросхему ЦАП (цифро-аналогового преобразователя).
Сервопривод управляется импульсами, но не через analogWrite: у него свои требования к длине импульса, для этого есть библиотека Servo (справка Как управлять сервоприводом).