ESP32 ШИМ (PWM) с Arduino IDE (аналоговый выход)
Узнайте, как генерировать ШИМ-сигналы (PWM) на ESP32 с помощью Arduino IDE. Мы рассмотрим два различных метода: с использованием analogWrite и с использованием LEDC API. В качестве примера мы соберём простую схему для плавного управления яркостью светодиода.
Обновлено 11 июня 2024
Прежде чем продолжить работу с этим руководством, убедитесь, что у вас установлено дополнение ESP32 в Arduino IDE. Следуйте приведённому ниже руководству для установки ESP32 в Arduino IDE, если вы ещё этого не сделали.
Данное руководство совместимо с версией дополнения ESP32 3.X и выше — подробнее в нашем руководстве по миграции.
Необходимые компоненты
Для выполнения данного руководства вам понадобятся следующие компоненты:
Плата ESP32 DOIT DEVKIT V1 — читайте обзор лучших плат разработки ESP32
3 резистора 330 Ом (или аналогичных номиналов)
Вы можете использовать ссылки выше или перейти напрямую на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!
ШИМ-контроллер светодиодов ESP32
ESP32 имеет ШИМ-контроллер светодиодов (LED PWM controller) с 6–16 независимыми каналами (в зависимости от модели ESP32), которые можно настроить для генерации ШИМ-сигналов с различными параметрами.
Существуют различные функции, которые можно использовать для генерации ШИМ-сигналов и достижения одинаковых результатов. Вы можете использовать analogWrite (как на платах Arduino) или функции LEDC.
analogWrite
Наиболее простая функция — analogWrite, которая принимает в качестве аргументов GPIO-пин, на котором вы хотите генерировать ШИМ-сигнал, и значение коэффициента заполнения (в диапазоне от 0 до 255).
void analogWrite(uint8_t pin, int value);
Например:
void analogWrite(2, 180);
Установка частоты и разрешения
Вы можете задать разрешение и частоту ШИМ-сигнала на выбранном пине с помощью функций analogWriteResolution и analogWriteFrequency.
Для установки разрешения:
void analogWriteResolution(uint8_t pin, uint8_t resolution);
Для установки частоты:
void analogWriteFrequency(uint8_t pin, uint32_t freq);
Функции LEDC
В качестве альтернативы вы можете использовать LEDC API Arduino-ESP32. Сначала необходимо настроить LEDC-пин. Для этого можно использовать функции ledcAttach или ledcAttachChannel.
ledcAttach
Функция ledcAttach настраивает LEDC-пин с заданной частотой и разрешением. Канал LEDC будет выбран автоматически.
bool ledcAttach(uint8_t pin, uint32_t freq, uint8_t resolution);
Эта функция возвращает true, если настройка прошла успешно. Если возвращается false, произошла ошибка и канал LEDC не был настроен.
ledcAttachChannel
Если вы предпочитаете настроить канал LEDC вручную, можно использовать функцию ledcAttachChannel.
bool ledcAttachChannel(uint8_t pin, uint32_t freq, uint8_t resolution, uint8_t channel);
Эта функция возвращает true, если настройка прошла успешно. Если возвращается false, произошла ошибка и канал LEDC не был настроен.
ledcWrite
Наконец, после настройки LEDC-пина с помощью одной из двух предыдущих функций, используйте функцию ledcWrite для установки коэффициента заполнения ШИМ-сигнала.
void ledcWrite(uint8_t pin, uint32_t duty);
Эта функция возвращает true, если установка коэффициента заполнения прошла успешно. Если возвращается false, произошла ошибка и коэффициент заполнения не был установлен.
Для получения дополнительной информации и описания всех функций ШИМ-контроллера LEDC ознакомьтесь с официальной документацией.
Управление яркостью светодиода на ESP32
Чтобы показать вам, как генерировать ШИМ-сигналы на ESP32, мы создадим два простых примера, которые управляют яркостью светодиода (плавное увеличение и уменьшение яркости). Мы предоставим пример с использованием analogWrite и ещё один с использованием функций LEDC.
Схема подключения
Подключите светодиод к ESP32 согласно следующей схеме. Светодиод должен быть подключён к GPIO 16.
(Данная схема использует модуль ESP32 DEVKIT V1 с 30 GPIO — если вы используете другую модель, проверьте распиновку вашей платы.)
Примечание: Вы можете использовать любой пин по вашему выбору, если он может работать как выход. Все пины, которые могут работать как выходы, можно использовать в качестве ШИМ-пинов. Для получения дополнительной информации о GPIO ESP32 читайте: Справочник по распиновке ESP32: какие GPIO-пины следует использовать?
Пример ШИМ ESP32 с использованием analogWrite — код
Откройте Arduino IDE и скопируйте следующий код. Этот пример плавно увеличивает и уменьшает яркость светодиода с помощью функции analogWrite.
/*
Rui Santos & Sara Santos - Random Nerd Tutorials
Complete project details at https://RandomNerdTutorials.com/esp32-pwm-arduino-ide/
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*/
// the number of the LED pin
const int ledPin = 16; // 16 corresponds to GPIO 16
void setup() {
// set the LED as an output
pinMode(ledPin, OUTPUT);
}
void loop(){
// increase the LED brightness
for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){
// changing the LED brightness with PWM
analogWrite(ledPin, dutyCycle);
delay(15);
}
// decrease the LED brightness
for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){
// changing the LED brightness with PWM
analogWrite(ledPin, dutyCycle);
delay(15);
}
}
Сначала определяем пин, к которому подключён светодиод. В данном примере светодиод подключён к GPIO 16.
const int ledPin = 16; // 16 corresponds to GPIO 16
В функции setup() необходимо настроить светодиод как выход с помощью функции pinMode().
pinMode(ledPin, OUTPUT);
В цикле loop() мы изменяем коэффициент заполнения от 0 до 255 для увеличения яркости светодиода.
// increase the LED brightness
for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){
// changing the LED brightness with PWM
analogWrite(ledPin, dutyCycle);
delay(15);
}
Обратите внимание на использование функции analogWrite() для установки коэффициента заполнения. Вам нужно лишь передать в качестве аргументов пин светодиода и значение коэффициента заполнения.
analogWrite(ledPin, dutyCycle);
Наконец, мы изменяем коэффициент заполнения от 255 до 0 для уменьшения яркости.
// decrease the LED brightness
for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){
// changing the LED brightness with PWM
analogWrite(ledPin, dutyCycle);
delay(15);
}
Тестирование примера
Загрузите код на ESP32. Убедитесь, что выбраны правильная плата и COM-порт. Посмотрите на вашу схему. Вы должны увидеть светодиод, яркость которого плавно увеличивается и уменьшается.
Пример ШИМ ESP32 с использованием LEDC API — код
Откройте Arduino IDE и скопируйте следующий код. Этот пример плавно увеличивает и уменьшает яркость светодиода с помощью функций LEDC ESP32.
/*
Rui Santos & Sara Santos - Random Nerd Tutorials
Complete project details at https://RandomNerdTutorials.com/esp32-pwm-arduino-ide/
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*/
// the number of the LED pin
const int ledPin = 16; // 16 corresponds to GPIO16
// setting PWM properties
const int freq = 5000;
const int resolution = 8;
void setup(){
// configure LED PWM
ledcAttach(ledPin, freq, resolution);
// if you want to attach a specific channel, use the following instead
//ledcAttachChannel(ledPin, freq, resolution, 0);
}
void loop(){
// increase the LED brightness
for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){
// changing the LED brightness with PWM
ledcWrite(ledPin, dutyCycle);
delay(15);
}
// decrease the LED brightness
for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){
// changing the LED brightness with PWM
ledcWrite(ledPin, dutyCycle);
delay(15);
}
}
Сначала определяем пин, к которому подключён светодиод. В данном примере светодиод подключён к GPIO 16.
const int ledPin = 16;
Задаём параметры ШИМ: частоту и разрешение.
// setting PWM properties
const int freq = 5000;
const int resolution = 8;
Поскольку мы используем 8-битное разрешение, коэффициент заполнения будет управляться значением от 0 до 255.
В функции setup() настраиваем LEDC-пин — используем функцию ledcAttach следующим образом:
ledcAttach(ledPin, freq, resolution);
Это настроит LEDC-пин с ранее определёнными частотой и разрешением на канале ШИМ по умолчанию.
Если вы хотите задать канал ШИМ самостоятельно, используйте вместо этого ledcAttachChannel. Последний аргумент этой функции — номер канала ШИМ.
ledcAttachChannel(ledPin, freq, resolution, 0);
Наконец, в цикле loop() мы плавно увеличиваем и уменьшаем яркость светодиода.
Следующие строки увеличивают яркость светодиода.
// increase the LED brightness
for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){
// changing the LED brightness with PWM
ledcWrite(ledPin, dutyCycle);
delay(15);
}
Обратите внимание на использование функции ledcWrite() для установки коэффициента заполнения. Вам нужно лишь передать в качестве аргументов пин светодиода и значение коэффициента заполнения.
ledcWrite(ledPin, dutyCycle);
Наконец, мы изменяем коэффициент заполнения от 255 до 0 для уменьшения яркости.
// decrease the LED brightness
for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){
// changing the LED brightness with PWM
ledcWrite(ledPin, dutyCycle);
delay(15);
}
Тестирование примера
Загрузите код на ESP32. Убедитесь, что выбраны правильная плата и COM-порт. Посмотрите на вашу схему. Вы должны увидеть светодиод, яркость которого плавно увеличивается и уменьшается — точно так же, как в предыдущем примере.
Заключение
Подводя итоги, в этой статье вы узнали, как использовать ШИМ-контроллер светодиодов ESP32 с Arduino IDE для плавного управления яркостью светодиода. Изученные концепции можно применять для управления другими устройствами с помощью ШИМ, задавая нужные параметры сигнала.
У нас есть больше ресурсов по ESP32, которые могут вам понравиться: