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.
Стійка нейлонова М3 12мм + 6мм
Стійка для кріплення усіляких електронних модулів до корпусу пристроюВисота стійки 12 ммДовжина зовн..
5.18грн.
ESP32 Timer Groups: архітектура та використання
ESP32 Timer Groups: архітектура та використання Мікроконтролер ESP32 має потужну систему апаратни..
Модуль розширення входів-виходів 4 реле та 4 DI I2C
Цікавий модуль розширення 4-х входів та 4 релейних виходів з комунікацією I2C на основі мікросхеми M..
475.88грн.
Вибір крокового двигуна
Вам вже доводилося робити вибір між різними кроковими двигунами для реалізації своїх амбіційних прое..
LED драйвер 330/660мА з PWM управлінням
LED драйвер 330/660 мА з ШІМ Драйвер для потужних світлодіодів і світлодіодних світильників на ..
121.15грн.






