Вимірювання часу та точні затримки на 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 размітка не підтримується! Використовуйте звичайтий текст.
    Погано           Добре
Розумний дім #1: Вступ до розумного дому на ESP32

Розумний дім #1: Вступ до розумного дому на ESP32

Розумний дім #1: Вступ до розумного дому на ESP32 Сучасний розумний дім – це не лише дорогі..

Сторожовий таймер та Arduino Uno

Сторожовий таймер та Arduino Uno

Навіщо потрібний watchdog (сторожовий таймер)? Сторожові таймери використовуються, щоб виключити ..

Набір датчиків ваги 200кг

Набір датчиків ваги 200кг

4 тензодатчика для вимірювання ваги до 200 кг при мостовому з'єданніКожний окремий датчик розрахован..

194.71грн.

Що таке транзистор?

Що таке транзистор?

Термін "біполярний транзистор" пов'язаний з тим, що в цих транзисторах використовуються носії заряді..

Мікрофон ємнісний електретний 6х5мм

Мікрофон ємнісний електретний 6х5мм

Мініатюрний монофонічний мікрофон з двома ніжкамиДіаметр 6 ммДовжина 5 ммТип електретнийЧутливість&n..

7.60грн.

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

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

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

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

0.00грн.

Watchdog і таймери ESP32

Watchdog і таймери ESP32

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

0.00грн.