本文主要是介绍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的电容之后,使用示波器观察,几乎看不到抖动的毛刺,软件就简单了,不需要消抖
这篇关于STM32驱动_旋转编码器EC11的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!