前些日子在網上買了一些旋轉編碼器按鈕,被奸商坑了,輸出的正交脈衝,在發生邊沿跳變的時候會產生干擾毛刺,毛刺通過硬件RC濾波能改善一些波形,但是還是會有雜波干擾程序。
正常正轉波形如下圖所示:
干擾正轉波形如下圖所示:
干擾反轉波形如下圖所示:
旋轉編碼器的原理,這裏不做介紹了,由於之前使用的是1ms輪詢查詢IO口狀態判別旋轉方向,正常的正交脈衝式可以的,但是質量差一些的編碼器旋轉的時候有干擾,輪旋檢測的方法會產生誤動作,所以這裏主要討論濾波方法,濾出掉干擾。
由上圖可知,干擾總是出現在脈衝信號邊沿發生跳轉時,而脈衝寬度一般都在1ms以上,所以可以認爲,當檢測到到脈衝發生跳變的時候,1ms之內不檢測脈衝就可以了,通過上面的原理分析,程序可以這樣設計,通過使用一個外部中斷+定時器實現正交脈衝的濾波。用外部中斷檢測脈衝的下降沿,檢測到下降沿後,關閉外部中斷,判斷當前旋轉方向,打開定時器中斷定時1ms,定時時間到了之後,關閉定時器中斷,打開外部中斷,開始接受下一個脈衝。通過測試之前不能用的渣編碼器也可以正常使用了,嘎嘎嘎。
下面附上濾波程序僅供參考。
IT0 = 1; //使能INT0下降沿中斷
EX0 = 1; //使能INT0中斷
EA = 1;
TMOD = 0x00;
TL0 = 0x66; //22.1184M
TH0 = 0xfc;
TL0 = 0xCD; //設置定時初值
TH0 = 0xF8; //設置定時初值
TR0 = 0; //啓動定時器
ET0 = 1; //使能定時器中斷
void TM0_Isr() interrupt 1
{
EX0 = 1; //使能INT0中斷
TR0 = 0;
}
void INT0_Isr() interrupt 0
{
TR0 = 1;
EX0 = 0;
enCoderValue = 0x80;
if(EC11_B_Now ==1)// 只需要採集A的上升沿或下降沿的任意一個狀態,若A下降沿時B爲1,正轉
{
enCoderValue |= 0x01;
}
else //反轉
{
}
}