目录
前言
最近在学习EC11旋转编码器时,看见有两篇质量很高的文章(1,2)大家可以先去看一下,大佬写的代码很好,但在搬运的过程,发现代码有些还有错误和存在不足的地方(个人意见),于是我自己在大佬代码的基础上修改和完善,经测试可实现相应功能。于是就打算出一篇关于大佬代码解读,让新手更快能懂,毕竟我自己在看代码时看了很久,接下来进入正题吧!
EC11旋转编码器的原理
首先我们简单了解一下EC11的工作原理,EC11利用机械结构,输出A、B两项不同相位的方波。顺时针方向旋转时,A相超前B相90度,逆时针方向旋转时,B相超前A 相90度。其输出信号如下图所示。(注意:因为EC11工作电压是5V,所以接线引脚必须兼容5V,可以在数据手册查是否支持FT)

其真实输出的方波可能存在杂波,这里可以进行硬件消除和软件消除,一般选用硬件消除,利用RC滤波,这里不在细节,如果想更深入的小伙伴可自己查找相关资料(其实是我不懂>-<)。还有一点旋转编码器有一定位一脉冲和两定位一脉冲,这段详解在大佬文章中有详细解释。(我们一般在淘宝购买的旋转编码器一般是一定位一脉冲,所以本章代码所讲述是关于这种选择编码器的)
拿出一段如何判断正反转的代码分析。这一段代码很巧妙利用新旧的不同的状态的翻转,可知道电平发生的跳变,再利用只判断A项为零时才进入判断,就可以模拟检测下降沿触发中断效果,最后根据B项的电平就知道 ,此时是正转还是反转。
if (EC11_A_Now != EC11_A_Last) //以A为时钟,B为数据。正转时AB反相,反转时AB同相
{
if (EC11_A_Now == 0)
{
if (EC11_B_Now == 1) //只需要采集A的上升沿或下降沿的任意一个状态,若A下降沿时B为1,正转
ScanResult = 1; //正转
else //反转
ScanResult = 2;
}
EC11_A_Last = EC11_A_Now; //更新编码器上一个状态暂存变量
EC11_B_Last = EC11_B_Now; //更新编码器上一个状态暂存变量
}
编码器按键按下处理程序
//>>>>>>>>>>>>>>>>编码器按键按下处理程序<<<<<<<<<<<<<<<<//
if (EC11_Key == 0) //====检测到按键按下====//
{
if (EC11_KEY_COUNT<10000) //打开按键按下时间定时器
EC11_KEY_COUNT++;
if (EC11_KEY_COUNT > KEY_COUNT_DESHAKING) //按下按键时间到达消抖时间时
{ //置位短按按键标志
FLAG_EC11_KEY_ShotClick = 1;
}
if ((EC11_KEY_DoubleClick_Count > 0) && (EC11_KEY_DoubleClick_Count <= KEY_COUNT_DUALCLICKTIME)) //松开按键后,又在定时器在双击时间内按下按键
{ //置位双击按键标志
FLAG_EC11_KEY_DoubleClick = 1;
}
if (EC11_KEY_COUNT > KEY_COUNT_LONGTIME) //按下按键时间到达长按时间
{ //置位长按按键标志并复位短按按键标志
FLAG_EC11_KEY_LongClick = 1;
FLAG_EC11_KEY_ShotClick = 0;
}
}
else //====检测到按键松开====//
{
if (EC11_KEY_COUNT < KEY_COUNT_DESHAKING) //没到消抖时长就松开按键,复位所有定时器和按键标志
{
EC11_KEY_COUNT = 0;
FLAG_EC11_KEY_ShotClick = 0;
FLAG_EC11_KEY_LongClick = 0;
FLAG_EC11_KEY_DoubleClick = 0;
EC11_KEY_DoubleClick_Count = 0;
}
else
{
if (FLAG_EC11_KEY_ShotClick == 1) //短按按键定时有效期间
{
if ((FLAG_EC11_KEY_DoubleClick == 0) && (EC11_KEY_DoubleClick_Count >= 0))//记录第一次按下动作,使如果还能在规定时间内按下第二次,就可以执行满足下一行代
{
EC11_KEY_DoubleClick_Count++;
}
if ((FLAG_EC11_KEY_DoubleClick == 1) && (EC11_KEY_DoubleClick_Count <= KEY_COUNT_DUALCLICKTIME)) //如果在规定双击时间内再次按下按键
{ //认为按键是双击动作
FLAG_EC11_KEY_DoubleClick = 2;
}
if ((FLAG_EC11_KEY_DoubleClick == 0) && (EC11_KEY_DoubleClick_Count > KEY_COUNT_DUALCLICKTIME)) //如果没有在规定双击时间内再次按下按键
{

文章介绍了EC11旋转编码器的工作原理,包括正反转检测的代码实现,并详细阐述了编码器按键的按下处理程序和分析处理程序,以及针对原代码的改进,如消除错误、简化逻辑。同时,提供了短按、长按和双击的检测机制。
最低0.47元/天 解锁文章
2671





