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