Arduino 如何获得更准确的转速值

Arduino 如何获得更准确的转速值,arduino,arduino-uno,Arduino,Arduino Uno,我正在尝试使用霍尔效应传感器和Arduino Uno构建转速计数器。我使用的是Arduino软件,我编写了以下代码: #包括 int sensorPin=2;//霍尔效应 浮动转速; 浮动转速; 易失字节rpmcount; 长期以前的micros=0; 长间隔=500000; 液晶显示器(12,11,6,5,4,3); 无效设置() { //设置串行-诊断-端口 序列号开始(115200); //安装销 引脚模式(传感器引脚,输入); //设置中断 连接中断(0,RPM,上升); } void

我正在尝试使用霍尔效应传感器和Arduino Uno构建转速计数器。我使用的是Arduino软件,我编写了以下代码:

#包括
int sensorPin=2;//霍尔效应
浮动转速;
浮动转速;
易失字节rpmcount;
长期以前的micros=0;
长间隔=500000;
液晶显示器(12,11,6,5,4,3);
无效设置()
{
//设置串行-诊断-端口
序列号开始(115200);
//安装销
引脚模式(传感器引脚,输入);
//设置中断
连接中断(0,RPM,上升);
}
void RPM()
{
rpmcount++;
} 
void循环()
{
无符号长currentmicros=micros();
int sensorValue=digitalRead(sensorPin);//读取传感器值
如果(当前微秒-先前微秒>间隔)
{
前一微秒=当前微秒;
分离中断(0);
revs=10.0/rpmcount;
转速=600.0转/分;
串行打印(“rpmcount:”);
串行打印(rpmcount);
串行打印(“rpm:”);
串行打印LN(rpm);
lcd.clear();
lcd.begin(16,2);
lcd.print(“RPM=”);
lcd.setCursor(6,0);
lcd.打印(rpm,0);
rpmcount=0;
连接中断(0,RPM,上升);
}
}
这可以正常工作并测量转速,但该值始终为60。我如何改变它,使其能够更准确地测量转速,比如+-5 RPM?我试着玩弄我的
转速
转速
公式,但几乎没有成功。

现在你有了

rpm =60.0*rpmcount;

您必须在更长的时间内存储计数,并根据该值计算值(或更改循环运行的频率)

在ISR中,计算自上次ISR开火以来经过的时间量,而不是增加计数

unsigned long someArray[2] = {0,0};
unsigned char rpmindex = 0;

void RPM_isr()
{
   rpmindex ^= 1;
   someArray[rpmindex] = micros();
} 

// And then in the main body

{
   // Disable interrupts
   // Copy someArray to a localArray
   // reEnable interrupts
   // Compute the interval between ISR fires
   unsigned long interval = abs(localArray[0] - localArray[1]);
   // Compute RPM
   unsigned int rpm = (60*1000000)/interval;
}
伪代码的解释风险自负


编辑:用于RPM计算的错误数学。

旁注:您应该尽量减少中断被禁用的时间。读取
rpmcount
到本地变量并将其归零,然后在使用串行端口或lcd之前重新启用中断。您的公式正确吗?它不应该是
rpmcount*60000.0/(currentmicros-previousmicros)
?我明白了,所以这需要更改我的
间隔值,对吗?这是否意味着为了更准确,我将不得不牺牲较慢的更新时间@DAWNKEEPERREDUCTION您的间隔将增加您读取值的准确性,但也会由于计算结果的时间安排不当而增加错误。若要再次减少此值,您可以生成多个循环的运行平均值。@c_user如果测量值是整数,则分辨率为
60000/间隔
。如果你测量1秒,你会得到60的倍数。要得到5的倍数,你需要测量12秒,因为60000/12000=5。