Вимірювання часу та точні затримки на 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() {
  // Основний код виконується паралельно, а вимірювання йде у перериванні
}

Що відбувається: кожну секунду у перериванні фіксується інтервал між викликами. Маємо стабільне вимірювання часу в мікросекундах.

Приклад 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 размітка не підтримується! Використовуйте звичайтий текст.
    Погано           Добре
Модуль гальванорозв'язки 4-канальний

Модуль гальванорозв'язки 4-канальний

Модуль захисту та гальванічної розв'язки 4-х дискретних входів контролера з гвинтовими клемниками. ..

114.76грн.

Озвучка тира Arduino Nano и MP3-проигрыватель

Озвучка тира Arduino Nano и MP3-проигрыватель

Постановка задачіЗадачею проекту являється виготовлення пристрою озвучення пострілів 6-ти одиниць зб..

Радіо модуль NRF24L01

Радіо модуль NRF24L01

Радіомодуль nRF24L01 (2,4 ГГц, SPI) nRF24L01 — компактний радіопередавач-приймач для бездротового..

54.65грн.

Насос погружний 3 ... 6В 120л/год

Насос погружний 3 ... 6В 120л/год

Насос рідинний погружного типу.Використовується для поливу домашніх рослин, для мініатюрних фонтанів..

69.82грн.

Розумний дім #3: ESP32 + датчик температури та вологості (DHT22/SHT21)

Розумний дім #3: ESP32 + датчик температури та вологості (DHT22/SHT21)

Розумний дім #3: ESP32 + датчик температури та вологості (DHT22/SHT21) Контроль температури..

Рекомендовані товари

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

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

Таймери та FreeRTOS на ESP32 ESP32 працює під керуванням FreeRTOS, і окрім апаратних таймерів (hw..

0.00грн.

Watchdog і таймери ESP32

Watchdog і таймери ESP32

Watchdog і таймери ESP32 ESP32 має вбудований Watchdog Timer (WDT), який використовується для зах..

0.00грн.