Обзор
PWM (Pulse Width Modulation — широтно-импульсная модуляция) — это метод управления мощностью, подаваемой к нагрузке, путем быстрого переключения цифрового пина между состояниями ВКЛ и ВЫКЛ. Это основной способ имитации аналогового сигнала с помощью цифрового выхода.
Протокол незаменим для управления яркостью светодиодов, позиционирования сервоприводов и регулировки скорости моторов. На платах ESP32 реализация PWM значительно мощнее, чем на классической Arduino, благодаря аппаратному контроллеру LEDC с гибким разрешением.
<div class="rounded-2xl border border-slate-200 dark:border-slate-800 bg-white dark:bg-slate-900 p-5 flex-1">
<div class="flex items-center gap-3 mb-4">
<div class="w-9 h-9 rounded-xl bg-indigo-100 dark:bg-indigo-900/40 text-indigo-700 dark:text-indigo-300 flex items-center justify-center shrink-0">
<svg class="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4" /></svg>
</div>
<div class="min-w-0">
<div class="text-sm font-bold text-slate-900 dark:text-slate-100 leading-tight">Примеры кода</div>
<div class="text-xs text-slate-500 dark:text-slate-400">Доступные платформы</div>
</div>
</div>
<div class="space-y-2">
<div class="flex items-center gap-3 p-2.5 rounded-xl bg-slate-50 dark:bg-slate-800/60 border border-transparent hover:border-slate-200 dark:hover:border-slate-700 transition-colors">
<img src="/img/platforms/arduino.svg" class="w-5 h-5 !my-0" alt="Arduino" />
<div class="min-w-0 flex-1">
<div class="text-[11px] font-bold text-slate-900 dark:text-slate-100 uppercase tracking-wider">Arduino / ESP32</div>
<div class="text-[10px] text-slate-500 dark:text-slate-400 truncate text-emerald-600 dark:text-emerald-400 font-medium italic">C++</div>
</div>
</div>
<div class="flex items-center gap-3 p-2.5 rounded-xl bg-slate-50 dark:bg-slate-800/60 border border-transparent hover:border-slate-200 dark:hover:border-slate-700 transition-colors">
<img src="/img/platforms/micropython.svg" class="w-5 h-5 !my-0" alt="MicroPython" />
<div class="min-w-0 flex-1">
<div class="text-[11px] font-bold text-slate-900 dark:text-slate-100 uppercase tracking-wider">MicroPython</div>
<div class="text-[10px] text-slate-500 dark:text-slate-400 truncate text-blue-600 dark:text-blue-400 font-medium italic">Python</div>
</div>
</div>
</div>
</div>
Где купить компоненты PWM
Для работы с ШИМ могут потребоваться как сами исполнительные устройства (сервоприводы), так и драйверы для расширения каналов (например, PCA9685).
Характеристики ШИМ
Основные возможности и ограничения протокола при работе с контроллерами.
Типовая распиновка PWM
Большинство устройств, работающих по PWM (например, сервоприводы), имеют стандартную трехпроводную схему подключения.
| Пин | Типовой цвет | Описание |
|---|---|---|
| Signal (PWM) | Желтый / Оранжевый | Управляющий сигнал от контроллера |
| VCC / + | Красный | Питание (обычно 5V) |
| GND / - | Коричневый / Черный | Общий провод (земля) |
Подключение к микроконтроллеру
Подключайте сигнальный провод к любому цифровому пину, поддерживающему PWM. Для ESP32 это практически любой GPIO.
| Устройство PWM | ESP32 GPIO | Примечание |
|---|---|---|
| Signal (PWM) | GPIO 18 | Можно использовать любой PWM-пин |
| VCC | 5V / VIN | Внешнее питание для мощных моторов! |
| GND | GND | Земля должна быть общей |
Устранение неполадок PWM
Дрожание сервопривода (jitter)
Мотор не крутится при низком Duty Cycle
Примеры программирования
1. Arduino / ESP32 (C++)
Пример управления яркостью светодиода на ESP32 с использованием канала LEDC.
Базовый PWM (LEDC)
C++
Библиотека не требуется
// Настройки PWM для ESP32
const int ledPin = 18; // GPIO пин
const int freq = 5000; // Частота 5 кГц
const int ledChannel = 0; // Канал 0
const int resolution = 8; // Разрешение 8 бит (0-255)
void setup() {
// Настройка канала
ledcSetup(ledChannel, freq, resolution);
// Привязка пина к каналу
ledcAttachPin(ledPin, ledChannel);
}
void loop() {
// Плавное увеличение яркости
for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++) {
ledcWrite(ledChannel, dutyCycle);
delay(7);
}
}
2. MicroPython
Пример управления PWM на любом GPIO пине ESP32.
PWM на MicroPython
Python
from machine import Pin, PWM
import time
# Инициализация PWM на пине 18
led = PWM(Pin(18))
led.freq(1000) # Установка частоты 1кГц
while True:
for duty in range(0, 1024): # 10-битное разрешение (0-1023)
led.duty(duty)
time.sleep_ms(2)
Итоги
Для управления мощными нагрузками (моторы, длинные LED-ленты) всегда используйте транзисторы или драйверы, так как ток пина микроконтроллера ограничен.
Частота ШИМ для сервоприводов должна быть строго 50 Гц (период 20 мс), иначе устройство может выйти из строя или работать некорректно.