光电计数问题(抖动?)
我在用1个马达计数的光电开关记录遮挡次数,每次用纸片遮挡再拿开,我的程序上的计数值增加2,3,4(不是1),请大神指教这个是什么原因?int x; //用于记录遮挡光电开关的次数
void setup() {
Serial.begin(9600);
pinMode(2,INPUT); //用2号口 接受中断
x=0;
attachInterrupt(0,z,CHANGE); //每当2号口变化时,触发中断函数 Z
}
void loop() {
Serial.print(x); //串口输出遮挡次数
delay(1000);
Serial.println();
}
void z() //中断函数
{
if (digitalRead(2)==LOW) //每当2号口输出变为0时,x值加1
{
x++;
delay(20);
}
}
这个光电开关是平时输出高电平,遮挡输出低电平的,是对射的那种。不知道问题出在哪里啦,电路连接应该没问题,我接下拉电阻和上拉电阻都试过啦,计数值每次还是加2~4,感觉像程序问题或硬件问题,请问怎么解决? 你用的是中断程序,但是在loop中用了1S的延迟,谁知道在1S中发生过几次中断呢?建议loop中的延迟不加或少加。 林定祥 发表于 2015-5-30 12:58 static/image/common/back.gif
你用的是中断程序,但是在loop中用了1S的延迟,谁知道在1S中发生过几次中断呢?建议loop中的延迟不加或少加 ...
+1
loop中什么都不要
println放在中断里
btw:中断程序开始的地方要不要关中断? 1. void z();中的delay(20);去掉。
2. 示波器看看 输入波形。波形最好是方波 上升沿计数,而不是低电平计数 catnull 发表于 2015-5-30 20:19 static/image/common/back.gif
上升沿计数,而不是低电平计数
RISING和CHANGE都试过啦,还是每次遮挡 计数增加2或者3 看看传感器波形,必要的化加运放进行滤波 catnull 发表于 2015-5-30 20:47 static/image/common/back.gif
看看传感器波形,必要的化加运放进行滤波
多谢,可能就是传感器的问题,毕竟某宝上 只有5块钱,呵呵 hustwhzl 发表于 2015-5-30 20:24 static/image/common/back.gif
RISING和CHANGE都试过啦,还是每次遮挡 计数增加2或者3
你估计一秒中里不会来一个脉冲吗? hustwhzl 发表于 2015-5-30 21:03 static/image/common/back.gif
多谢,可能就是传感器的问题,毕竟某宝上 只有5块钱,呵呵
和5块钱没关系,需要判断你信号性质,首先是否能够“真”的“高”或“低”,第二估计下脉冲的可能的频率范围,是前一种就可能是质量问题,第二种可以用不同的算法来克服。 林定祥 发表于 2015-5-30 21:08 static/image/common/back.gif
和5块钱没关系,需要判断你信号性质,首先是否能够“真”的“高”或“低”,第二估计下脉冲的可能的频率范 ...
谢谢啦,真的能够高或低,但是每次遮挡并放开,中断信号动作2~4次不等,我就是不会算法克服,假如我每次用纸片遮挡并放开用时1秒,我20秒周期遮挡并放开一次,大神帮忙给个程序吧 hustwhzl 发表于 2015-5-30 21:20 static/image/common/back.gif
谢谢啦,真的能够高或低,但是每次遮挡并放开,中断信号动作2~4次不等,我就是不会算法克服,假如我每次用 ...
这么慢的速度可以用轮询方法,即在在干其他事的轮回中到端口读一次,读到一次延迟再读一次,几次读到再确认基数,以此避免“干扰”。其他是做得多了,插入延迟可以少些,避免影响速度。
林定祥 发表于 2015-6-1 09:58 static/image/common/back.gif
这么慢的速度可以用轮询方法,即在在干其他事的轮回中到端口读一次,读到一次延迟再读一次,几次读到再确 ...
中断方式也可以,只是在中断中需要有确认有脉冲和不该有脉冲的抗”干扰“措施,确认没有干扰,再计数。 类似按钮你需要消抖 delay(10);外加if在判断一次 int x=0;
void setup()
{
Serial.begin(9600);
pinMode(2,INPUT);
//attachInterrupt(0,z,RISING);
}
void loop()
{
if(digitalRead(2)== LOW)
{
delay(10); //然后延时一段时间,
if(digitalRead(2)==LOW)
{
x+=1;
Serial.println(x);
while(digitalRead(2)==LOW)
{
delay(1);
}
}
}
}
页:
[1]