標(biāo)題: AB相旋轉(zhuǎn)編碼器解碼 [打印本頁(yè)]

作者: hujia    時(shí)間: 2015-6-23 14:03
標(biāo)題: AB相旋轉(zhuǎn)編碼器解碼

    AB相旋轉(zhuǎn)編碼器有兩根信號(hào)腳,為A和B。當(dāng)編碼器旋轉(zhuǎn)時(shí),編碼器內(nèi)部?jī)蓚(gè)開(kāi)關(guān)交替通斷,兩個(gè)開(kāi)關(guān)公共端接電源時(shí),A、B腳輸出方波;當(dāng)A超前(或滯后)B時(shí),為正轉(zhuǎn),反之為反轉(zhuǎn)。以下是摘抄至小孩子的解碼算法,簡(jiǎn)單高效。
假設(shè)函數(shù)IS_PIN_A_HIGH()和IS_PIN_B_HIGH()是讀取A,B兩個(gè)引腳的狀態(tài)
假設(shè)有兩個(gè)外中斷INT0和INT1都已經(jīng)配置為雙邊沿觸發(fā)模式,則解碼如下:


讀取全局變量s_wQDCounter的時(shí)候別忘記加入中斷保護(hù)。如果要追求效率,可以將計(jì)數(shù)器類型修改為uint16_t。

--------------------------
以上就是中斷法,可以用引腳電平變化中斷來(lái)做。上面的代碼是4倍頻。如果要2倍頻,去掉任何一個(gè)中斷處理程序即可。
如果要單倍頻,選擇任意一個(gè)外中斷,并選擇只對(duì)某個(gè)邊沿觸發(fā)即可。

多年測(cè)試,穩(wěn)定可靠~
記住一句口訣:

任意邊沿觸發(fā)模式下,A和B進(jìn)行電平比較:
對(duì)A觸發(fā)的中斷:同加異減
對(duì)B觸發(fā)的中斷:同減異加
反之亦然


作者: w1179benp    時(shí)間: 2016-11-29 15:44
初學(xué)者想找個(gè)完整的C51檢測(cè)EC11編碼器的程序,真不好找。大牛們通常只畫(huà)“點(diǎn)睛”之筆,搞得我等菜鳥(niǎo)云里霧里的...........能給個(gè)完整的學(xué)習(xí)學(xué)習(xí)嗎?
作者: 天涯無(wú)芳    時(shí)間: 2018-3-9 17:14
對(duì)啊送福送到家,別藏著掖著的
作者: xuanmic    時(shí)間: 2020-1-16 21:40
感謝分享!
作者: x51hei666    時(shí)間: 2021-1-20 10:49
w1179benp 發(fā)表于 2016-11-29 15:44
初學(xué)者想找個(gè)完整的C51檢測(cè)EC11編碼器的程序,真不好找。大牛們通常只畫(huà)“點(diǎn)睛”之筆,搞得我等菜鳥(niǎo)云里霧 ...

現(xiàn)在你是大牛了,,可以分享一下代碼嗎?是真的難找啊

作者: 1113634577    時(shí)間: 2021-2-20 20:21
精煉的編碼器程序
作者: cooleaf    時(shí)間: 2022-4-7 16:43
樓主思路清晰,代碼也很精簡(jiǎn),贊一個(gè)!
作者: 向日葵男人    時(shí)間: 2023-2-2 09:50
最近正在琢磨旋轉(zhuǎn)編碼器,,,借鑒下樓主的
作者: shennognshi    時(shí)間: 2024-1-26 14:54
s_wQDCounter被樓主定義為無(wú)符號(hào)整型,但是在代碼中卻使用了--運(yùn)算符,意味著可能要存儲(chǔ)負(fù)值,基于此,就可以對(duì)樓主的責(zé)任心打問(wèn)號(hào)。實(shí)測(cè)樓主的代碼確實(shí)不好用,只能說(shuō)有反應(yīng),要說(shuō)實(shí)用,完全不可。另外樓主所述“雙邊沿觸發(fā)模式”就是指電平變化觸發(fā)吧?
作者: xiaobendan001    時(shí)間: 2024-2-4 10:33
shennognshi 發(fā)表于 2024-1-26 14:54
s_wQDCounter被樓主定義為無(wú)符號(hào)整型,但是在代碼中卻使用了--運(yùn)算符,意味著可能要存儲(chǔ)負(fù)值,基于此,就可 ...

實(shí)際上這種中斷模式在使用時(shí)是極其不可靠的。
作者: xiaobendan001    時(shí)間: 2024-2-4 14:51
網(wǎng)上找到一種這樣的,在定時(shí)器中斷里面不斷的調(diào)用,可以試試效果怎樣
static uchar temp;
temp <<= 2;
if(sig_a)temp += 2;
if(sig_b)temp += 1;
switch(temp&0x0f){
        case 2:case 4:case 11:case 13:
        counter++;                        //脈沖數(shù)增加
        break;
        case 1:case 7:case 8:case 14:
        counter--;                //脈沖數(shù)減少
        break;
        case 3:case 6:case 9:case 12:
        break;
        }





歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1