如何用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
相关产品推荐
相关产品推荐

