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

3-осьовий акселерометр ADXL346Z

Акселерометр - це датчик прискорення. Даний датчик вимірює статичне (гравітацію - нахил до земної пл..

167.51грн.

Стойка роликова для вісі Y з кріпежем

Стойка роликова для вісі Y з кріпежем

Монтажна панель з МДФ для організації вісі Y автоматичного лазерного гравера.Отвори під кроковий дви..

116.75грн.

Виготовлення друкованих плат за допомогою лазерного принтера

Виготовлення друкованих плат за допомогою лазерного принтера

Ви можете суттєво полегшити собі процес виготовлення друкованих плат, малюючи доріжки за допомогою..

Arduino SIM800L выбор оператора AT+COPS

Arduino SIM800L выбор оператора AT+COPS

Привіт, друзі! Час продовжити тему SIM800.У цьому відео ми навчимося вибирати GSM-оператора вручну т..

Шилд акумулятора для WeMos D1

Шилд акумулятора для WeMos D1

Шилд для живлення мікроконтролера WeMos D1 від літієвого акумулятора. Дозволяє заряджати а..

74.42грн.

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

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

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

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

0.00грн.