Измерение времени и точные задержки на ESP32
ESP32 обладает мощной системой аппаратных таймеров, которые позволяют реализовывать более точные измерения времени и задержки, чем стандартные функции millis() и micros(). Это особенно важно в проектах, где требуется высокая точность: генерация сигналов, обработка датчиков или управление моторами.
Почему не всегда хватает millis() и micros()
- millis() — возвращает количество миллисекунд с момента старта программы. Точность достаточна для большинства задач, но не идеально подходит для быстрых процессов.
- micros() — возвращает количество микросекунд. Однако разрешение и стабильность зависят от системного таймера, и при больших нагрузках могут возникать неточности.
- Обе функции используют системные ресурсы ESP32, что может привести к неточностям при одновременной работе Wi-Fi или Bluetooth.
Аппаратные таймеры для точных измерений
ESP32 имеет до 4 аппаратных таймеров (по 2 на каждое ядро), каждый из которых работает независимо от системных функций. Это позволяет измерять интервалы времени с точностью до микросекунд.
Объект таймера создаётся через hw_timer_t, а затем можно настраивать его частоту и использовать для подсчёта времени.
Пример 1. Измерение интервала в микросекундах
hw_timer_t *timer = NULL;
volatile unsigned long startTime, endTime;
void IRAM_ATTR onTimer() {
endTime = micros();
unsigned long duration = endTime - startTime;
Serial.println(duration);
startTime = endTime;
}
void setup() {
Serial.begin(115200);
startTime = micros();
// Настройка таймера: таймер 0, делитель 80 (1 МГц = 1 мкс), true — счет вверх
timer = timerBegin(0, 80, true);
timerAttachInterrupt(timer, &onTimer, true);
timerAlarmWrite(timer, 1000000, true); // срабатывание каждые 1 сек
timerAlarmEnable(timer);
}
void loop() {
// Основной код выполняется параллельно, а измерение идёт в прерывании
}
Что происходит: каждые 1 секунду в прерывании фиксируется интервал между вызовами. Мы получаем стабильное измерение времени в микросекундах.
Пример 2. Создание точной задержки
hw_timer_t *delayTimer = NULL;
volatile bool flag = false;
void IRAM_ATTR onDelay() {
flag = true; // Сигнализируем о завершении задержки
}
void setup() {
Serial.begin(115200);
delayTimer = timerBegin(1, 80, true);
timerAttachInterrupt(delayTimer, &onDelay, true);
Serial.println("Старт задержки 2 сек...");
timerAlarmWrite(delayTimer, 2000000, false); // Один раз через 2 сек
timerAlarmEnable(delayTimer);
}
void loop() {
if (flag) {
Serial.println("Задержка завершена!");
flag = false;
}
}
Что происходит: создаётся точная задержка в 2 секунды без использования delay(). Основной код не блокируется.
Пример 3. Подсчёт событий с микросекундной точностью
volatile unsigned long lastPulse = 0;
void IRAM_ATTR onPulse() {
unsigned long now = micros();
unsigned long interval = now - lastPulse;
Serial.print("Интервал: ");
Serial.println(interval);
lastPulse = now;
}
void setup() {
Serial.begin(115200);
pinMode(4, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(4), onPulse, FALLING);
}
void loop() {
// Можно выполнять любые задачи, измерения идут в ISR
}
Что происходит: программа фиксирует точные интервалы между импульсами на входе GPIO 4.
Заключение
Аппаратные таймеры ESP32 позволяют реализовывать точные задержки и измерения времени на микросекундном уровне. В отличие от millis() и micros(), они работают независимо и не блокируют основной код. Это делает их незаменимыми в задачах реального времени.
Радиомодуль nRF24L01 (2,4 ГГц, SPI)
Радиомодуль nRF24L01 (2,4 ГГц, SPI) nRF24L01 — компактный радиопередатчик‑приёмник для беспрово..
54.65грн.
Модуль датчика расстояния TCRT5000
Модуль для измерения расстояния по интенсивности отражения инфракрасного луча от объекта.Имеет дискр..
28.30грн.
Радиатор 25х23х16мм
Радиатор алюминиевый для транзисторов, симисторов ... с установкой на печатную платуОкрашенный в чер..
17.24грн.
Буферы цифровых сигналов: зачем нужны и как правильно выбрать микросхему
Буферы цифровых сигналов: зачем нужны и как правильно выбрать микросхему Буфер цифрового сигн..
Цифро-знаковые жидкокристаллические индикаторы
Жидкие кристаллы — это вещества, проявляющие в определенном температурном интервале свойства как жид..







