ESP32 таймеры: Многозадачность с аппаратными таймерами

ESP32 — это мощный микроконтроллер с двухъядерным процессором, поддержкой FreeRTOS и аппаратными таймерами. Одна из сильных сторон ESP32 — возможность использовать несколько таймеров одновременно. Это открывает путь к многозадачности без использования блокирующих функций, таких как delay().

Особенности многозадачности с таймерами

  • ESP32 имеет четыре аппаратных таймера (по два на каждый таймерный блок).
  • Каждый таймер может работать независимо и вызывать свой обработчик прерывания.
  • Можно выполнять параллельные задачи — например, подсчёт импульсов и мигание светодиодом.

Сравнение с обычными методами

В Arduino Uno/Nano многозадачность достигается через хитрое использование millis() и логики в основном цикле. В ESP32 можно разгрузить основной цикл, передав часть задач аппаратным таймерам.

Пример 1. Два таймера: светодиод и счётчик импульсов

В этом примере первый таймер управляет миганием светодиода на GPIO 2, а второй считает импульсы на GPIO 4.


hw_timer_t *timerLED = NULL;
hw_timer_t *timerCounter = NULL;

volatile int pulseCount = 0;
const int ledPin = 2;
const int pulsePin = 4;

void IRAM_ATTR onTimerLED() {
  digitalWrite(ledPin, !digitalRead(ledPin)); // инвертируем состояние
}

void IRAM_ATTR onTimerCounter() {
  if (digitalRead(pulsePin) == HIGH) {
    pulseCount++;
  }
}

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(pulsePin, INPUT);

  // Таймер для мигания светодиодом: каждые 500 мс
  timerLED = timerBegin(0, 80, true); 
  timerAttachInterrupt(timerLED, &onTimerLED, true);
  timerAlarmWrite(timerLED, 500000, true);
  timerAlarmEnable(timerLED);

  // Таймер для счётчика импульсов: проверка каждые 1 мс
  timerCounter = timerBegin(1, 80, true);
  timerAttachInterrupt(timerCounter, &onTimerCounter, true);
  timerAlarmWrite(timerCounter, 1000, true);
  timerAlarmEnable(timerCounter);

  Serial.begin(115200);
}

void loop() {
  // Выводим значение счётчика каждые 2 секунды
  static unsigned long lastPrint = 0;
  if (millis() - lastPrint > 2000) {
    Serial.print("Импульсов: ");
    Serial.println(pulseCount);
    lastPrint = millis();
  }
}

Что происходит

  • Таймер 0 каждые 500 мс переключает состояние пина со светодиодом.
  • Таймер 1 каждые 1 мс проверяет уровень на пине pulsePin и увеличивает счётчик при HIGH.
  • Основной цикл остаётся свободен — он только выводит результат на экран раз в 2 секунды.

Пример 2. Три задачи параллельно

В ESP32 можно задействовать больше таймеров. Например:

  • Таймер 0 — мигает светодиодом.
  • Таймер 1 — считает импульсы.
  • Таймер 2 — измеряет интервал времени и отправляет данные в Serial.

Это позволяет строить реактивные системы без блокировок, где каждая задача обрабатывается отдельно.

Заключение

Многозадачность с аппаратными таймерами ESP32 позволяет запускать несколько независимых функций параллельно. Это удобно для проектов, где нужно одновременно работать с датчиками, светодиодами, моторами и коммуникационными протоколами. Используя таймеры, вы разгружаете основной цикл и повышаете стабильность работы устройства.

<< Проекты << Все товары >> Статьи, уроки >>

Написать отзыв

Примечание: HTML разметка не поддерживается! Используйте обычный текст.
    Плохо           Хорошо
Модуль твердотельного реле 4-канальный

Модуль твердотельного реле 4-канальный

Модуль предназначен для коммутации нагрузок с переменным напряжением питания 75 ... 264 ВМаксимальны..

258.23грн.

Умный дом #10: Датчик CO2

Умный дом #10: Датчик CO2

Умный дом #10: Датчик CO₂ Контроль качества воздуха в помещении — один из ключевых элем..

Как правильно составить техническое задание для разработки электроники

Как правильно составить техническое задание для разработки электроники

Как правильно составить техническое задание для разработки электроники Если вы планируете разрабо..

Автоматическое открытие окна по температуре — проект на Arduino

Автоматическое открытие окна по температуре — проект на Arduino

Сколько раз вы просыпались от холода летом или осенью, забыв закрыть окно перед сном? Слишком жарк..

Подключение шагового двигателя

Подключение шагового двигателя

Привет, друзья! Предлагаю вам практический алгоритм, как правильно подключить обмотки шагового дви..

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

Прерывания таймера ESP32: hw_timer_t, настройка обработчика и ограничения ISR

Прерывания таймера ESP32: hw_timer_t, настройка обработчика и ограничения ISR

Прерывания таймера ESP32: hw_timer_t, настройка обработчика и ограничения ISR ESP32 имеет а..

0.00грн.

Таймеры и FreeRTOS на ESP32

Таймеры и FreeRTOS на ESP32

Таймеры и FreeRTOS на ESP32 ESP32 работает под управлением FreeRTOS, и в дополнение к аппаратным ..

0.00грн.