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 Nano
Знадобилось мені заміряти фоновий рівень звуку для проекту розумного дому і виявилось, що це не прос..
Корпус пластиковий 100х68х50мм
Герметичний корпус з товстого добротного пластику для електронних пристроїв або з'єднувальних коробо..
264.05грн.
Цикли 6 — Переривання циклів
Цикли 6 — Переривання циклів Вступ Під час роботи з циклами в Arduino бувають ситуації, ..
ESP32 та Telegram bot: віддалений моніторинг
ESP32 та Telegram bot: віддалений моніторинг Сучасні IoT-системи все частіше використовують хма..
Розробка електроніки та друкованих плат в Україні
Потрібен інженер для розробки електроніки, IoT-пристроїв або друкованих плат в Україні? Ми викон..





