ESP32 LED PWM Controller: управление яркостью светодиодов
ESP32 имеет встроенный модуль LED PWM Controller (LEDC), позволяющий управлять яркостью светодиодов, скоростью моторов и другими устройствами при помощи широтно-импульсной модуляции (ШИМ). В отличие от Arduino Uno/Nano, у ESP32 до 16 каналов ШИМ с гибкой настройкой частоты и разрешения.
Особенности LEDC на ESP32
- До 16 каналов PWM (каналы делятся между группами высокоскоростных и низкоскоростных).
- Регулируемая частота от 1 Гц до 40 МГц (на практике 1 Гц – 1 МГц).
- Разрешение до 20 бит (0–1 048 575 уровней).
- Программная привязка каналов к любым выводам GPIO.
Таблица GPIO с поддержкой PWM (LEDC)
ESP32 поддерживает привязку каналов ШИМ к почти любым пинам, кроме некоторых специальных. Однако есть ограничения: часть пинов заняты Flash, питание, USB-UART и т. д. На практике рекомендуется использовать следующие GPIO:
| GPIO | Можно использовать для PWM | Комментарий |
|---|---|---|
| 0 | Да | Загрузка, осторожно при старте |
| 1 (TX) | Да | Занят UART0 TX, не рекомендуется |
| 2 | Да | Есть встроенный светодиод на многих платах |
| 3 (RX) | Да | Занят UART0 RX, лучше избегать |
| 4–19 | Да | Оптимальные пины для PWM |
| 21–23 | Да | Часто используются для I²C или RGB |
| 25–27 | Да | Хороший выбор для ШИМ |
| 32–33 | Да | Доступны, поддержка ADC |
| 34–39 | Нет | Только входы (input-only), PWM не работает |
Важно: пины 34–39 — только входы и для PWM не подходят. Рекомендуется для светодиодов и моторов использовать GPIO 4–19 или 21–27.
Таблица частот и разрешений PWM на ESP32
В ESP32 максимальное разрешение зависит от выбранной частоты ШИМ. Чем выше частота, тем меньше возможное количество бит.
| Частота PWM | Максимальное разрешение | Диапазон значений duty cycle | Применение |
|---|---|---|---|
| 1 Гц – 1 кГц | 20 бит | 0 – 1 048 575 | Точные измерения, медленные процессы |
| 5 кГц | 13 бит | 0 – 8191 | Управление светодиодами (без мерцания) |
| 10 кГц | 12 бит | 0 – 4095 | LED-подсветка, ШИМ для аудио |
| 20 кГц | 11 бит | 0 – 2047 | Управление моторами (частота выше слышимого диапазона) |
| 40 кГц | 10 бит | 0 – 1023 | Драйверы моторов, вентиляторы |
| 100 кГц | 8 бит | 0 – 255 | Быстрое управление, где не критична точность |
| 1 МГц | 4–6 бит | 0 – 63 | Высокочастотные генераторы |
Примечание: на практике оптимально использовать частоты 5–20 кГц для светодиодов и моторов, так как они обеспечивают хорошее качество управления и остаются в комфортных пределах разрешения 10–13 бит.
Пример 1. Простое управление яркостью
В этом примере мы подключим светодиод к GPIO 5 и будем менять его яркость.
const int ledPin = 5;
const int pwmChannel = 0;
const int freq = 5000;
const int resolution = 8; // 8 бит = 0–255
void setup() {
ledcSetup(pwmChannel, freq, resolution);
ledcAttachPin(ledPin, pwmChannel);
}
void loop() {
for (int dutyCycle = 0; dutyCycle <= 255; dutyCycle++) {
ledcWrite(pwmChannel, dutyCycle);
delay(10);
}
for (int dutyCycle = 255; dutyCycle >= 0; dutyCycle--) {
ledcWrite(pwmChannel, dutyCycle);
delay(10);
}
}
Что происходит: яркость светодиода плавно увеличивается и уменьшается.
Пример 2. Эффект «дыхания» светодиода
Используем синусоиду для более плавного изменения яркости.
#include <math.h>
const int ledPin = 18;
const int pwmChannel = 1;
const int freq = 5000;
const int resolution = 10; // 0–1023
void setup() {
ledcSetup(pwmChannel, freq, resolution);
ledcAttachPin(ledPin, pwmChannel);
}
void loop() {
for (int i = 0; i < 360; i++) {
int duty = (sin(i * 3.14 / 180) + 1) * 512;
ledcWrite(pwmChannel, duty);
delay(15);
}
}
Что происходит: светодиод "дышит" – плавно загорается и гаснет.
Пример 3. Управление RGB-светодиодом
Используем три канала для красного, зелёного и синего цветов.
const int redPin = 21;
const int greenPin = 22;
const int bluePin = 23;
const int freq = 5000;
const int resolution = 8;
void setup() {
ledcSetup(0, freq, resolution);
ledcSetup(1, freq, resolution);
ledcSetup(2, freq, resolution);
ledcAttachPin(redPin, 0);
ledcAttachPin(greenPin, 1);
ledcAttachPin(bluePin, 2);
}
void loop() {
// Красный
ledcWrite(0, 255);
ledcWrite(1, 0);
ledcWrite(2, 0);
delay(1000);
// Зелёный
ledcWrite(0, 0);
ledcWrite(1, 255);
ledcWrite(2, 0);
delay(1000);
// Синий
ledcWrite(0, 0);
ledcWrite(1, 0);
ledcWrite(2, 255);
delay(1000);
}
Что происходит: RGB-светодиод загорается разными цветами по очереди.
Заключение
Используя LEDC ESP32, можно управлять яркостью и цветом светодиодов, а также скоростью двигателей. Возможности шире, чем у Arduino Uno, благодаря высокой частоте и большому количеству каналов.
Стерео усилитель мощности 15Втх2 на TDA7297
Двухканальный усилитель звуковой частоты на основе микросхемы TDA7297Имеет защиту от перегрузки..
125.21грн.
Шарниры под вращающуюся ось 8, 10мм 2шт.
Такие шарниры предназначены для крепления оси червячной передачи на любой из трёх осей перемещения р..
164.87грн.
Задатчик тока 4 20мА. Схема простого в изготовлении токового задатчика
Прибор позволяет получать на выходе 0...20 мА, 4...20 мА. Области применения представленного устр..
Модуль Bluetooth SPP-C
Протокол связи : Bluetooth спецификация v2.1+EDRРадиус действия : до 10 метров (уровень мощности 2)Н..
112.48грн.
Корпус пластиковый 85x58x33мм с прозрачной крышкой
Герметичный корпус для самодельных электронных устройствМатериал - пластикРазмеры 85 x 58 x 33 ..
116.22грн.





