Вимірювання часу та точні затримки на 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(), вони працюють незалежно й не блокують основний код. Це робить їх незамінними у завданнях реального часу.
Розумний дім #1: Вступ до розумного дому на ESP32
Розумний дім #1: Вступ до розумного дому на ESP32 Сучасний розумний дім – це не лише дорогі..
Сторожовий таймер та Arduino Uno
Навіщо потрібний watchdog (сторожовий таймер)? Сторожові таймери використовуються, щоб виключити ..
Набір датчиків ваги 200кг
4 тензодатчика для вимірювання ваги до 200 кг при мостовому з'єданніКожний окремий датчик розрахован..
194.71грн.
Що таке транзистор?
Термін "біполярний транзистор" пов'язаний з тим, що в цих транзисторах використовуються носії заряді..
Мікрофон ємнісний електретний 6х5мм
Мініатюрний монофонічний мікрофон з двома ніжкамиДіаметр 6 ммДовжина 5 ммТип електретнийЧутливість&n..
7.60грн.







