Введение в таймеры 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 и в реальном времени.
Винт М2,5х14мм нержавейка
Винт из нержавейки с резьбой М2,5 для крепления элементов любительских проектовДлина резьбы 14 мм..
1.11грн.
Одна кнопка — три команды на Arduino UNO: клик, двойной клик и длинное нажатие
Одна кнопка — три команды: клик, длинное нажатие и двойной клик на Arduino UNO В большинств..
Таймеры Arduino UNO — Часть 1. Введение
Таймеры Arduino UNO — Часть 1. Введение Теория Что такое таймер в микроконтроллере ATm..
ESP32 PWM (analogWrite): управление светодиодами и моторами
ESP32 PWM (analogWrite): управление яркостью и скоростью без углублений в драйверы ESP32 по..
Датчик вибрации SW-420
Датчик вибрации SW-420 предназначен для обнаружения вибрации и ударов. Идеально подходит для систем ..
27.93грн.






