旋转编码器消抖程序设计
生活随笔
收集整理的這篇文章主要介紹了
旋转编码器消抖程序设计
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
話不多說,先上效果圖看下先
圖中可看到正轉(zhuǎn)和反轉(zhuǎn)之間沒有任何一個干擾信號
STM32輸入捕獲初始化配置程序
因為檢測原理和中斷輸入一樣,所以也可設(shè)為中斷輸入
旋轉(zhuǎn)編碼器的定時器中斷處理程序
_Bool TIM5CH1_CAPTURE_STA=0; //輸入捕獲狀態(tài),標(biāo)志上升沿還是下降沿 _Bool bit=0; //打印輸出標(biāo)志位 _Bool dt=0; //第一次下降沿時DT相記錄標(biāo)志位 u8 state=0; //正反轉(zhuǎn)狀態(tài)位, 2、4正轉(zhuǎn), 1、3反轉(zhuǎn) u16 num=0; //計數(shù)//定時器5中斷服務(wù)程序 void TIM5_IRQHandler(void) { if(TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET) //捕獲1發(fā)生捕獲事件{ if(TIM5CH1_CAPTURE_STA==0) //如果為捕獲下降沿{dt=DT; //記錄發(fā)生下降沿后第一時間的DT相電平if(CLK==0){ //重新判斷CLK相電平是否為低delay_ms(1); //延時消抖if(CLK==0){ //再次判斷CLK相電平是否為低if(dt) //判斷發(fā)生下降沿后第一時間的DT相電平,為高電平則記錄狀態(tài)標(biāo)志為正轉(zhuǎn)state=2;else //為低電平則記錄狀態(tài)標(biāo)志為反轉(zhuǎn)state=1;TIM5CH1_CAPTURE_STA=1; //輸入捕獲狀態(tài)設(shè)為上升沿TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //設(shè)置為上升沿捕獲} } }if(TIM5CH1_CAPTURE_STA==1) //如果為捕獲上升沿{ dt=DT; //記錄發(fā)生上升沿后第一時間的DT相電平if(CLK==1){ //重新判斷CLK相電平是否為高delay_us(300); //延時消抖if(CLK==1){ //再次判斷CLK相電平是否為高if((dt==0) && (state==2)){ //判斷發(fā)生上升沿后第一時間的DT相電平,為低電平且下降沿時記錄的狀態(tài)也為正轉(zhuǎn)狀態(tài)//則記錄狀態(tài)標(biāo)志為正轉(zhuǎn) state=4;num++;bit=1; //打印狀態(tài)位置1輸出}else if((dt==1) && (state==1)){ //判斷發(fā)生上升沿后第一時間的DT相電平,為高電平且下降沿時記錄的狀態(tài)為反轉(zhuǎn)狀態(tài)//則記錄狀態(tài)標(biāo)志為反轉(zhuǎn)num--;state=3;bit=1;}TIM5CH1_CAPTURE_STA=0; //輸入捕獲狀態(tài)設(shè)為上升沿TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling); //設(shè)置為上升沿捕獲 } } }} TIM_ClearITPendingBit(TIM5, TIM_IT_CC1); //清除中斷標(biāo)志位 }_Bool是C99中支持的布爾變量類型
總結(jié)
以上是生活随笔為你收集整理的旋转编码器消抖程序设计的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux改变群组的命令,linux改变
- 下一篇: python编写四则运算_python实