ESP32 PWM с Arduino IDE

В этом уроке мы покажем вам, как генерировать ШИМ-сигналы с 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 выводят один и тот же сигнал ШИМ. Таким образом, все три светодиода увеличивают и уменьшают яркость одновременно, что приводит к синхронизированному эффекту.

Добавить комментарий

Restricted HTML

  • Допустимые HTML-теги: <a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • Строки и абзацы переносятся автоматически.
  • Адреса веб-страниц и email-адреса преобразовываются в ссылки автоматически.
CAPTCHA
Этот вопрос задается для того, чтобы выяснить, являетесь ли Вы человеком или представляете из себя автоматическую спам-рассылку.