前些日子在网上买了一些旋转编码器按钮,被奸商坑了,输出的正交脉冲,在发生边沿跳变的时候会产生干扰毛刺,毛刺通过硬件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 //反转
{
}
}