Вимірювання часу та точні затримки на 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(), вони працюють незалежно й не блокують основний код. Це робить їх незамінними у завданнях реального часу.
Припой-паста для пайки SMD-компонентів
Паста-припой у шприці XG-Z40Намазується на контактні ділянки плати, плавиться при температурі > 1..
196.14грн.
Термопара K-типу 0...600°C з перетворювачем MAX6675
Термопара хромель-алюмель розрахована на вимірювання температури в діапазоні 0 ... 600 °CДовжин..
165.83грн.
ESP32: Генерація ШІМ на основі таймера (без LEDC)
ESP32: Генерація ШІМ на основі таймера (без LEDC) В ESP32 є кілька способів організувати широтно-..
Як працює Arduino
Как работает Arduino Arduino базовая архитектураЯдром платформы Arduino является микросхема-мик..
Мікрофон ємнісний електретний 6х5мм
Мініатюрний монофонічний мікрофон з двома ніжкамиДіаметр 6 ммДовжина 5 ммТип електретнийЧутливість&n..
7.60грн.







