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

Контроль исполнения программы Arduino

Контроль исполнения программы ArduinoДанная статья посвящена описанию структур, используемых для упр..

Светодиод ультраяркий 5мм

Светодиод ультраяркий 5мм

Сверхяркий светодиод диаметром 5 мм Корпус прозрачный у светодиодов разного цвета свечения. То есть..

5.75грн.

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

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

Понадобилось мне замерять фоновый уровень звука для проекта умного дома и оказалось, что это не прос..

Таймеры Arduino UNO — Часть 4. Применение таймеров для управления сервоприводами

Таймеры Arduino UNO — Часть 4. Применение таймеров для управления сервоприводами

Таймеры Arduino UNO — Часть 4. Применение таймеров для управления сервоприводами Теория ..

Ёмкостный датчик влажности почвы аналоговый

Ёмкостный датчик влажности почвы аналоговый

Ёмкостный датчик влажности почвы V1.2 — надёжный и точный инструмент для измерения уровня влажности ..

55.36грн.