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 разметка не поддерживается! Используйте обычный текст.
    Плохо           Хорошо
Ремень зубчатый 6 мм для 3D-принтера

Ремень зубчатый 6 мм для 3D-принтера

Отрезок зубчатого ремня шириной 6 мм.Применяется для перемещения каретки 3D-принтера или CNC по разн..

49.26грн.

Защита входов и аналоговых сигналов: как не спалить Arduino/ESP32 и получить стабильные измерения

Защита входов и аналоговых сигналов: как не спалить Arduino/ESP32 и получить стабильные измерения

Защита входов и аналоговых сигналов: как не спалить Arduino/ESP32 и получить стабильные измерения ..

Понижающий преобразователь напряжения 4...35В в 1,23...30В

Понижающий преобразователь напряжения 4...35В в 1,23...30В

Подстраиваемый понижающий преобразователь напряжения постоянного тока.Держит стабильное заданное рез..

63.45грн.

Циклы 6 — Прерывание циклов

Циклы 6 — Прерывание циклов

Циклы 6 — Прерывание циклов Введение При работе с циклами в Arduino бывают ситуации, ког..

Режим сна SIM800L с Arduino Nano: энергосбережение и пробуждение по SMS

Режим сна SIM800L с Arduino Nano: энергосбережение и пробуждение по SMS

Режим сна SIM800L и пробуждение Arduino Привет, друзья! Тему этой статьи предложили подписчики. И..