EC11、EC16、ECxx旋轉編碼器按鈕軟件濾波程序濾除干擾雜波51單片機C程序

前些日子在網上買了一些旋轉編碼器按鈕,被奸商坑了,輸出的正交脈衝,在發生邊沿跳變的時候會產生干擾毛刺,毛刺通過硬件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     //反轉
    {

    }

}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章