关于旋转编码器(EC11)的使用(判断旋转方向,按键处理)

您所在的位置:网站首页 直播编码器是干什么用的呢图片 关于旋转编码器(EC11)的使用(判断旋转方向,按键处理)

关于旋转编码器(EC11)的使用(判断旋转方向,按键处理)

2024-07-15 13:02| 来源: 网络整理| 查看: 265

关于旋转编码器(EC11)的使用(判断旋转方向,按键处理)

文章目录 关于旋转编码器(EC11)的使用(判断旋转方向,按键处理)零. 前言一. 注意事项二. 本文所述旋转编码器的旋转控制逻辑三. 旋转编码器判断代码(旋转方向,按键) 四.最后提醒要是觉得对你有帮助的话,点个赞收个藏吧,我会开心一整天的😀

零. 前言

  本文对新手友好,代码可用,请放心食用   在自己工作的时候使用到了类似EC11旋转编码器,理论上应该是在大学就用透了,但是我还是第一次使用,仅此记录下自己对于旋转编码器的使用与理解,并且我对旋转编码器的代码编写存在一些疑问,如果能够解答一下,欢迎在评论区留言,先谢谢各位小伙伴!   编码器按键处理程序跟一般按键处理程序相同,因此在此不进行解释,仅贴代码   程序考虑情况比较多,写的相对繁琐,如果不需要异常处理,请自行修改,因为我也不知道需要不需要,但这种处理不是消抖处理!!   

一. 注意事项

  1. 请根据旋转编码器具体的电路连接,选择对应单片机对应端口GPIO的输入模式,分清楚旋转编码器不动作的时候给予单片机是高电平还是低电平   2. 旋转编码器一般有效的线是3根线,一根按键,两根用于输出信号判断顺时针和逆时针   3. 以下程序据我判断没有消抖功能,对于可能的抖动都判为了异常,让这部分的脉冲无效,而不是继续根据原有的意图实现功能   

二. 本文所述旋转编码器的旋转控制逻辑 该旋转编码器具有5线,分别是2xGND、K1、K2、K3,其中K1、K2用于旋转编码器正反转信号输出,K3为旋转编码器按键的信号输出该旋转编码器不作动的时候均为高电平旋转编码器旋转的时候K1和K2会相互输出不同相位的脉冲,以此区分顺逆时针旋转,如图所示:

在这里插入图片描述

图中清晰可见,想要判断出旋转编码器的CW和CCW旋转只需要关注第1和第3过程,只需要进行两次判断即可,顺时针为例:

1. (首次判断,过程1)K1低,K2高 ,给出第一次判断完成标志位 2. (等待,过程2) 3. (二次判断,过程3)K1低,K2高 ,判断结束 4. 清除所有标志位,等待下一次判断

但是否过程2的等待过程是没有用的呢,我认为不然,按照上面的逻辑,某一条线出现异常的时候则会误判(虽然我不清楚是否会出现这种异常,但是波形上是这样),如图所示:

在这里插入图片描述 以顺时针为例,按照上述判断流程,则1、2、3会被判断为cw逻辑,接下来的4、5、6会被判断为CCW逻辑,发生误判 因此,在我的程序会在过程2进行异常判断,判断逻辑以CW为例(结合图1):

1. (首次判断,过程1)K1低,K2高 2. (异常1判断,过程2)如果等待出现了第二次判断完成标志位,判断为异常,跳最后一步 3. (二次判断,过程3)K1高,K2低 ,给出第二次判断完成标志位 4. (最终判断,异常2判断,图1过程4)等待K1、K2高电平,判断是否经过了第二次判断,如果有,判断顺时针还是逆时针,判断结束,如果无,异常 5. 清除所有标志位,等待下一次判断

图CW异常 该判断逻辑下,第二判断会在过程3完成,给出二次判断结束标志位,但一直还没有进入最终判断(过程4),此时中途出现了异常(图2CW过程5),此过程即过程2,此时顺序为1->2->3->2,因此判断异常,直接跳到第5步 图CCW异常 同样的逻辑请套用到CCW逆时针异常的情况进行考虑,因为无法进行第二次判断(过程3),因此当出现K1、K2高电平,最终判断(图2CCW过程5),此时无法检测到第二次判断完成标志位,因此判断异常,直接跳到第5步   

三. 旋转编码器判断代码(旋转方向,按键)

1. 命名规则   单片机端口:类型_器件   p->pin(引脚端口),pc->pin controller(引脚对应的控制寄存器)   变量/标志位:类型_器件_特性_阶段   f->flag(标志位),ecd->encoder(编码器),cw/ccw(顺/逆时针),s1/s2->首次、二次判断   函数:器件_功能_特性   encoder->编码器,rotate->旋转

2. 单片机端口声明   请根据自己的单片机的型号以及定义方式进行定义,此处以芯圣的HC89F30xC 的单片机为例

#define pc_edc_k1 P0M7 #define pc_edc_k2 P0M5 #define pc_edc_k3 P0M4

2. 单片机标志位以及函数声明   请根据自己的单片机的型号以及定义方式进行定义,此处以芯圣的HC89F30xC 的单片机为例

volatile MakeBitsType flag_encoder; #define f_ecd_key flag_encoder.bits.Bit0 //编码器中间按键,0:未按下,1:按下 #define f_ecd_cw flag_encoder.bits.Bit1 //编码器顺时针旋转标志位 #define f_ecd_ccw flag_encoder.bits.Bit2 //编码器逆时针旋转标志位 #define f_ecd_cw_s1 flag_encoder.bits.Bit3 //编码器顺时针旋转第一次判断 #define f_ecd_ccw_s1 flag_encoder.bits.Bit4 //编码器逆时针旋转第一次判断 #define f_ecd_cw_s2 flag_encoder.bits.Bit5 //编码器顺时针旋转第二次判断 #define f_ecd_ccw_s2 flag_encoder.bits.Bit6 //编码器逆时针旋转第二次判断 unsigned char cnt_edc_key; //编码器按键消抖计数器 void Encoder_Keypress(); //编码器按键处理程序 void Encoder_Rotate(); //编码器旋转处理函数

3. 旋转编码判断程序   程序最后的结果是出现顺逆时针的判断标志位f_ecd_cw 和f_ecd_ccw,然后该程序不会清除该标志位,因为该程序只是判断用,最后应该在其他功能函数使用过后,再进行清除

void Encoder_Rotate() { if(b_dspall || !bbusysts || block || btemplock) return; //旋转编码器端口初始化为上拉输入状态 pc_edc_k1 = GPIO_In_PU; pc_edc_k2 = GPIO_In_PU; if(!p_ecd_k1){ //k1低电平 if(p_ecd_k2){ //k1低,k2高 if(f_ecd_ccw_s1) //第一次已经判断为逆时针状态,过程3 f_ecd_ccw_s2 = 1; //第二次判断为逆时针状态 else //如果没有进行首次判断,进行判断,过程1 f_ecd_cw_s1 = 1; //顺时针首次判断标志位置1 return; } else{ //k1低电平,k2低电平,过程2 if(!f_ecd_cw_s2 && !f_ecd_ccw_s2) //如未出现第二次判断的标志位,判断正常 return; //正常则ruturn,保留标志位,异常清标志位 } } else{ //k1高电平 if(!p_ecd_k2){ //k1高电平,k2低电平 if(f_ecd_cw_s1) //第一次已经判断为顺时针状态,过程3 f_ecd_cw_s2 = 1; //第二次判断为顺时针状态 else //如果没有进行首次判断,进行判断,过程1 f_ecd_ccw_s1 = 1; //逆时针首次判断标志位置1 return; } else{ //k1高电平,k2高电平时,为信号判断结束或无信号输入,过程4 if(f_ecd_cw_s2) f_ecd_cw = 1; //判断为顺时针 else if(f_ecd_ccw_s2) f_ecd_ccw = 1; //判断为逆时针 return; } } f_ecd_ccw_s2 = f_ecd_cw_s2 = f_ecd_ccw_s1 = f_ecd_cw_s1 = f_ecd_cw = 0; //异常或判断完成后,清除标志位 return; }

4. 编码器按键处理程序   cnt_ecd_key 是消抖计数器,因为这个函数写在主循环,主循环会2ms一次轮询这个函数,因此cnt_ecd_key = 5指的是进入这个函数的次数,实际上此时的消抖值为2ms * 5 = 10ms

void Encoder_Keypress() { if(b_dspall) return; //全显示不响应 pc_edc_k3 = GPIO_In_PU; //上拉输入模式 if(!p_edc_k3){ //中间按键按下 if(cnt_ecd_key) //消抖 cnt_ecd_key--; if(!cnt_ecd_key && !f_ecd_key){ //短按有效,长按无效 f_ecd_key = 1; Key_start(); } } else{ //无按键按下 f_ecd_key = 0; //标志位复位 cnt_ecd_key = 5; //计数器清0 return; } }

  

四.最后提醒

  程序考虑情况比较多,写的相对繁琐,如果不需要异常处理,请自行修改,因为我也不知道需要不需要,总的来说这些异常情况都是来自于器件有问题,说实话,硬件有问题关我软件什么事,对吧!但是还是跟着波形进行考虑了大部分的情况,但是,该程序也有一个问题,就是对于异常的处理实际上是不动作,而不是进行消抖让它正常工作,实际上是对编码器的要求拔高了,虽然减少了误判,但是应该是没有消抖的功能!!!!!!   如果对这个异常情况是否需要处理有看法的,请在评论区告诉我,十分谢谢!

要是觉得对你有帮助的话,点个赞收个藏吧,我会开心一整天的😀


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3