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 разметка не поддерживается! Используйте обычный текст.
    Плохо           Хорошо
Arduino UNO R3

Arduino UNO R3

Плата контроллера, полюбившаяся всем почитателям этой марки Arduino на базе микропроцессора ATmega3..

484.06грн.

Разработка устройств на ESP32 / Arduino / STM32 под заказ

Разработка устройств на ESP32 / Arduino / STM32 под заказ

Разработка устройств на ESP32 / Arduino / STM32 под заказ Нужен прототип или готовое ..

OLED шилд для контроллера WeMos D1 mini

OLED шилд для контроллера WeMos D1 mini

Шилд OLED под WiFi-контроллер WeMos D1 mini с диагональю 0,66" и разрешением 64x..

125.17грн.

Arduino Pro Micro ATmega32U4 5V

Arduino Pro Micro ATmega32U4 5V

Миниатюрная плата разработчика из линейки Arduino на основе микропроцессора ATMega 32U4Тактовая част..

282.78грн.

Модуль стабилизатора напряжения 3,3 В

Модуль стабилизатора напряжения 3,3 В

Модуль предназначен для питания различных электронных устройств, модулей, работающих на напряжении 3..

18.61грн.

Рекомендуемые товары

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

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

ESP32: Высокоточные измерения сигналов с помощью таймеров ESP32 оснащён мощными аппаратными тайме..

0.00грн.