Использование широтно-импульсной модуляции (ШИМ) в ESP32


Широтно-импульсная модуляция (ШИМ, в англ. PWM – Pulse Width Modulation) – это вид модуляции, при котором изменяется ширина импульса при постоянной частоте следования импульсов. В цифровой электронике данный вид модуляции широко применяется для управления яркостью свечения светодиода, скоростью вращения электродвигателя постоянного тока, управления серводвигателем и во многих других случаях когда необходимо сформировать аналоговый сигнал цифровыми методами.

Внешний вид проекта использования ШИМ в модуле ESP32

В данной статье мы рассмотрим использование широтно-импульсной модуляции (ШИМ) в модуле ESP32 для управления яркостью свечения светодиода. Все контакты общего назначения (GPIO pins) модуля ESP32 (за исключением контактов Power, GND, Tx, Rx и EN) могут быть использованы для формирования ШИМ сигнала.

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

  1. Модуль ESP32 (купить на AliExpress).
  2. Резистор 330 Ом (купить на AliExpress).
  3. Светодиод (купить на AliExpress).
  4. Потенциометр 10 кОм (купить на AliExpress).
  5. Макетная плата.

Основные принципы ШИМ

Прежде чем переходить к рассмотрению ШИМ в модуле ESP32 познакомимся с некоторыми терминами, используемыми в ШИМ.

TON (On Time): время, в течение которого у сигнала высокий уровень (high).

TOFF (Off Time): время, в течение которого у сигнала низкий уровень (low).

Period: сумма времен TON и TOFF ШИМ сигнала.

TotalPeriod = TON + TOFF

Коэффициент заполнения/скважность (Duty Cycle): процент времени в течение периода ШИМ сигнала, в котором сигнал находится в состоянии high.

Duty Cycle = TON /TTotal * 100

К примеру, если импульс с общим периодом 10ms будет в состоянии ON (high) в течение 5ms, то коэффициент заполнения (duty cycle) в этом случае будет равен:

Duty Cycle = 5/10 * 100 = 50% Duty Cycle

ШИМ сигнал с коэффициентом заполнения 50%

Частота ШИМ сигнала: определяет как быстро ШИМ сигнал завершает один свой полный период (сумма времен ON и OFF) как показано на рисунке выше. Частота является обратной величиной по отношению к периоду.

Ранее на нашем сайте мы рассматривали использование ШИМ в следующих проектах:

Формирование ШИМ в модуле ESP32

В платах Arduino и NodeMCU ESP8266 использовали функцию analogWrite() с аргументом между 0 и 254 для формирования ШИМ сигнала с требуемым нам коэффициентом заполнения. Но плата/модуль ESP32 не поддерживает использование функции analogWrite(), вместо нее мы будем использовать функцию ledcWrite(), которая очень похожа на функцию analogWrite(). Для своей работы она также требует два параметра: канал (контакт), на котором мы хотим формировать ШИМ сигнал, и значение ШИМ сигнала, которое мы хотим передавать на заданный контакт. Модуль ESP32 имеет 16 каналов для формирования ШИМ, можно использовать любой контакт ввода/вывода для формирования ШИМ.

Для модуля ESP32 доступны три функции для работы с ШИМ: назначение канала для формирования ШИМ и настройки частоты, разрешения и коэффициента заполнения формируемого ШИМ сигнала. Эти функции имеют следующий синтаксис:

Схема проекта

Схема для формирования ШИМ сигнала в модуле ESP32 представлена на следующем рисунке.

Схема для формирования ШИМ сигнала в модуле ESP32

Как видите, схема очень проста и содержит светодиод, резистор и потенциометр 10 кОм. Отрицательный контакт светодиода подключен к земле (GND) модуля ESP32 через токоограничивающий резистор 330 Ом (для этих целей можно выбрать резистор с сопротивлением от 230 до 500 Ом). Положительный контакт светодиода подключен к контакту 16 модуля ESP32, а средний контакт потенциометра – к контакту АЦП 1 (VP pin) модуля ESP32.

Объяснение программы для модуля ESP32

Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.

Код нашей программы не содержит никаких подключаемых библиотек, поэтому начнем мы код программы с указания контакта модуля ESP32, к которому подключен светодиод. В нашем случае это контакт 16.

После этого зададим параметры формируемого ШИМ сигнала. Мы будем использовать частоту ШИМ сигнала 9000 Гц и его разрешение равное 10. Модуль ESP32 поддерживает различные разрешения ШИМ сигнала – от 1 до 16 бит. Также мы зададим канал для формирования ШИМ сигнала, модуль ESP32 имеет 16 (от 0 до 15) подобных каналов.

Внутри функции void setup() мы с помощью функции ledcSetup() зададим настройки для формирования ШИМ сигнала, которые мы указали ранее. Далее с помощью функции ledcAttachPin() мы назначим контакт (к которому подключен светодиод) и канал, на которых будет осуществляться формирование ШИМ сигнала.

В функции void loop() мы будем считывать значение с выхода АЦП (аналого-цифрового преобразователя), к которому подключен средний контакт потенциометра, в переменную ‘dutyCycle’. Формировать необходимый нам ШИМ сигнал с заданными параметрами мы будем с помощью функции ledcWrite(). Таким образом, яркость свечения светодиода в нашем проекте будет зависеть от положения ручки потенциометра.

Тестирование работы проекта

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

Тестирование работы проекта

Более подробно работу проекта вы можете посмотреть на видео, приведенном в конце статьи.

Исходный код программы (скетча)

Видео, демонстрирующее работу проекта

(Проголосуй первым!)
Загрузка...
789 просмотров

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

Ваш адрес email не будет опубликован.