В этом уроке мы покажем вам, как генерировать ШИМ-сигналы с ESP32 с помощью Arduino IDE. В качестве примера построим простую схему, которая затемняет светодиод, используя ШИМ-контроллер ESP32. Мы также покажем, как можно получать один и тот же ШИМ-сигнал на разных GPIO одновременно.
Необходимые детали
Чтобы следовать этому уроку, нужны следующие компоненты:
- Плата ESP32
- 5 мм LED3x
- 330 Ом резистор
- Макетная плата
- Провода
ESP32 LED ШИМ Контроллер
ESP32 имеет светодиодный ШИМ-контроллер с 16 независимыми каналами, который можно настроить для генерации ШИМ-сигналов с различными свойствами.
Шаги, необходимые для изменения яркости светодиода с помощью ШИМ, используя Arduino IDE:
1. Сначала нужно выбрать канал ШИМ. Есть 16 каналов от 0 до 15.
2. Затем нужно установить частоту сигнала ШИМ. Для светодиода подойдет частота 5000 Гц.
3. Также необходимо установить разрешение рабочего цикла сигнала: есть разрешения от 1 до 16 бит. Мы будем использовать 8-битное разрешение, это означает, что можно управлять яркостью светодиодов, используя значение от 0 до 255.
4. Далее необходимо указать, к какому GPIO будет поступать сигнал. Для этого необходимо использовать следующую функцию:
ledcAttachPin(GPIO, channel)
Эта функция принимает два аргумента. Первый - это номер GPIO, который будет выводить сигнал, а второй - канал, который будет генерировать сигнал.
5. Для управления яркостью светодиодов с помощью ШИМ, используется следующая функция:
ledcWrite(channel, dutycycle)
Эта функция принимает в качестве аргументов канал, генерирующий сигнал ШИМ, и коэффициент заполнения.
Управление яркостью светодиода
Давайте рассмотрим простой пример, чтобы узнать, как использовать светодиодный ШИМ-контроллер ESP32 с помощью Arduino IDE.
Схема
Подключите светодиод к ESP32, как показано на следующей схеме. Светодиод должен быть подключен к GPIO 16.
(В этой схеме используется версия модуля ESP32 DEVKIT V1 с 30 GPIO - если вы используете другую модель, проверьте схему расположения GPIO используемой платы.)
Примечание: можно использовать любой вывод, который хотите, если он может выступать в качестве выхода. Все контакты, которые могут выступать в качестве выходов, могут использоваться как контакты PWM.
Код
Откройте Arduino IDE и скопируйте следующий код.
// the number of the LED pin
const int ledPin = 16; // 16 corresponds to GPIO16
// setting PWM properties
const int freq = 5000;
const int ledChannel = 0;
const int resolution = 8;
void setup(){
// configure LED PWM functionalitites
ledcSetup(ledChannel, freq, resolution);
// attach the channel to the GPIO to be controlled
ledcAttachPin(ledPin, ledChannel);
}
void loop(){
// increase the LED brightness
for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){
// changing the LED brightness with PWM
ledcWrite(ledChannel, dutyCycle);
delay(15);
}
// decrease the LED brightness
for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){
// changing the LED brightness with PWM
ledcWrite(ledChannel, dutyCycle);
delay(15);
}
}
Начинаем с определения пина, к которому подключен светодиод. В этом случае светодиод подключен к GPIO 16.
const int ledPin = 16; // 16 corresponds to GPIO16
Затем устанавливаем свойства сигнала ШИМ. Определяем частоту 5000 Гц, выбираем канал 0 для генерации сигнала и устанавливаем разрешение в 8 бит. Можно выбрать другие свойства, отличные от этих, для генерации различных сигналов ШИМ.
const int freq = 5000;
const int ledChannel = 0;
const int resolution = 8;
В setup() необходимо настроить LED PWM со свойствами, которые определили ранее, используя функцию ledcSetup(), следующим образом:
ledcSetup(ledChannel, freq, resolution);
Затем нужно выбрать GPIO, на который будет выводится сигнал. Для этого используем функцию ledcAttachPin(), которая принимает в качестве аргументов GPIO, канал, который генерирует сигнал. В этом примере мы получим сигнал в GPIO ledPin, который соответствует GPIO 16. Каналом, который генерирует сигнал, является ledChannel, который соответствует каналу 0.
ledcAttachPin(ledPin, ledChannel);
В цикле вы будете изменять рабочий цикл от 0 до 255, чтобы увеличить яркость светодиода.
for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){
// changing the LED brightness with PWM
ledcWrite(ledChannel, dutyCycle);
delay(15);
}
А затем, между 255 и 0, чтобы уменьшить яркость.
for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){
// changing the LED brightness with PWM
ledcWrite(ledChannel, dutyCycle);
delay(15);
}
Чтобы установить яркость светодиода, вам просто нужно использовать функцию ledcWrite(), которая принимает в качестве аргументов канал, генерирующий сигнал, и коэффициент заполнения.
ledcWrite(ledChannel, dutyCycle);
Поскольку мы используем 8-битное разрешение, рабочий цикл будет управляться с помощью значения от 0 до 255. Обратите внимание, что в функции ledcWrite () мы используем канал, который генерирует сигнал, а не GPIO.
Тестирование примера
Загрузите код на ESP32. Убедитесь, что выбрали правильную плату и COM-порт. Посмотрите на свою схему. Должен получиться диммер, который увеличивает и уменьшает яркость.
Получение одинакового сигнала на разных GPIO
Можно получить один и тот же сигнал с одного и того же канала на разных GPIO. Для этого нужно подключить эти GPIO к одному и тому же каналу в setup().
Давайте изменим предыдущий пример, чтобы затемнить 3 светодиода, используя один и тот же сигнал ШИМ из того же канала.
Схема
Добавьте еще два светодиода в схему, следуя следующей схеме:
Код
Скопируйте следующий код в вашу Arduino IDE.
// the number of the LED pin
const int ledPin = 16; // 16 corresponds to GPIO16
const int ledPin2 = 17; // 17 corresponds to GPIO17
const int ledPin3 = 5; // 5 corresponds to GPIO5
// setting PWM properties
const int freq = 5000;
const int ledChannel = 0;
const int resolution = 8;
void setup(){
// configure LED PWM functionalitites
ledcSetup(ledChannel, freq, resolution);
// attach the channel to the GPIO to be controlled
ledcAttachPin(ledPin, ledChannel);
ledcAttachPin(ledPin2, ledChannel);
ledcAttachPin(ledPin3, ledChannel);
}
void loop(){
// increase the LED brightness
for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){
// changing the LED brightness with PWM
ledcWrite(ledChannel, dutyCycle);
delay(15);
}
// decrease the LED brightness
for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){
// changing the LED brightness with PWM
ledcWrite(ledChannel, dutyCycle);
delay(15);
}
}
Это тот же код, что и предыдущий, но с некоторыми изменениями. Мы определили еще две переменные для двух новых светодиодов, которые относятся к GPIO 17 и GPIO 5.
const int ledPin2 = 17; // 17 corresponds to GPIO17
const int ledPin3 = 5; // 5 corresponds to GPIO5
Затем в setup() мы добавили следующие строки, чтобы назначить оба GPIO для канала 0. Это означает, что мы получим один и тот же сигнал, который генерируется на канале 0, на обоих GPIO.
ledcAttachPin(ledPin2, ledChannel);
ledcAttachPin(ledPin3, ledChannel);
Тестирование проекта
Загрузите новый скетч на ESP32. Убедитесь, что вы выбрали правильную плату и COM-порт. Теперь взгляните на схему:
Все GPIO выводят один и тот же сигнал ШИМ. Таким образом, все три светодиода увеличивают и уменьшают яркость одновременно, что приводит к синхронизированному эффекту.
Добавить комментарий