Измерение времени и точные задержки на 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 разметка не поддерживается! Используйте обычный текст.
    Плохо           Хорошо
Усилитель PAM8610 10x2Вт с регулировкой громкости и разъемами

Усилитель PAM8610 10x2Вт с регулировкой громкости и разъемами

Стерео усилитель звуковой частоты класса D с переменным резистором регулирования громкости, разъемам..

131.91грн.

Фильтрация шумов аналогового сигнала на Arduino

Фильтрация шумов аналогового сигнала на Arduino

Шум аналогового входа Любой аналоговый датчик, соединительные провода, да и сам аналоговый вход..

Модуль 4-х аналоговых входов I2C на ADS1115 (Geekmatic)

Модуль 4-х аналоговых входов I2C на ADS1115 (Geekmatic)

Модуль 4-х аналоговых входов I2C на ADS1115 (Geekmatic)Компактный и удобный модуль для подключения 4..

203.34грн.

Статический IP адрес ESP8266

Статический IP адрес ESP8266

Как задать статический IP адрес контроллеру ESP8266?Будем рассматривать этот вопрос на примере ..

Изготовление печатных плат при помощи лазерного принтера

Изготовление печатных плат при помощи лазерного принтера

Можно существенно облегчить себе процесс изготовления печатных плат, рисуя дорожки при помощи тоне..

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

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

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

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

0.00грн.

Watchdog и таймеры ESP32

Watchdog и таймеры ESP32

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

0.00грн.