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 разметка не поддерживается! Используйте обычный текст.
    Плохо           Хорошо
Стерео усилитель мощности 15Втх2 на TDA7297

Стерео усилитель мощности 15Втх2 на TDA7297

Двухканальный усилитель звуковой частоты на основе микросхемы TDA7297Имеет защиту от перегрузки..

125.21грн.

Шарниры под вращающуюся ось 8, 10мм 2шт.

Шарниры под вращающуюся ось 8, 10мм 2шт.

Такие шарниры предназначены для крепления оси червячной передачи на любой из трёх осей перемещения р..

164.87грн.

Задатчик тока 4 20мА. Схема простого в изготовлении токового задатчика

Задатчик тока 4 20мА. Схема простого в изготовлении токового задатчика

Прибор позволяет получать на выходе 0...20 мА, 4...20 мА. Области применения представленного устр..

Модуль Bluetooth SPP-C

Модуль Bluetooth SPP-C

Протокол связи : Bluetooth спецификация v2.1+EDRРадиус действия : до 10 метров (уровень мощности 2)Н..

112.48грн.

Корпус пластиковый 85x58x33мм с прозрачной крышкой

Корпус пластиковый 85x58x33мм с прозрачной крышкой

Герметичный корпус для самодельных электронных устройствМатериал - пластикРазмеры 85 x 58 x 33 ..

116.22грн.