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

Пружина для натяжения ремня 6мм

Стальная пружина для натяжки зубчатого ремня GT2 шириной 6 ммИспользуется в 3d принтерах и CNC-станк..

4.82грн.

Ремень зубчатый 6 мм для 3D-принтера

Ремень зубчатый 6 мм для 3D-принтера

Отрезок зубчатого ремня шириной 6 мм.Применяется для перемещения каретки 3D-принтера или CNC по разн..

49.26грн.

Датчик касания ёмкостный

Датчик касания ёмкостный

Датчик выдаёт дискретный сигнал на выходе, когда к нему дотрагиваются пальцем.Его можно использовать..

28.76грн.

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

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

Мощность 0,250 ВтНоминалы сопротивлений 30 шт.Значения сопротивлений: 10 Ом, 22 Ом, 47 Ом, 100 ..

118.04грн.

Ремень зубчатый 6 мм 200 мм

Ремень зубчатый 6 мм 200 мм

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

43.74грн.

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

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

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

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

0.00грн.