关键点:
当向着箭头方向旋转的时候我们发现:A在下降沿的时刻B是高电平,A在上升沿的时刻B是低电平,这可以表述为(A 下 B 1,A 上 B 0),记作表述1;
当方向取图中反向的时候,可以看出当A在下降沿的时刻B是低电平,A在上升沿的时刻B是高电平,这可以表述为(A 下 B 0,A 上 B 1),记作表述2。
因此我们可以锁定A作为跳变沿检测中断引脚,在中断中记录下同一方向两个不同组合的状态,当完成一个完整的表述后我们就改变一次用于确定最终是否旋转的全局变量。
例如,我们定义一个全局变量flag用于告诉主函数是否发生了旋钮旋转;定义一个全局变量val,当正向旋转编码器发生一次咔哒声后,我们将val++;当反向旋转编码器发生一次咔哒声后,我们将val--操作一次。
这样为了记录下完整的表述1和表述2,我们定义两个全局变量flag1和flag2,当没有进入中断的时候,默认我们将其初始化为0,当发生了属性为“下1”的中断后,我们将flag1=1;当发生了属性为“下0”的操作后我们记录flag2=1;这样下次再次进入中断后那结果只能是对应的“上0”或“上1”,这个时候我们将对val进行操作,同时将flag1和flag2清零,并标记flag为1,这样我们可以在主函数识别出刚才发生了旋转操作,并在主函数中对其清零。
好了,思路有了,上程序的环节到了。
牛
楼主,想了2天,现在明白了。 说简单一点,就是有2条线,A和B. 就是记录A跳变沿关注另B的情况,记为1; 等待下个相反的跳变沿的时候,这个状态判断,顺时针还是逆时针。
如果定义下降沿触发中断事件为0,上升沿中断事件为1,那么机械抖动噪声引发的中断事件为000000111111,而不是010101,所以这种中断组合事件中出现了唯一的01,利用一个完整的事件01来识别是否发生了旋转,从而提高了抗干扰能力。至于为何这样,可以找一个单片机看看IO与IO中断相关的内部硬件电路是如何实现的。
根据编码器方波信号对应关系,自主推导合适逻辑,完成EC11编码器的信号读取。
大佬牛X
牛啊牛啊,大佬牛X