Широтно-импульсная модуляция (ШИМ) – это метод, который изменяет ширину импульса, сохраняя постоянную частоту сигнала. Техника ШИМ в основном используется для управления яркостью светодиодов, скоростью вращения двигателя постоянного тока, управления серводвигателем или в других случаях, когда необходимо генерировать аналоговый сигнал с использованием цифрового источника.
В этом материале мы поговорим о ШИМ-выводе ESP32. Все выводы GPIO платы разработки ESP32 (кроме питания, GND, Tx, Rx и EN) могут использоваться для получения сигнала ШИМ. В качестве примера ШИМ ESP32 мы создадим простую схему, которая изменяет яркость светодиода в соответствии с сигналами ШИМ.
Прежде чем объяснить генерацию ШИМ на ESP32, давайте обсудим некоторые термины, связанные с ШИМ. Здесь есть несколько сокращений и определений. Ton (время включения) – это продолжительность времени, когда сигнал высокий. Toff (время выключения) – это продолжительность времени, когда сигнал низкий. Период – это сумма времени включения и выключения сигнала ШИМ. Рабочий цикл (скважность) – это процент времени, когда сигнал был высоким в течение периода сигнала ШИМ (определяется как Ton/Tполн * 100).
Например, если импульс с общим периодом 10 мс остается высоким в течение 5 мс, тогда скважность будет равна 5/10 * 100 = 50%.
Есть еще понятие частоты ШИМ. Частота сигнала ШИМ определяет, как быстро ШИМ завершает один период. Один период – полное включение и выключение сигнала ШИМ, как показано на рисунке, приведенном выше.
Перейдем теперь непосредственно к генерации ШИМ в ESP32. В Arduino и ESP8266 мы используем функцию analogWrite() для «записи» значения ШИМ от 0 до 254 на вывод со светодиодом. Но ESP32 не поддерживает функцию analogWrite(). Поэтому вместо analogWrite() мы будем использовать другую функцию, а именно функцию ledcWrite(). LedcWrite() очень похожа на analogWrite(). Ей также требуется два параметра: канал ШИМ, в который мы хотим «записать» значение ШИМ-сигнала, и значение ШИМ-сигнала, которое мы хотим записать в выбранный канал. ESP32 имеет 16 каналов ШИМ, и вы можете использовать любой вывод GPIO для генерации выхода ШИМ. ESP32 предоставляет три функции для назначения канала ШИМ на вывод и для настройки разрешения, частоты и коэффициента заполнения сигналов ШИМ. Эти функции следующие:
ledcAttachPin(gpio, канал)
ledcSetup(канал, частота, разрешение)
ledcWrite(канал, скважность)
Схема подключения ESP32 для нашего проекта следующая:
Схема содержит один светодиод, резистор и потенциометр на 10 КОм. Отрицательный вывод светодиода подключен к заземлению ESP32 через резистор 330 Ом. Вы можете использовать любое значение сопротивления от 230 Ом до 500 Ом. Подключите положительный вывод светодиода к GPIO 16, а сигнальный вывод потенциометра к выводу ADC1 ESP32.
Код довольно прост и краток.
const int ledPin = 16; // 16 соответствует GPIO16
uint16_t dutyCycle;
// настройка свойств ШИМ
const int freq = 15000;
const int ledChannel = 0;
const int resolution = 13;
void setup(){
Serial.begin(9600);
// настроим функции ШИМ для светода
ledcSetup(ledChannel, freq, resolution);
// подключим канал к GPIO, который нужно контролировать
ledcAttachPin(ledPin, ledChannel);
}
void loop(){
dutyCycle = analogRead(A0);
Serial.print(dutyCycle);
// изменим яркость светодиодов с помощью ШИМ
ledcWrite(ledChannel, dutyCycle);
delay(15);
}
Чтобы проверить работу ШИМ ESP32, подключите светодиод и потенциометр согласно электрической схеме и загрузите код в ESP32. Убедитесь, что вы выбрали правильную плату и COM-порт. Теперь поверните потенциометр, чтобы увеличить или уменьшить яркость светодиода.
© digitrode.ru