本帖最后由 Kupar 于 2013-9-4 12:48 编辑
为了方便大家阅读,字体变大的是我的问题(疑问句)。
各位大侠,我最近在实验室要用Arduino实现一个快门系统的debounce,遇到了些问题,向各位求教。我的Arduino是mega2560
先说一下背景,Arduino的输入信号是在两个常数电压0伏和5伏间跳跃的信号,输出信号需要据此做一个调整,就比如在t时刻输入信号从0伏变到5伏了,那么输出信号在t时刻也从0伏变5伏,但在t+t1时刻变回0伏,在t+t1+t2时刻再变回5伏。反之亦然。那么这个问题的关键在于捕捉输入信号突变的时刻t,为此我编了以下程序:
(粗体高亮部分是关键程序)
————————————————————————————————————————————————
int Ih; //Ih means the histroy input ,Ih=1 or 0 means the histroy input is HIGH or LOW
int Ip; //Ih means the present input ,Ih=1 or 0 means the present input is HIGH or LOW
long Tstep; //Tstep means the time the step occurs ,the sudden increase or sudden decrease
long delta; //delta means the period between present time and the time step occurs ,this parameter is the criteria for the choise of debounce
void setup()
{
pinMode(1,INPUT);
pinMode(13,OUTPUT);
}
void loop()
{
if(digitalRead(1)==HIGH)
{
Ip=1;
if(Ih==0) //that means there occurs a sudden increase
{
Tstep=millis(); //then we need to record the time the step occurs
}
delta=Tstep-millis(); //delta is the time period between present and the time steps occurs
if(0 <= delta <100 ) digitalWrite(13,HIGH);
if(100 <= delta <200 ) digitalWrite(13,LOW); //this is the debouncing voltage
if(200 <= delta ) digitalWrite(13,HIGH);
}
if(digitalRead(1)==LOW)
{
Ip=0;
if(Ih==1) //that means there occurs a sudden decrease
{
Tstep=millis(); //then we need to record the time the step occurs
}
delta=Tstep-millis(); //delta is the time period between present and the time steps occurs
if(0 <= delta <100 ) digitalWrite(13,LOW);
if(100 <= delta <200 ) digitalWrite(13,HIGH); //this is the debouncing voltage
if(200 <= delta ) digitalWrite(13,LOW);
}
Ih=Ip;//let the present input becomes the history input after this loop
}
————————————————————————————————————————————————————————
问题1.先问一下这个程序应该没什么问题吧?
然后,Arduino的输入信号是信号发生器,我让它产生了0V和5V的频率1Hz的方波,信号发生器的输出同时连向数字示波器和Arduino输入端(用BNC cable的T形连接器),但此时问题出现了。
当我不把信号发生器的正负极接向Arduino的 digital pin 1 和GND时,示波器显示正常,但一旦接上正负极,示波器不再是0伏5伏的方波,而是5伏的时候正常,变到0伏时只能持续极短时间,然后立即突然升高到2伏,低电平变成2伏而不是0伏,然后再从2伏变到5伏,从此往复。
于是我上述程序运行时,输出信号(连向示波器的另一个channel)一坨屎,在0伏和5伏之间剧烈震荡,时间间隔微秒量级。
问题2.我想问一下大家在接上正负极后,信号发生器的信号低电平被强行拉高到2伏是什么原因?另外我好像在Arduino官网上看到说pin13由于连了电阻和LED,只能做输出不能做输入,会阻抗不匹配等,我想我的问题会和这个阻抗匹配有关吗?
后来我对程序进行了修改,在每次捕捉输入信号有跃变时,用Serial.println输入1或2,正常情况应该是1和2交替出现,但实际运行结果是1,2的出现毫无规律,不知道为什么。当然,这和我输出信号是真有关,就是我的第2个问题,低电平被莫名岂料强行拉高了,但我在想是不是还有其他原因。
问题3.然后我想问,loop循环是多久循环一次?一毫秒一次?还是说执行每条语句有各自时间,执行完了就自动从头开始?
一共就3个问题,希望各位高手不吝赐教!!!
|