霍尔传感器测速
int pin=2;int i=0;
int val=0;
int a;
int dis=0;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(pin,INPUT);
attachInterrupt(0,hello,FALLING);
}
void loop() {
if(val==LOW)
{
hello();
}
}
void hello(){
i++;
a=2.026*i;
dis=a;
Serial.print(dis);
Serial.println("KM");
}
用霍尔传感器测里程为什么显示出来不对呢?求教
loop里面的东西全部删除即可。 林定祥 发表于 2015-2-5 15:13 static/image/common/back.gif
loop里面的东西全部删除即可。
你已经打开了中断程序,不管loop里面在干什么,中断来了就会进入中断处理相应的程序,处理完了会推出中断,继续原来的程序.从你的程序看有重叠了,loop中同样去了中断程序. 你现在开了中断,这样用也可以。但是,你用loop里的跳转也可以,但是你少乐端口变化的检测,只有端口发生时才能跳到处理的子程序。 林定祥 发表于 2015-2-6 20:26 static/image/common/back.gif
你现在开了中断,这样用也可以。但是,你用loop里的跳转也可以,但是你少乐端口变化的检测,只有端口发生时 ...
boolean ledstate=false;
int i=0;
int pin=2;
float spd1=0.0;
float cad1=0.0;
float dis1=0.0;
float avg1=0.0;
float starttime=0.00000;
float endtime=0.000000;
void setup()
{
Serial.begin(9600);
pinMode(pin,INPUT);
}
void loop() {
starttime=millis();
if (!digitalRead(pin))
{
SPD();
DIS();
}
}
void SPD(){
endtime=millis();
spd1=(2.026/(endtime-starttime))/360000000;
float cad1;
cad1=spd1/(0.06)/2.026/2;
}
void DIS(){
i++;
dis1=(2.026*i)/1000;
avg1=dis1/(millis()/360000000);
}
像这样我不用中断计算有什么问题吗? 你可以实践一下,从程序逻辑上没有什么问题.但是,你现在检测的是低电平,如果低电平周期是一个ms,那么在这个周期的任何点上都可能被检测到,因此会有一定的误差范围,同时如果loop里事干多了,错过了一次低电平的检测,那么也会造成误差.
像这种有事件明显变化的情况,建议使用边沿变化检测的中断.
页:
[1]