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.
Пружина для натяжения ремня 6мм
Стальная пружина для натяжки зубчатого ремня GT2 шириной 6 ммИспользуется в 3d принтерах и CNC-станк..
4.82грн.
Ремень зубчатый 6 мм для 3D-принтера
Отрезок зубчатого ремня шириной 6 мм.Применяется для перемещения каретки 3D-принтера или CNC по разн..
49.26грн.
Датчик касания ёмкостный
Датчик выдаёт дискретный сигнал на выходе, когда к нему дотрагиваются пальцем.Его можно использовать..
28.76грн.
Набор резисторов 300 шт. 10 Ом ... 1 МОм
Мощность 0,250 ВтНоминалы сопротивлений 30 шт.Значения сопротивлений: 10 Ом, 22 Ом, 47 Ом, 100 ..
118.04грн.
Ремень зубчатый 6 мм 200 мм
Зубчатый прорезиненный ремень для передачи механической энергии вращения от одного зубчатого колеса ..
43.74грн.






