AB相旋轉編碼器有兩根信號腳,為A和B。當編碼器旋轉時,編碼器內部兩個開關交替通斷,兩個開關公共端接電源時,A、B腳輸出方波;當A超前(或滯后)B時,為正轉,反之為反轉。以下是摘抄至小孩子的解碼算法,簡單高效。
假設函數IS_PIN_A_HIGH()和IS_PIN_B_HIGH()是讀取A,B兩個引腳的狀態
假設有兩個外中斷INT0和INT1都已經配置為雙邊沿觸發模式,則解碼如下:
- //! 編碼計數器
- static volatile uint32_t s_wQDCounter = 0;
- ISR(INT0_vect)
- {
- if (IS_PIN_A_HIGH() && IS_PIN_B_HIGH()) {
- s_wQDCounter++;
- } else {
- s_wQDCounter--;
- }
- }
- ISR(INT1_vect)
- {
- if (IS_PIN_A_HIGH() && IS_PIN_B_HIGH()) {
- s_wQDCounter--;
- } else {
- s_wQDCounter++;
- }
- }
讀取全局變量s_wQDCounter的時候別忘記加入中斷保護。如果要追求效率,可以將計數器類型修改為uint16_t。
--------------------------
以上就是中斷法,可以用引腳電平變化中斷來做。上面的代碼是4倍頻。如果要2倍頻,去掉任何一個中斷處理程序即可。
如果要單倍頻,選擇任意一個外中斷,并選擇只對某個邊沿觸發即可。
多年測試,穩定可靠~
記住一句口訣:
在任意邊沿觸發模式下,A和B進行電平比較:
對A觸發的中斷:同加異減
對B觸發的中斷:同減異加
反之亦然
|