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, завдяки високій частоті та великій кількості каналів.
Силовий MOSFET транзистор IRF520 N-канальний
MOSFET транзистор 3-го поколінняВикористовується для швидкісної комутації потужних виконавчих механі..
28.43грн.
Лінійний кроковий двигун - що це?
Лінійний кроковий двигун Привіт друзі! Мені випала вдала можливість познайомити вас з, що розрива..
Тримач акумулятора 3,7В типу 18650
Тримач для циліндричних акумуляторів типу 18650 на 3,7В..
32.03грн.
Датчик вологості та температури DHT21
DHT21 (AM2301) – Датчик вологості та температури для Arduino, ESP32, Raspberry Pi DHT21 (AM2301) ..
261.32грн.
Arduino відображення даних FLOAT
Arduino відображення даних FLOATСхоже, що програмне забезпечення Arduino не особливо підтримує відоб..





