EC11旋转编码器程序解读篇

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

目录

前言   

EC11旋转编码器的原理

编码器按键按下处理程序

编码器按键分析处理程序

代码存在不足和自己的一些改进

EC11.c

EC11.h


前言   

最近在学习EC11旋转编码器时,看见有两篇质量很高的文章(12)大家可以先去看一下,大佬写的代码很好,但在搬运的过程,发现代码有些还有错误和存在不足的地方(个人意见),于是我自己在大佬代码的基础上修改和完善,经测试可实现相应功能。于是就打算出一篇关于大佬代码解读,让新手更快能懂,毕竟我自己在看代码时看了很久,接下来进入正题吧!

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))    //如果没有在规定双击时间内再次按下按键
				{
				 
评论 91
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值