Протокол PWM (ШИМ)

Полное руководство по использованию протокола PWM (Pulse Width Modulation) в проектах на Arduino и ESP32. Характеристики, распиновка, схемы подключения и примеры кода для управления сервоприводами и моторами.

Протоколы PWM

Обзор

PWM (Pulse Width Modulation — широтно-импульсная модуляция) — это метод управления мощностью, подаваемой к нагрузке, путем быстрого переключения цифрового пина между состояниями ВКЛ и ВЫКЛ. Это основной способ имитации аналогового сигнала с помощью цифрового выхода.

Протокол незаменим для управления яркостью светодиодов, позиционирования сервоприводов и регулировки скорости моторов. На платах ESP32 реализация PWM значительно мощнее, чем на классической Arduino, благодаря аппаратному контроллеру LEDC с гибким разрешением.

Протокол PWM
Быстрая навигация
Основные разделы
<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).

PCA9685
Драйвер 16 каналов
PCA9685 I2C PWM
"Драйверы на базе PCA9685 позволяют управлять 16-ю PWM-устройствами всего по двум проводам (I2C)."
Технические параметры

Характеристики ШИМ

Основные возможности и ограничения протокола при работе с контроллерами.

Разрешение (ESP32)
1 – 16 бит
Частота (типовая)
50 Гц – 40 МГц
Тип сигнала
Цифровой ШИМ
Количество пинов
1 на устройство
Интерфейс подключения

Типовая распиновка PWM

Большинство устройств, работающих по PWM (например, сервоприводы), имеют стандартную трехпроводную схему подключения.

Стандартные выводы PWM устройств
Пин Типовой цвет Описание
Signal (PWM) Желтый / Оранжевый Управляющий сигнал от контроллера
VCC / + Красный Питание (обычно 5V)
GND / - Коричневый / Черный Общий провод (земля)
Схемы соединения

Подключение к микроконтроллеру

Подключайте сигнальный провод к любому цифровому пину, поддерживающему PWM. Для ESP32 это практически любой GPIO.

Таблица соединений (Пример: ESP32)
Устройство PWM ESP32 GPIO Примечание
Signal (PWM) GPIO 18 Можно использовать любой PWM-пин
VCC 5V / VIN Внешнее питание для мощных моторов!
GND GND Земля должна быть общей
Решение проблем

Устранение неполадок PWM

Дрожание сервопривода (jitter)
Обычно вызвано нестабильным питанием или общей землей. Используйте отдельный источник питания 5V для сервоприводов и соедините его GND с GND контроллера.
Мотор не крутится при низком Duty Cycle
Моторам требуется минимальное напряжение для преодоления силы трения. Увеличьте стартовое значение ШИМ или используйте более высокую частоту.
Практика

Примеры программирования

1. Arduino / ESP32 (C++)

Пример управления яркостью светодиода на ESP32 с использованием канала LEDC.

Arduino
Базовый 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.

MicroPython
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 мс), иначе устройство может выйти из строя или работать некорректно.

Похожие устройства