Измерение времени и точные задержки на 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 разметка не поддерживается! Используйте обычный текст.
    Плохо           Хорошо
Таймеры Arduino UNO — Часть 6. Оптимизация и нестандартные применения

Таймеры Arduino UNO — Часть 6. Оптимизация и нестандартные применения

Таймеры Arduino UNO — Часть 6. Оптимизация и нестандартные применения Теория Совмещени..

Обмен информацией между контроллерами Arduino Nano по Ethernet

Обмен информацией между контроллерами Arduino Nano по Ethernet

Двухсторонняя связь модулями ENC28J60 между контроллерами Arduino Я покажу здесь решение, казалос..

Трансформатор тока 0-30А

Трансформатор тока 0-30А

Аналоговый датчик переменного тока силой до 30А. Это раскрывающийся трансформатор тока с диаметром о..

261.79грн.

Умный дом 1. Постановка задачи.

Умный дом 1. Постановка задачи.

Умный дом 1. Постановка задачи. Каждый человек представляет себе свой умный дом в соответствии со с..

Датчик звука с аналоговым и дискретным выходами

Датчик звука с аналоговым и дискретным выходами

Аналоговый выход подлючается к аналоговому входу контроллера и при этом можно фиксировать уровень зв..

69.98грн.

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

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

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

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

0.00грн.

Watchdog и таймеры ESP32

Watchdog и таймеры ESP32

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

0.00грн.