ШИМ: плавная яркость светодиода
Узнаём, как цифровой пин с двумя состояниями умеет давать сотни уровней яркости.
ШИМ (широтно-импульсная модуляция, PWM) — быстрое переключение вывода между 0 и 1, при котором средняя мощность зависит от доли времени «включено» (скважности).
Зачем нужен ШИМ
Вывод GPIO умеет только включаться и выключаться. Как же добиться полуяркости? Хитрость в скорости: если переключать пин сотни раз в секунду и держать его включённым, скажем, 30% времени, светодиод получит 30% мощности и будет светить тускло. Глаз не замечает мигания — видит лишь усреднённую яркость.
Скважность (duty cycle)
Скважность — доля периода, когда сигнал «включён». В MicroPython на ESP32 её задают через duty_u16() числом от 0 до 65535. Посчитаем соответствие процентов и значений:
levels = [0, 25, 50, 75, 100]
for pct in levels:
duty = round(pct / 100 * 65535)
print(f"{pct:3d}% яркости -> duty_u16 = {duty}")Вывод:
0% яркости -> duty_u16 = 0 25% яркости -> duty_u16 = 16384 50% яркости -> duty_u16 = 32768 75% яркости -> duty_u16 = 49151 100% яркости -> duty_u16 = 65535
Код плавного разгорания
from machine import Pin, PWM
import time
led = PWM(Pin(23))
led.freq(1000) # 1000 Гц — частота переключений
while True:
for duty in range(0, 65536, 1024): # разгораемся
led.duty_u16(duty)
time.sleep_ms(10)
for duty in range(65535, -1, -1024): # гаснем
led.duty_u16(duty)
time.sleep_ms(10)Как работает под капотом
У ESP32 есть аппаратный блок LEDC, специально созданный для ШИМ. Вы задаёте частоту (например, 1000 Гц — значит период 1 мс) и скважность. Дальше блок сам, без участия процессора, дёргает вывод: держит его включённым нужную долю каждого периода. Процессор свободен и может заниматься другими делами. Для светодиодов хватает 1 кГц; для моторов и серво нужны другие частоты.
Частые ошибки
- Путать
dutyиduty_u16. На ESP32 в современном MicroPython используютduty_u16()с диапазоном 0–65535. - Слишком низкая частота. При 50 Гц светодиод заметно мерцает — берите от 200 Гц и выше.
- Забыть освободить пин. После ШИМ вызовите
led.deinit(), чтобы вернуть вывод в обычный режим.
Итог
- ШИМ имитирует промежуточную мощность быстрым переключением 0/1.
- Скважность — доля времени «включено»; задаётся через
duty_u16()(0–65535). - Аппаратный блок LEDC генерирует ШИМ без нагрузки на процессор.
- Для светодиодов берите частоту от ~1 кГц, чтобы убрать мерцание.