ESP32使用正交編碼器教程(IDF)

前言:使用最簡(jiǎn)單粗暴的方式實(shí)現(xiàn)編碼器的使用,簡(jiǎn)單易懂,準(zhǔn)確率高
編碼器原理圖:

一共只有四個(gè)重要引腳,分別是com:公共端,接GND或者VCC都行,如果接GND則IO上拉,接VCC則IO下拉,S:按鈕檢測(cè)(編碼器自帶了一個(gè)按鍵),A/B:AB線(xiàn),用于檢測(cè)編碼器正反轉(zhuǎn)以及轉(zhuǎn)了幾格
編碼器AB線(xiàn)規(guī)律:
A線(xiàn)默認(rèn)電平狀態(tài)永遠(yuǎn)是1,只有在編碼器撥動(dòng)一格的時(shí)候會(huì)先變0,隨后恢復(fù)成1
B線(xiàn)默認(rèn)電平狀態(tài)不穩(wěn)定,在編碼器不撥動(dòng)完整一格的情況下,輕微順時(shí)針觸碰撥盤(pán)會(huì)變1,輕微逆時(shí)針觸碰撥盤(pán)會(huì)變0
根據(jù)這個(gè)規(guī)律來(lái)完善邏輯:當(dāng)A線(xiàn)從0變化為1時(shí),說(shuō)明編碼器已經(jīng)被撥完了完整的一格,由于B線(xiàn)的狀態(tài)只要輕輕的觸碰就能改變,所以此時(shí)B線(xiàn)的值 由 撥動(dòng)時(shí) 是 順時(shí)針旋轉(zhuǎn)還是逆時(shí)針旋轉(zhuǎn)決定,如果讀出為1,則說(shuō)明剛剛順時(shí)針撥動(dòng)了一格
代碼實(shí)現(xiàn):
所有實(shí)現(xiàn)加在一起只有大約40行的代碼,核心邏輯只有16行代碼,非常簡(jiǎn)明簡(jiǎn)單,接下來(lái)解釋一下工作流程:
流程:
1、初始化相關(guān)的GPIO,由于我的COM端接GND,所以將相關(guān)的IO配置為上拉輸入
2、定義一個(gè)標(biāo)志位flag,用于控制是否進(jìn)行接下來(lái)的判斷
3、循環(huán)中判斷A線(xiàn)的狀態(tài)是否為0,如果為0,則將flag置1,以進(jìn)行等待A線(xiàn)變?yōu)?的操作
4、循環(huán)等待A線(xiàn)由0變1,說(shuō)明已經(jīng)撥動(dòng)了一格,此時(shí)及時(shí)讀取B線(xiàn)的值即可判斷出當(dāng)前是順時(shí)針旋轉(zhuǎn)還是逆時(shí)針旋轉(zhuǎn),然后將flag置0,等待下次觸發(fā)

總結(jié):
使用IO查詢(xún)法做的編碼器讀取,讀取速度為1ms,這就注定了不能轉(zhuǎn)的太快,實(shí)測(cè)10ms撥一格,不會(huì)出現(xiàn)誤判的情況,實(shí)際上正常使用,即使是快速旋轉(zhuǎn)的時(shí)間間隔也基本是20ms以上,基本上可以保障準(zhǔn)確率,但是如果非要猛轉(zhuǎn)它,那就只能使用其他外設(shè)解決了
????????后記(吐槽):正交編碼器是個(gè)好東西,一個(gè)編碼器就可以頂替掉三個(gè)普通按鍵的功能(正轉(zhuǎn),反轉(zhuǎn),按下),而且體驗(yàn)上比傳統(tǒng)按鍵好得多,搓編碼器很解壓,但是,但是,但是,怎么使用編碼器是個(gè)問(wèn)題,之前有大概了解過(guò),網(wǎng)上資料給我的感覺(jué)就是挺麻煩挺不好做的,STM32官方已經(jīng)適配了正交編碼器的接口,直接可以使用,ESP32好像沒(méi)有,需要自己實(shí)現(xiàn),話(huà)不多說(shuō)先去百度一波,搜索“esp32 正交編碼器”,搜出不少內(nèi)容,點(diǎn)開(kāi)第一個(gè)鏈接,好,csdn付費(fèi)專(zhuān)欄,我**&%¥#@#¥&,第二個(gè)鏈接說(shuō)的是使用ESP的pcnt功能實(shí)現(xiàn)讀取編碼器,但是代碼好多好復(fù)雜,不想看,第三個(gè)鏈接也是csdn的,寫(xiě)的還不錯(cuò)的,用的中斷和隊(duì)列,優(yōu)雅但復(fù)雜,暫時(shí)跳過(guò),再?gòu)暮竺娴逆溄娱_(kāi)始基本上就沒(méi)什么相關(guān)的東西了,要么是arduino,要么是stm32,要么就是單純編碼器的介紹,那么去bilibili搜索一下正交編碼器好吧,結(jié)果出來(lái)的內(nèi)容要么就是只有幾分鐘的成果演示,要么就是好幾十分鐘的長(zhǎng)篇大論,但是我只是想簡(jiǎn)單的了解一下編碼器的工作流程,然后能夠用起來(lái)就好了,我并不想聽(tīng)好幾十分鐘的篇幅給我介紹編碼器的各種詳細(xì)數(shù)據(jù)、類(lèi)型、各種無(wú)關(guān)緊要的巴拉巴拉的東西,然后我一思索,這玩意就三四個(gè)腳,不至于那么難吧,于是就簡(jiǎn)單的用串口打印了一下編碼器旋轉(zhuǎn)時(shí)各個(gè)引腳的電平狀態(tài),稍微總結(jié)了一下變化規(guī)律,然后自己實(shí)現(xiàn)了功能,核心邏輯只有16行代碼,完全可以勝任大部分日常使用的場(chǎng)景,比起各種教程里動(dòng)輒幾十上百行的代碼,可以說(shuō)是非常的簡(jiǎn)單明了了,唯一的缺點(diǎn)就是辛苦CPU以及不支持猛轉(zhuǎn)編碼器,不如中斷或者其他外設(shè)來(lái)的優(yōu)雅......到底還是自己給搞定了
????????現(xiàn)在找一篇干練一點(diǎn)的教程是真難啊,很多教學(xué)視頻都是猛猛的灌水,沒(méi)有干貨,印象最深刻的一個(gè)視頻教程,核心內(nèi)容就一句話(huà),但是視頻愣是做了十幾分鐘,大概就是“同學(xué)們啊...額...這個(gè)...今天呢...我們來(lái)講講這個(gè)東西啊....嗯...咳咳...這個(gè)啊..就是這個(gè)還是很重要的...嗯...所以我們來(lái)講講...嗯啊...”這樣的,還有就是操作不熟練就直接錄教程,然后總是寫(xiě)錯(cuò),通篇都在改錯(cuò),要么就是視頻聲音聽(tīng)不清,我都要看自閉了??還有網(wǎng)上抄來(lái)抄去的各種教程,十幾個(gè)不同的網(wǎng)站但是里面的內(nèi)容一模一樣,也不知道誰(shuí)抄的誰(shuí),原作者都找不到了,現(xiàn)在像這樣的教程越來(lái)越多,導(dǎo)致很多干貨的教程都被淹沒(méi)了,不容易找到,要么就是各種付費(fèi),今天就是找了半天沒(méi)找到什么心儀的教程,有感而發(fā)寫(xiě)下這篇專(zhuān)欄
????????不過(guò)話(huà)說(shuō)回來(lái),有人愿意免費(fèi)出教程就不錯(cuò)了,總比啥都沒(méi)得看強(qiáng),希望本教程對(duì)你有所幫助(*゜ー゜*)
