ШИМ (PWM) — способ получить «аналоговое» среднее из цифрового выхода. Пин быстро включается и выключается, а нагрузка (светодиод, мотор, нагреватель) усредняет.
Три параметра: частота (сколько периодов в секунду), скважность (доля времени включения) и разрешение (сколько шагов скважности доступно).
Пример: 8 бит — 256 шагов, скважность 128/256 = 50 %, среднее напряжение при 5 В = 2.5 В.
Частота выбирается под задачу:
— Светодиод: 100 Гц – 1 кГц, глаз не видит мерцания.
— Мотор: 15–25 кГц, иначе слышно писк обмоток.
— Нагреватель: 1–10 Гц, инерция тепла огромная.
— Звук: 40 кГц и выше, чтобы не слышать несущую.
— Серво: 50 Гц с импульсом 1–2 мс (это отдельный протокол, но тоже ШИМ).
Что важно: скважность 0 % и 100 % — это уже не ШИМ, а постоянно выключенный/включённый выход. Многие библиотеки это учитывают, некоторые — нет.
Драйверы: пин микроконтроллера не тянет мотор напрямую — нужен MOSFET или драйвер (L298N, DRV8871, TB6612). Для светодиодов мощностью больше 20 мА — тоже ключ.
И фильтр: если нужно настоящее аналоговое напряжение, ШИМ сглаживают RC-фильтром (R 10 кОм, C 1 мкФ → срез 16 Гц). Пульсации при этом остаются, но маленькие.
Ограничение: ШИМ не создаёт напряжение, он его «рубит». Ток всё равно берётся от источника питания, и при скважности 50 % мотор получает половину мощности, но пиковый ток тот же.
ШИМ — единственный простой способ управлять мощностью без ЦАП, и им делается всё: свет, моторы, звук.
Плавно меняй скважность на светодиоде и посмотри, как меняется яркость. Потом поставь 50 Гц на мотор — услышишь писк, который исчезнет на 20 кГц.
Проверь себя
Почему мотор на ШИМ 100 Гц пищит, а на 20 кГц — нет?
На 100 Гц обмотки вибрируют с частотой в слышимом диапазоне и излучают звук. На 20 кГц частота выше порога слуха, вибрация есть, но не слышна.
-
Wikipedia: Pulse-width modulation
скважность и среднее
-
Arduino: analogWrite
analogWrite на практике