旋转编码器EC11调试心得
手頭的旋轉編碼器為20格一定位一脈沖,在靜止的時候AB兩線輸出都是高電平。轉動一格,AB兩線各自輸出一個低電平脈沖,然后又回到高電平狀態。對應于EC11內部AB兩個觸點開關的動作為斷開–>閉合–>斷開。通過區分哪根線先觸發低脈沖來判斷順時針旋轉(正轉),逆時針旋轉(反轉)。下圖是時序圖,但與我用的可能不是一個型號,時序有出入。也可能是我錯了,請大家幫忙指正謝謝大家。
看網上資料有大佬利用邏輯分析儀,將A線作為時鐘,B線作為data線,將扭動的脈沖信號,轉換成了通訊協議的方式,檢測時鐘線的觸發邊沿時,數據線的高低電平判斷正反轉。還有的前輩輪詢檢測兩根線的電平狀態,并將當前狀態與上一時刻狀態對比的方法判斷正反轉。
而我看的這個程序很奇怪
#define READ_EN_B() GPIO_ReadInputDataBit(GPIOC,EN_B) #define READ_EN_A() GPIO_ReadInputDataBit(GPIOC,EN_A) #define READ_EN_SW() GPIO_ReadInputDataBit(GPIOC,EN_SW)static u8 deb1=0,deb2=0,kpressed1=0,kpressed2=0; //deb是給sw和en_sw做去抖動的延時,kpressed是二者開閉狀態的標志位 static u16 k_hold1=0,k_hold2=0; //按鍵長按計數,便于確定按下時間 static u8 rise_debounce=0,fall_debounce=0,edge=0; //edge為0表明旋轉編碼開關被扭動 static u16 RCSfreetime=0,ModeChgTime=0; //RCSfreetime是編碼開關空閑時間,ModeChgTime是模式切換時間// 編碼開關識別程序(扭動部分)if(READ_EN_B() ){if(rise_debounce==10) //延時10ms{if(!edge) { edge=1;fall_debounce=0;if(!READ_EN_A()) //順時針{if(sw_conf == 0) //編碼開關被按下{ if(ModeChgTime <= 10) //這是個大概的值,到這個值的范圍就可以了{RunBuz=1;if(SysMode==0) //當為電壓檔時下一次順時針旋轉還是為電壓檔{SysMode=0;RunBuz=0; //超了就不發聲了}elseSysMode--;ModeChgTime = 250; //每次編碼開關旋轉一次都要等到250ms之后才能檢測到第二次旋轉,防止抖動造成的竄動} }sw_inc=1; sw_dec=0;encoder_speed++;Sleep_Time = 0; //任何按鍵一動,睡眠時間就清零}if(READ_EN_A()) //逆時針{if(sw_conf == 0) //編碼開關被按下{if(ModeChgTime <= 10){RunBuz=1;SysMode++;if(SysMode==4) {SysMode=3;RunBuz=0;}ModeChgTime = 250;} }sw_inc=0;sw_dec=1;encoder_speed++;Sleep_Time = 0;}}}elserise_debounce++;}if(!READ_EN_B())){if(fall_debounce==10){if(edge){ edge=0; rise_debounce=0;}}elsefall_debounce++;}因為上電后AB為高電平怎么上來就檢測B是否為高電平,這樣上電必會誤觸發。經過一番琢磨,發現思路很巧妙。初始edge=0,會誤觸一次,但是剛上電會有一段時間對扭動操作進行屏蔽。此時第一次誤觸就結束了,并且會使edge = 1。扭動檢測開始其實是在后面檢測B為低電平,只有這樣才會使edge = 0。這樣在檢測到B為高電平時,如果之前沒有觸發過低脈沖就不會繼續進行判斷。B觸發低脈沖以后,當B恢復為高電平時,通過檢測A的電平就可以知道A是否滯后于B,就能判斷是正轉和反轉了。這樣做好處是不需要檢測邊沿,只用io口讀取電平的函數,利用前后臺系統就可以精準檢測了。
這是我利用串口打印得出的扭動過程中AB兩線電平變化,不同型號或許有差別(AB 兩位表示同一時刻二者的電平)
順時針:11 10(b為0時edge=0) 00 01(b為1時a為0) 11 11(恢復)
逆時針:11 01 00(b為0時edge=0) 10 11(b為1時a為1) 11(恢復)
如上,只要做好去抖,在合適時間檢測AB的電平就可以精準檢測扭動了。如果順時針動作時,對A電平的檢測稍晚一些,就會錯過其低電平的狀態,誤判為逆時針扭動,實際使用要考慮到快速轉動等情況。
總結
以上是生活随笔為你收集整理的旋转编码器EC11调试心得的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 旋转编码器的原理和使用方法
- 下一篇: 2020年5大热点网络趋势