EC11、EC16、ECxx旋转编码器按钮软件滤波程序滤除干扰杂波51单片机C程序

前些日子在网上买了一些旋转编码器按钮,被奸商坑了,输出的正交脉冲,在发生边沿跳变的时候会产生干扰毛刺,毛刺通过硬件RC滤波能改善一些波形,但是还是会有杂波干扰程序。

正常正转波形如下图所示:

EC11、EC16、ECxx旋转编码器按钮软件滤波程序滤除干扰杂波51单片机C程序_第1张图片

             干扰正转波形如下图所示:

EC11、EC16、ECxx旋转编码器按钮软件滤波程序滤除干扰杂波51单片机C程序_第2张图片

   干扰反转波形如下图所示:

EC11、EC16、ECxx旋转编码器按钮软件滤波程序滤除干扰杂波51单片机C程序_第3张图片

旋转编码器的原理,这里不做介绍了,由于之前使用的是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     //反转
    {

    }

}

 

 

你可能感兴趣的:(单片机,ARM,嵌入式,物联网)