ESP32 ШИМ (PWM) с Arduino IDE (аналоговый выход)

Узнайте, как генерировать ШИМ-сигналы (PWM) на ESP32 с помощью Arduino IDE. Мы рассмотрим два различных метода: с использованием analogWrite и с использованием LEDC API. В качестве примера мы соберём простую схему для плавного управления яркостью светодиода.

ESP32 ШИМ (PWM) с Arduino IDE — аналоговый выход, светодиод

Обновлено 11 июня 2024

Прежде чем продолжить работу с этим руководством, убедитесь, что у вас установлено дополнение ESP32 в Arduino IDE. Следуйте приведённому ниже руководству для установки ESP32 в Arduino IDE, если вы ещё этого не сделали.

Данное руководство совместимо с версией дополнения ESP32 3.X и выше — подробнее в нашем руководстве по миграции.

Необходимые компоненты

Для выполнения данного руководства вам понадобятся следующие компоненты:

Вы можете использовать ссылки выше или перейти напрямую на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!

MakerAdvisor — компоненты для проектов

ШИМ-контроллер светодиодов 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 для управления яркостью через ШИМ

(Данная схема использует модуль 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 ШИМ — светодиод выключен (коэффициент заполнения 0) ESP32 ШИМ — светодиод с яркостью 50% ESP32 ШИМ — светодиод с максимальной яркостью (100%) ESP32 ШИМ — светодиод с яркостью 75%

Пример ШИМ 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 ШИМ — светодиод выключен (коэффициент заполнения 0) ESP32 ШИМ — светодиод с яркостью 50% ESP32 ШИМ — светодиод с яркостью 75% ESP32 ШИМ — светодиод с максимальной яркостью (100%)

Заключение

Подводя итоги, в этой статье вы узнали, как использовать ШИМ-контроллер светодиодов ESP32 с Arduino IDE для плавного управления яркостью светодиода. Изученные концепции можно применять для управления другими устройствами с помощью ШИМ, задавая нужные параметры сигнала.

У нас есть больше ресурсов по ESP32, которые могут вам понравиться:


Источник: ESP32 PWM with Arduino IDE (Analog Output)