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

Arduino SIM800 CBC уровень заряда

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

Инфракрасный датчик движения HC-SR505

Инфракрасный датчик движения HC-SR505

Миниатюрный экономичный датчик движения.Напряжение питания 4,5 ... 20 ВТок покоя < 60 мкАВыходные..

76.78грн.

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

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

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

49.26грн.

DC DC преобразователь понижающий с 4...35В до 1,25...32В 5А

DC DC преобразователь понижающий с 4...35В до 1,25...32В 5А

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

95.02грн.

Микро концевой выключатель KW-1

Микро концевой выключатель KW-1

Микро переключатель с максимальным током коммутации 2 А. Такие ставят в компьютерные мышки в качеств..

7.18грн.

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

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

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

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

0.00грн.