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

7 篇文章 1 订阅
7 篇文章 0 订阅

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

    }

}

 

 

  • 8
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值