Измерение времени и точные задержки на 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(), они работают независимо и не блокируют основной код. Это делает их незаменимыми в задачах реального времени.

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

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

Примечание: HTML разметка не поддерживается! Используйте обычный текст.
    Плохо           Хорошо
Радиомодуль nRF24L01 (2,4 ГГц, SPI)

Радиомодуль nRF24L01 (2,4 ГГц, SPI)

Радиомодуль nRF24L01 (2,4 ГГц, SPI) nRF24L01 — компактный радиопередатчик‑приёмник для беспрово..

54.65грн.

Модуль датчика расстояния TCRT5000

Модуль датчика расстояния TCRT5000

Модуль для измерения расстояния по интенсивности отражения инфракрасного луча от объекта.Имеет дискр..

28.30грн.

Радиатор 25х23х16мм

Радиатор 25х23х16мм

Радиатор алюминиевый для транзисторов, симисторов ... с установкой на печатную платуОкрашенный в чер..

17.24грн.

Буферы цифровых сигналов: зачем нужны и как правильно выбрать микросхему

Буферы цифровых сигналов: зачем нужны и как правильно выбрать микросхему

Буферы цифровых сигналов: зачем нужны и как правильно выбрать микросхему Буфер цифрового сигн..

Цифро-знаковые жидкокристаллические индикаторы

Цифро-знаковые жидкокристаллические индикаторы

Жидкие кристаллы — это вещества, проявляющие в определенном температурном интервале свойства как жид..

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

Таймеры и FreeRTOS на ESP32

Таймеры и FreeRTOS на ESP32

Таймеры и FreeRTOS на ESP32 ESP32 работает под управлением FreeRTOS, и в дополнение к аппаратным ..

0.00грн.

Watchdog и таймеры ESP32

Watchdog и таймеры ESP32

Watchdog и таймеры ESP32 ESP32 оснащён встроенным Watchdog Timer (WDT), который используется для ..

0.00грн.