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, завдяки високій частоті та великій кількості каналів.

<< Проекти << Усі товари >> Статті, уроки >>

Написати відгук

Примітка: HTML размітка не підтримується! Використовуйте звичайтий текст.
    Погано           Добре
Измерение уровня шума Arduino Nano

Измерение уровня шума Arduino Nano

Знадобилось мені заміряти фоновий рівень звуку для проекту розумного дому і виявилось, що це не прос..

Корпус пластиковий 100х68х50мм

Корпус пластиковий 100х68х50мм

Герметичний корпус з товстого добротного пластику для електронних пристроїв або з'єднувальних коробо..

264.05грн.

Цикли 6 — Переривання циклів

Цикли 6 — Переривання циклів

Цикли 6 — Переривання циклів Вступ Під час роботи з циклами в Arduino бувають ситуації, ..

ESP32 та Telegram bot: віддалений моніторинг

ESP32 та Telegram bot: віддалений моніторинг

ESP32 та Telegram bot: віддалений моніторинг Сучасні IoT-системи все частіше використовують хма..

Розробка електроніки та друкованих плат в Україні

Розробка електроніки та друкованих плат в Україні

Потрібен інженер для розробки електроніки, IoT-пристроїв або друкованих плат в Україні? Ми викон..