You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Arduino的pulseIn()函数测量频率?请验证代码正确性

你的Arduino频率测量代码问题解析

嘿,作为Arduino新手能自己动手写代码做项目真的很棒!咱们来仔细看看你这段测量频率的代码,有几个关键问题需要调整,还有一些细节可以优化:

一、必须先修正的语法错误

  • 大小写敏感问题:Arduino对大小写严格要求,serial要写成Serial,pulsein需改为pulseIn,high要大写为HIGH
  • 符号遗漏:setup后面漏了括号,正确写法是void setup();所有语句末尾必须加分号,比如duration=pulseIn(senserpin,HIGH);、freq=1000000.0/duration;这些地方
  • 单位转换逻辑错误:你想把微秒转成秒,应该是除以1000000而非乘以!因为1秒=1,000,000微秒,更直观的频率计算写法是freq = 1000000.0 / duration;

二、逻辑上的小局限

pulseIn()只能测量单个高电平脉冲的持续时间,但频率是完整周期(高电平+低电平总时长)的倒数。如果你的传感器输出是占空比50%的方波,仅用高电平时长计算的频率会是真实值的2倍;如果占空比不是50%,误差会更大。要准确测量频率,建议测量完整周期,或者多次测量取平均来减少误差。

修正后的示例代码

适用于占空比50%的信号

int senserpin = 8;
int sensordelay = 1000;
float duration;
float freq;

void setup() {
  pinMode(senserpin, INPUT);
  Serial.begin(9600);
}

void loop() {
  // 测量高电平脉冲时长(微秒)
  duration = pulseIn(senserpin, HIGH);
  // 避免除以0的异常情况
  if (duration > 0) {
    // 占空比50%时,完整周期是高电平的2倍
    freq = 1000000.0 / (duration * 2);
  } else {
    freq = 0;
  }
  
  Serial.print("frequency: ");
  Serial.print(freq);
  Serial.println(" Hz");
  
  delay(sensordelay);
}

适用于任意占空比的信号(测量完整周期)

int senserpin = 8;
int sensordelay = 1000;
float highDuration;
float lowDuration;
float period;
float freq;

void setup() {
  pinMode(senserpin, INPUT);
  Serial.begin(9600);
}

void loop() {
  highDuration = pulseIn(senserpin, HIGH);
  lowDuration = pulseIn(senserpin, LOW);
  
  period = highDuration + lowDuration;
  if (period > 0) {
    freq = 1000000.0 / period;
  } else {
    freq = 0;
  }
  
  Serial.print("frequency: ");
  Serial.print(freq);
  Serial.println(" Hz");
  
  delay(sensordelay);
}

这样就能更准确地计算出信号的实际频率啦!

内容的提问来源于stack exchange,提问作者saif faez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:55:31