使用ESP32S3 测频率(频率计)2

使用定时器,利用定时器中的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%,可能也还好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值