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

Циклы 5 — Вложенные циклы

Циклы 5 — Вложенные циклы Введение Вложенные циклы — это конструкция, при которой один ц..

Автоматическое реверсивное управление двигателем с ATtiny85

Автоматическое реверсивное управление двигателем с ATtiny85

Постановка задачи проекта Ставим задачу автоматически таскать двигателем постоянного тока полезны..

Модуль блока питания 3,3В 1А

Модуль блока питания 3,3В 1А

Удобный модуль питания из 220В AC в 3,3В постоянного тока. Разработан для установки на печатную плат..

153.96грн.

Измерение времени выполнения операций и функций в скетчах Arduino

Измерение времени выполнения операций и функций в скетчах Arduino

Измерение времени выполнения операций и функций в скетчах Arduino Введение При разработк..

Шарниры под вращающуюся ось 8, 10мм 2шт.

Шарниры под вращающуюся ось 8, 10мм 2шт.

Такие шарниры предназначены для крепления оси червячной передачи на любой из трёх осей перемещения р..

164.87грн.

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

Прерывания таймера 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грн.