ШИМ: плавная яркость светодиода

Узнаём, как цифровой пин с двумя состояниями умеет давать сотни уровней яркости.

ШИМ (широтно-импульсная модуляция, 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 кГц, чтобы убрать мерцание.
Проверьте себя
1. Что такое скважность (duty cycle) в ШИМ?
AЧастота сигнала
BДоля периода, в течение которой сигнал включён
CНапряжение питания
DСопротивление резистора
2. Какое значение duty_u16 соответствует 50% яркости на ESP32?
A50
B255
C32768
D65535
3. Почему ШИМ на ESP32 не нагружает процессор?
AПроцессор очень быстрый
BСигнал генерирует аппаратный блок LEDC самостоятельно
CШИМ выполняется на компьютере
DИспользуется Wi-Fi