ESP32: Генерация ШИМ на основе таймера (без LEDC)
В ESP32 есть несколько способов организовать широтно-импульсную модуляцию (ШИМ). Чаще всего применяется встроенный модуль LEDC, который позволяет гибко управлять частотой, разрешением и каналами. Однако, при необходимости можно реализовать ШИМ и с помощью аппаратных таймеров, без использования LEDC. Такой подход даёт полный контроль над процессом генерации и позволяет лучше понять внутреннюю работу контроллера.
Настройка таймера для ШИМ
Принцип заключается в том, что мы используем аппаратный таймер ESP32 для генерации прерываний через заданный интервал времени. В обработчике прерывания мы переключаем состояние GPIO (HIGH/LOW), тем самым формируя импульсы с заданным коэффициентом заполнения (duty cycle).
Пример: генерация ШИМ с частотой 1 кГц и скважностью 50%
hw_timer_t *timer = NULL;
volatile bool state = false;
const int pwmPin = 25; // GPIO для ШИМ
const int pwmFreq = 1000; // 1 кГц
const int dutyCycle = 50; // 50%
unsigned long period_us;
unsigned long highTime_us;
unsigned long lowTime_us;
void IRAM_ATTR onTimer() {
static unsigned long counter = 0;
counter++;
if (counter <= highTime_us) {
digitalWrite(pwmPin, HIGH);
} else {
digitalWrite(pwmPin, LOW);
}
if (counter >= period_us) {
counter = 0;
}
}
void setup() {
pinMode(pwmPin, OUTPUT);
period_us = 1000000 / pwmFreq;
highTime_us = period_us * dutyCycle / 100;
lowTime_us = period_us - highTime_us;
timer = timerBegin(0, 80, true); // делитель 80 → 1 мкс/тик
timerAttachInterrupt(timer, &onTimer, true);
timerAlarmWrite(timer, 1, true); // тик каждую 1 мкс
timerAlarmEnable(timer);
}
void loop() {
// Основной код может выполняться параллельно
}
Как работает код: Таймер запускается с шагом 1 мкс. В обработчике прерывания счётчик отсчитывает длительность HIGH и LOW-состояния. Таким образом формируется сигнал ШИМ с заданной частотой и скважностью.
Сравнение с LEDC
- LEDC: встроенный модуль ШИМ, до 16 каналов, удобный API, поддержка частот от 1 Гц до 40 МГц, разрешение до 20 бит.
- Таймеры: позволяют полностью контролировать генерацию импульсов, но требуют больше кода и ресурсов, доступны только 4 аппаратных таймера.
- Вывод: LEDC предпочтительнее для большинства задач (LED, моторы, аудио), но таймеры полезны для обучения, нестандартных задач или при необходимости особого контроля над временем.
Заключение
Генерация ШИМ с помощью аппаратных таймеров ESP32 — это мощный инструмент для глубокого понимания работы контроллера. Такой подход может быть полезен для нестандартных проектов или экспериментов с точным управлением временем, но в большинстве случаев лучше использовать встроенный модуль LEDC.
Arduino UNO R3
Плата контроллера, полюбившаяся всем почитателям этой марки Arduino на базе микропроцессора ATmega3..
484.06грн.
Разработка устройств на ESP32 / Arduino / STM32 под заказ
Разработка устройств на ESP32 / Arduino / STM32 под заказ Нужен прототип или готовое ..
OLED шилд для контроллера WeMos D1 mini
Шилд OLED под WiFi-контроллер WeMos D1 mini с диагональю 0,66" и разрешением 64x..
125.17грн.
Arduino Pro Micro ATmega32U4 5V
Миниатюрная плата разработчика из линейки Arduino на основе микропроцессора ATMega 32U4Тактовая част..
282.78грн.
Модуль стабилизатора напряжения 3,3 В
Модуль предназначен для питания различных электронных устройств, модулей, работающих на напряжении 3..
18.61грн.






