Введение в таймеры ESP32

Микроконтроллер ESP32 оснащён мощными аппаратными таймерами, которые позволяют выполнять задачи с высокой точностью и без блокировки работы программы. Эти таймеры называются General Purpose Timers и входят в состав двух Timer Groups — каждая группа содержит по 2 таймера, всего 4 таймера доступно пользователю.

Аппаратные таймеры ESP32

  • Всего доступно 4 таймера (по 2 в каждой группе Timer Group0 и Timer Group1).
  • Точность до 80 МГц (в зависимости от источника тактирования).
  • Могут работать в режиме однократного или периодического запуска.
  • Поддержка прерываний: можно вызвать функцию при каждом срабатывании таймера.

Отличие от millis() и delay()

Функции millis() и delay() удобны для простых проектов, но имеют ограничения:

  • millis() и micros() дают доступ только к текущему времени, но не могут напрямую запускать действия.
  • delay() полностью блокирует выполнение кода, что мешает многозадачности.
  • Аппаратные таймеры позволяют запускать функции в фоне, без остановки основной программы.

Преимущества аппаратных таймеров ESP32

  • Высокая точность: микросекундные интервалы.
  • Возможность параллельного запуска нескольких таймеров.
  • Работа в фоне — основной цикл loop() остаётся свободным.
  • Можно реализовать задачи «реального времени» — например, измерение частоты, генерация сигналов или циклический опрос датчиков.

Пример 1. Простой таймер с прерыванием

Этот код вызывает функцию каждые 1 секунду.


hw_timer_t *timer = NULL;

void IRAM_ATTR onTimer() {
  Serial.println("Таймер сработал!");
}

void setup() {
  Serial.begin(115200);

  // Создаём таймер: (номер, предделитель, считать вверх)
  timer = timerBegin(0, 80, true); 
  // Предделитель 80 => частота 1 МГц (1 мкс на тик)

  // Привязываем обработчик прерывания
  timerAttachInterrupt(timer, &onTimer, true);

  // Настраиваем таймер: каждые 1 000 000 мкс = 1 секунда
  timerAlarmWrite(timer, 1000000, true);

  // Запускаем
  timerAlarmEnable(timer);
}

void loop() {
  // Основной цикл свободен
}

Пример 2. Несколько таймеров

Можно запустить несколько таймеров для разных задач.


hw_timer_t *timer1 = NULL;
hw_timer_t *timer2 = NULL;

void IRAM_ATTR onTimer1() {
  Serial.println("Таймер 1: мигаем светодиодом");
  digitalWrite(2, !digitalRead(2));
}

void IRAM_ATTR onTimer2() {
  Serial.println("Таймер 2: задача опроса датчика");
}

void setup() {
  pinMode(2, OUTPUT);
  Serial.begin(115200);

  // Таймер 1: каждые 500 мс
  timer1 = timerBegin(0, 80, true);
  timerAttachInterrupt(timer1, &onTimer1, true);
  timerAlarmWrite(timer1, 500000, true);
  timerAlarmEnable(timer1);

  // Таймер 2: каждые 2 секунды
  timer2 = timerBegin(1, 80, true);
  timerAttachInterrupt(timer2, &onTimer2, true);
  timerAlarmWrite(timer2, 2000000, true);
  timerAlarmEnable(timer2);
}

void loop() {
  // Всё работает в прерываниях
}

Пример 3. Однократный таймер

Иногда нужно выполнить действие только один раз с задержкой.


hw_timer_t *timer = NULL;

void IRAM_ATTR onTimer() {
  Serial.println("Сработал однократный таймер!");
}

void setup() {
  Serial.begin(115200);
  timer = timerBegin(0, 80, true);
  timerAttachInterrupt(timer, &onTimer, true);
  timerAlarmWrite(timer, 3000000, false); // 3 секунды, без автоповтора
  timerAlarmEnable(timer);
}

void loop() {
  // Однократный запуск, после чего таймер отключается
}

Заключение

Аппаратные таймеры ESP32 позволяют реализовывать более надёжные и гибкие проекты по сравнению с использованием delay() или millis(). Они обеспечивают высокую точность, параллельное выполнение задач и отсутствие блокировок — это особенно важно в проектах IoT и в реальном времени.

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

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

Примечание: HTML разметка не поддерживается! Используйте обычный текст.
    Плохо           Хорошо
ЧТО ТАКОЕ ТРАНЗИСТОР?

ЧТО ТАКОЕ ТРАНЗИСТОР?

Термин «биполярный транзистор» связан с тем, что в этих транзисторах используются носители зарядов д..

Модуль блока питания 5В 700мА

Модуль блока питания 5В 700мА

Миниатюрный безкорпусный трансформаторный блок питания для любительских проектов.Входное напряжение ..

70.15грн.

Твердотельное реле 10А

Твердотельное реле 10А

Реле без механических контактов на 10 А. Силовым элементом данного реле является симистор.Гальваниче..

281.48грн.

Обмен данными между двумя Arduino при помощи программного UART

Обмен данными между двумя Arduino при помощи программного UART

Обмен данными между двумя Arduino при помощи программного UARTКоммуникация по последовательному порт..

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

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

Предмет проекта домашней автоматики Вашему вниманию представлен большой проект - автоматический щит..

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

Создание простого таймера на ESP32: пример периодического вызова функции

Создание простого таймера на ESP32: пример периодического вызова функции

Создание простого таймера на ESP32: пример периодического вызова функции При разработке проектов ..

0.00грн.