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, благодаря высокой частоте и большому количеству каналов.
Контроль исполнения программы Arduino
Контроль исполнения программы ArduinoДанная статья посвящена описанию структур, используемых для упр..
Светодиод ультраяркий 5мм
Сверхяркий светодиод диаметром 5 мм Корпус прозрачный у светодиодов разного цвета свечения. То есть..
5.75грн.
Измерение уровня шума Arduino Nano
Понадобилось мне замерять фоновый уровень звука для проекта умного дома и оказалось, что это не прос..
Таймеры Arduino UNO — Часть 4. Применение таймеров для управления сервоприводами
Таймеры Arduino UNO — Часть 4. Применение таймеров для управления сервоприводами Теория ..
Ёмкостный датчик влажности почвы аналоговый
Ёмкостный датчик влажности почвы V1.2 — надёжный и точный инструмент для измерения уровня влажности ..
55.36грн.





