旋转编码器消抖程序设计
生活随笔
收集整理的这篇文章主要介绍了
旋转编码器消抖程序设计
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
话不多说,先上效果图看下先
图中可看到正转和反转之间没有任何一个干扰信号
STM32输入捕获初始化配置程序
因为检测原理和中断输入一样,所以也可设为中断输入
旋转编码器的定时器中断处理程序
_Bool TIM5CH1_CAPTURE_STA=0; //输入捕获状态,标志上升沿还是下降沿 _Bool bit=0; //打印输出标志位 _Bool dt=0; //第一次下降沿时DT相记录标志位 u8 state=0; //正反转状态位, 2、4正转, 1、3反转 u16 num=0; //计数//定时器5中断服务程序 void TIM5_IRQHandler(void) { if(TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET) //捕获1发生捕获事件{ if(TIM5CH1_CAPTURE_STA==0) //如果为捕获下降沿{dt=DT; //记录发生下降沿后第一时间的DT相电平if(CLK==0){ //重新判断CLK相电平是否为低delay_ms(1); //延时消抖if(CLK==0){ //再次判断CLK相电平是否为低if(dt) //判断发生下降沿后第一时间的DT相电平,为高电平则记录状态标志为正转state=2;else //为低电平则记录状态标志为反转state=1;TIM5CH1_CAPTURE_STA=1; //输入捕获状态设为上升沿TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //设置为上升沿捕获} } }if(TIM5CH1_CAPTURE_STA==1) //如果为捕获上升沿{ dt=DT; //记录发生上升沿后第一时间的DT相电平if(CLK==1){ //重新判断CLK相电平是否为高delay_us(300); //延时消抖if(CLK==1){ //再次判断CLK相电平是否为高if((dt==0) && (state==2)){ //判断发生上升沿后第一时间的DT相电平,为低电平且下降沿时记录的状态也为正转状态//则记录状态标志为正转 state=4;num++;bit=1; //打印状态位置1输出}else if((dt==1) && (state==1)){ //判断发生上升沿后第一时间的DT相电平,为高电平且下降沿时记录的状态为反转状态//则记录状态标志为反转num--;state=3;bit=1;}TIM5CH1_CAPTURE_STA=0; //输入捕获状态设为上升沿TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling); //设置为上升沿捕获 } } }} TIM_ClearITPendingBit(TIM5, TIM_IT_CC1); //清除中断标志位 }_Bool是C99中支持的布尔变量类型
总结
以上是生活随笔为你收集整理的旋转编码器消抖程序设计的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: linux改变群组的命令,linux改变
- 下一篇: 乐趣国学—品读《弟子规》中的“余力学文”