STM32驱动_旋转编码器EC11

STM32驱动_旋转编码器EC11

前言:经过做项目了解了旋转编码器的原理,大白话讲就是正反旋转输出两种相位差不同的波形,我们程序解析这段波形就可以了
波形如图:使用示波器和逻辑分析仪采集波形都印证这个图是正确的

在这里插入图片描述

分析这个图,找一种最简便的方法采集和判断(只用一个定时器即可),判断这个变化过程就可以知道此时是正转还是反转
说明:使用定时器中断只能判定是正转还是反转,如果需要采集当前的旋转数字具体是多少,需要在main函数中判断
在这里插入图片描述

void TIM4_IRQHandler(void)   //3ms定时器定时中断(自己随意设定2ms~10ms应该都可以)
{
	static int a = 0,b = 0,c = 0,d = 0;
	if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)  
	{
		TIM_ClearITPendingBit(TIM4, TIM_IT_Update); 
		{
			static int ec11_time_stamp;
			ec11_time_stamp++;
			if(ec11_time_stamp == 5)	//轮询检测旋转编码器状态,周期5ms
			{
				static int first_a = 0,first_b = 0,second_a = 0,second_b = 0,first_check = 0;
				if(first_check == 0)  //首次开机需要先检测一下给first_a和first_b赋值
				{
					first_a = READ_ENCODER_A;
					first_b = READ_ENCODER_B;
					first_check = 1;
				}
				else
				{
					second_a = READ_ENCODER_A;
					second_b = READ_ENCODER_B;
					if(first_a == 0 && first_b == 0)
					{
						if(second_a == 1 && second_b == 0)
						{
							encoder_dev.encoderNum++;
							if(encoder_dev.encoderNum > 100) encoder_dev.encoderNum = 100;
							Debug_printf("encoderNum:%d\r\n",encoder_dev.encoderNum);		//正转
						}
						if(second_a == 0 && second_b == 1)
						{
							if(encoder_dev.encoderNum != 0) encoder_dev.encoderNum--;
							Debug_printf("encoderNum:%d\r\n",encoder_dev.encoderNum);		//反转
						}
					}
					else if(first_a == 1 && first_b == 1)
					{
						if(second_a == 0 && second_b == 1)
						{
							encoder_dev.encoderNum++;
							if(encoder_dev.encoderNum > 100) encoder_dev.encoderNum = 100;
							Debug_printf("encoderNum:%d\r\n",encoder_dev.encoderNum);		//正转
						}
						if(second_a == 1 && second_b == 0)
						{
							if(encoder_dev.encoderNum != 0) encoder_dev.encoderNum--;
							Debug_printf("encoderNum:%d\r\n",encoder_dev.encoderNum);		//反转
						}
					}
					first_a = second_a;           
					first_b = second_b;
				}
				ec11_time_stamp = 0;
			}
		}
	}
}

旋转编码器硬件电路也需要注意几点
1、旋转编码器旋转过程中也是有毛刺需要消抖的,软件消抖或是硬件消抖(建议是硬件,加个电容即可)
2、以下是参考电路,加了那个100NF的电容之后,使用示波器观察,几乎看不到抖动的毛刺,软件就简单了,不需要消抖

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
EC11是一种常见的旋转编码器,适用于微控制器的输入设备。STM32是一系列32位ARM Cortex-M微控制器的型号。下面是关于EC11旋转编码器STM32源码的简要说明。 首先,要使用EC11旋转编码器,我们需要将其连接到STM32微控制器的相应GPIO引脚。这通常涉及到连接旋转编码器的A相、B相和SW(按下旋转编码器)引脚到微控制器的GPIO引脚,并进行所需的外部中断或输入捕获配置。 接下来,我们可以编写STM32源码来读取EC11旋转编码器旋转和按键事件。首先,我们需要设置GPIO引脚的相关配置,如输入模式、中断触发方式等。 然后,我们可以使用STM32的外部中断或输入捕获模块来检测旋转编码器旋转事件。外部中断可以在旋转编码器的A相或B相引脚上触发,并且可以根据A相和B相的相位关系来判断旋转方向。另外,输入捕获模块可以用来测量旋转编码器旋转速度。 此外,我们还可以使用GPIO中断来检测EC11旋转编码器的按键事件。当按下旋转编码器的SW引脚时,相关的GPIO中断会被触发,我们可以在中断处理函数中处理按键事件。 根据具体的需求,我们可以编写处理旋转和按键事件的代码,例如更新显示、调整参数等。这些代码可以根据旋转编码器旋转方向增加或减少数值,或执行其他相关操作。 综上所述,通过合适的GPIO配置和适当的中断处理,我们可以编写STM32源码来实现对EC11旋转编码器的读取和响应。这样,我们就能够利用EC11旋转编码器STM32微控制器提供旋转和按键输入功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值