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

Винт М2,5х14мм нержавейка

Винт из нержавейки с резьбой М2,5 для крепления элементов любительских проектовДлина резьбы 14 мм..

1.11грн.

Одна кнопка — три команды на Arduino UNO: клик, двойной клик и длинное нажатие

Одна кнопка — три команды на Arduino UNO: клик, двойной клик и длинное нажатие

Одна кнопка — три команды: клик, длинное нажатие и двойной клик на Arduino UNO В большинств..

Таймеры Arduino UNO — Часть 1. Введение

Таймеры Arduino UNO — Часть 1. Введение

Таймеры Arduino UNO — Часть 1. Введение Теория Что такое таймер в микроконтроллере ATm..

ESP32 PWM (analogWrite): управление светодиодами и моторами

ESP32 PWM (analogWrite): управление светодиодами и моторами

ESP32 PWM (analogWrite): управление яркостью и скоростью без углублений в драйверы ESP32 по..

Датчик вибрации SW-420

Датчик вибрации SW-420

Датчик вибрации SW-420 предназначен для обнаружения вибрации и ударов. Идеально подходит для систем ..

27.93грн.

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

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

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

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

0.00грн.