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 размітка не підтримується! Використовуйте звичайтий текст.
    Погано           Добре
Serial Monitor для налагодження скетчів Arduino

Serial Monitor для налагодження скетчів Arduino

Використання Serial Monitor для налагодження скетчів Arduino Вступ Serial Monitor — це в..

ESP32 WiFi модуль на DIN-рейку без корпусу

ESP32 WiFi модуль на DIN-рейку без корпусу

Плата продається без корпусуГоловний модуль для побудови домашньої чи промислової системи автоматичн..

772.57грн.

Ремінь зубчастий 6 мм 200 мм

Ремінь зубчастий 6 мм 200 мм

Зубчастий вкритий гумою ремінь для передачі механічної енергії обертання від одного зубчастого колес..

43.74грн.

Набір резисторів 300 шт. 10 Ом ... 1 МОм

Набір резисторів 300 шт. 10 Ом ... 1 МОм

Потужність 0,250 ВтНомінали опорів 30 шт.Значення опорів: 10 Ом, 22 Ом, 47 Ом, 100 Ом, 150 Ом, ..

118.04грн.

Драйвер двигуна постійного струму 15А, 5.5–24 В — H-міст A3941 для Arduino, ESP32, STM32

Драйвер двигуна постійного струму 15А, 5.5–24 В — H-міст A3941 для Arduino, ESP32, STM32

Потужний драйвер для керування двигунами постійного струму, побудований на мікросхемі Allegro A3941,..

387.47грн.

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

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

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

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

0.00грн.