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

Разработка электроники и печатных плат в Украине

Ищете опытного инженера для разработки электроники, IoT-устройств или печатных плат в Украине? М..

Аналоговые входы ESP32: особенности, подводные камни и калибровка

Аналоговые входы ESP32: особенности, подводные камни и калибровка

Аналоговые входы ESP32: особенности, подводные камни и калибровка ADC (Analog-to-Digita..

HTTP запрос через GSM GPRS модуль NEOWAY M590

HTTP запрос через GSM GPRS модуль NEOWAY M590

Постановка задачи. В этом проекте посмотрим на практический пример отправки http get запроса при по..

Разработка электроники под заказ (схема + плата + прошивка)

Разработка электроники под заказ (схема + плата + прошивка)

Разработка электроники под заказ (схема + плата + прошивка)Если вашему бизнесу нужен электронный при..

Цифровой датчик температуры и влажности DHT11 с подтягивающим резистором

Цифровой датчик температуры и влажности DHT11 с подтягивающим резистором

Измерение относительной влажности в пределах 20 ... 90 %Точность измерения влажности ± 5,0 %RHИ..

74.11грн.

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

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

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

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

0.00грн.