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.

<< Проекти << Усі товари >> Статті, уроки >>

Написати відгук

Примітка: HTML размітка не підтримується! Використовуйте звичайтий текст.
    Погано           Добре
Модуль 4 — Аналогові сигнали: ADC, PWM і регулятор яскравості

Модуль 4 — Аналогові сигнали: ADC, PWM і регулятор яскравості

Модуль 4 — Аналогові сигнали (курс для початківців) Мета модуля: вивчити роботу з аналогови..

Тестуємо WEB-інструмент програмування Arduino на офіційному сайті

Тестуємо WEB-інструмент програмування Arduino на офіційному сайті

Подивимось ближче на веб-редакторНа офіційному сайті  Arduino в розділі скачування засобів прог..

Watchdog і таймери ESP32

Watchdog і таймери ESP32

Watchdog і таймери ESP32 ESP32 має вбудований Watchdog Timer (WDT), який використовується для зах..

Arduino Nano + розширювач пінів + керування двигуном актуатора

Arduino Nano + розширювач пінів + керування двигуном актуатора

Приклад реверсивного управління двигуном актуатора за допомогою драйвера L298N та розширювача в..

Arduino функції та як з ними боротися

Arduino функції та як з ними боротися

Ця стаття із серії уроки Arduino. Тема цього уроку: Arduino функції і як з ними боротися.Ми дізнаємо..

Рекомендовані товари

ESP32: Високоточні вимірювання сигналів за допомогою таймерів

ESP32: Високоточні вимірювання сигналів за допомогою таймерів

ESP32: Високоточні вимірювання сигналів за допомогою таймерів ESP32 оснащений потужними апаратним..

0.00грн.