ШИМ — широтно-импульсная модуляция
ШИМ — способ управлять мощностью цифровым выходом: вместо того чтобы менять напряжение, выход быстро включают и выключают, меняя долю времени во включённом состоянии. Так регулируют яркость светодиодов, скорость двигателей и получают аналоговое напряжение после фильтра.
Обновлено Редакция GAW
ШИМ (широтно-импульсная модуляция, pulse-width modulation, PWM) — сигнал постоянной частоты, у которого меняется длительность импульсов, то есть коэффициент заполнения. Среднее значение напряжения пропорционально заполнению: Uср = D · U. Нагрузка с инерцией — светодиод с точки зрения глаза, двигатель, нагреватель — реагирует на среднее значение, а ключ всё время либо полностью открыт, либо закрыт, и потери в нём малы.
Частота и разрешение
ШИМ формирует аппаратный таймер: счётчик считает от 0 до значения периода TOP, а выход переключается при совпадении со значением в регистре сравнения. Для ATmega328P (DS40002061B):
где N — предделитель. Число ступеней заполнения — TOP + 1, поэтому при той же тактовой частоте большее разрешение означает меньшую частоту. Режимы таймеров и формулы подробно разобраны в статье о таймерах AVR, частоты ШИМ Arduino Uno, Mega и Leonardo по выводам и делителям показывает калькулятор ШИМ Arduino.
ШИМ как ЦАП
Если пропустить ШИМ через фильтр нижних частот, на выходе останется среднее напряжение D · U с небольшими пульсациями. Чем выше частота ШИМ относительно частоты среза фильтра, тем меньше пульсации, но тем медленнее выход следует за изменением заполнения. Расчёт такого ЦАП — в калькуляторе ЦАП на ШИМ.
Частые вопросы
Какая частота ШИМ у analogWrite на Arduino Uno?
На выводах 5 и 6 (таймер 0, быстрый ШИМ) — 976,56 Гц, на выводах 3, 9, 10 и 11 (таймеры 1 и 2, ШИМ с коррекцией фазы) — 490,2 Гц. Ядро Arduino ставит всем таймерам делитель 64, и при 16 МГц это даёт 16 000 000 / (64 · 256) и 16 000 000 / (64 · 510).
Как связаны частота и разрешение ШИМ?
Обратно: частота ШИМ равна тактовой частоте таймера, делённой на число шагов периода. Чем больше шагов — тем мельче шаг коэффициента заполнения, но тем ниже частота. Таймер на 16 МГц без делителя с 256 шагами даёт 62,5 кГц в режиме быстрого ШИМ, а с 65 536 шагами — всего около 244 Гц.
Почему двигатель пищит от ШИМ?
Частота ШИМ попадает в слышимый диапазон — например, 490 или 980 Гц по умолчанию у Arduino — и обмотки и сердечник вибрируют на этой частоте. Помогает поднять частоту выше слышимого: таймер 1 или 2 Arduino Uno с делителем 1 в режиме с коррекцией фазы даёт 31 372,5 Гц.
Источники
- Microchip. ATmega48A/PA/88A/PA/168A/PA/328/P Data Sheet (DS40002061B) — гл. 15–18: режимы Fast PWM и Phase Correct PWM, формулы частоты, предделители
- Arduino. ArduinoCore-avr, коммит 11b9130 (github.com/arduino/ArduinoCore-avr) — wiring.c — делитель 64 для всех таймеров, режимы таймеров для analogWrite
Нашли ошибку?