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的电容之后,使用示波器观察,几乎看不到抖动的毛刺,软件就简单了,不需要消抖