使用定时器,利用定时器中的esp_timer_get_time函数,可以获得微秒的时间戳。
下面程序是统计1000个脉冲需要的时间,计算出频率,显然这个方法频率很低或者太高都不适合,比如频率为100Hz,那么需要10秒,如果频率是10K,只需要0.1秒,精度会下降
#include <Arduino.h>
// 记录上一次外部中断触发的时间
uint64_t lastInterruptTime = 0;
// 记录中断次数
uint32_t interruptCount = 0;
void setup() {
Serial.begin(115200);
// 设置外部中断引脚
pinMode(4, INPUT);
attachInterrupt(digitalPinToInterrupt(4), externalInterruptHandler, RISING);
// 设置定时器
hw_timer_t *timer = timerBegin(1000000);
timerAttachInterrupt(timer, timerInterruptHandler);
timerAlarm(timer, 1000000, true, 0);
timerStart(timer);
lastInterruptTime = esp_timer_get_time();
}
void loop() {
// 在主循环中可以进行其他操作或者输出测量结果
if (interruptCount > 1000) {
uint64_t currentTime = esp_timer_get_time();
uint64_t elapsedTime = currentTime - lastInterruptTime;
float frequency = (interruptCount * 1000000.0) / elapsedTime;
Serial.print("Frequency: ");
Serial.println(frequency);
interruptCount = 0;
lastInterruptTime = esp_timer_get_time();
}
}
void externalInterruptHandler() {
interruptCount++;
}
void timerInterruptHandler() {
// 定时器中断处理函数可以进行一些其他操作,如果需要的话
}
低频的情况下精度是够的,但是效率太低了。
频率提高精度下降,10KHz的时候频率相差10H,精度是0.1%,可能也还好。