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.
Получение данных через UART Arduino Nano
Всем пользователям контроллеров Arduino известно, что можно передавать данные через аппаратный порт ..
Шестерня для зубчатого ремня на 60 зубов под ось 8 мм
Используется для передачи и редукции крутящего момента от двигателя до оси 8 ммКоличество зубьев 60 ..
148.24грн.
Модуль реле 4-канальный 5В 10А
4-канальный модуль реле для подключения напрямую к дискретному выходу контроллера. Светодиодная инди..
143.14грн.
Муфта на шаговый двигатель 5x5x25мм
Данная муфта служит переходником между валами 5 мм и 5 мм. Тоесть имеет с обеих сторон отверстие диа..
60.04грн.
Модуль енкодера
Модуль енкодера с кнопкой.Используется для управления меню в различных устройствах. Заменяет множест..
74.24грн.






