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.
Serial Monitor для налагодження скетчів Arduino
Використання Serial Monitor для налагодження скетчів Arduino Вступ Serial Monitor — це в..
ESP32 WiFi модуль на DIN-рейку без корпусу
Плата продається без корпусуГоловний модуль для побудови домашньої чи промислової системи автоматичн..
772.57грн.
Ремінь зубчастий 6 мм 200 мм
Зубчастий вкритий гумою ремінь для передачі механічної енергії обертання від одного зубчастого колес..
43.74грн.
Набір резисторів 300 шт. 10 Ом ... 1 МОм
Потужність 0,250 ВтНомінали опорів 30 шт.Значення опорів: 10 Ом, 22 Ом, 47 Ом, 100 Ом, 150 Ом, ..
118.04грн.
Драйвер двигуна постійного струму 15А, 5.5–24 В — H-міст A3941 для Arduino, ESP32, STM32
Потужний драйвер для керування двигунами постійного струму, побудований на мікросхемі Allegro A3941,..
387.47грн.





