【學渣的自我修養】正交編碼器的原理與使用

正交編碼器(Quadrature Encoder)是一種用於測量旋轉速度和方向的感測器,通過積分(累加)運算後,還可以用來測算距離。最常見的正交編碼器有兩個輸出信號:A相 和 B相,有些編碼器會有 Z相 的校準功能(用於消除累計誤差)。「正交」一詞來源於 AB 兩個信號的特徵,一般情況下 A相 和 B相 的輸出信號總是有 π/2 的相位差。

原理

點擊鏈接顯示動圖:

上圖中 A 和 B 分別連接到兩個感測器單元上,黑白相間的圓環稱之為「柵格」。感測器和柵格的實現方式有很多種:反射式感測器+不同反光率的柵格;對射式感測器+鏤空光柵;霍爾感測器+磁極圓環;觸點+導電軌道;等等。

下圖是編碼器順時針和逆時針旋轉時,A、B相輸出的信號圖形。根據感測器和光柵的安裝情況,也有可能是和下圖完全相反,本文的講解將以下圖為準。

讀取編碼器的數據一般有三種方式:①專用硬體模塊 ②I/O口中斷處理 ③普通 I/O口讀取並處理。從①至③,佔用的計算資源依次增大,但通用性也依次增大,本文將講解第三種讀取方式的原理和實現方式。

編碼器在旋轉時,兩條數據線上的電平將不斷變化,根據不同的變化狀態可以計算出編碼器旋轉的方向,詳細情形如下表所描述:

表中 "+1" 表示順時針旋轉一格,"-1" 表示逆時針旋轉一格。兩相數據都發生變化時,無法判定是順時針或逆時針旋轉,於是都假定變化後數據是在 A相跳變時採集的數據。當採樣頻率足夠高時,兩相數據同時發生變化的概率很小,這樣的計算方式是足夠精確的。

使用

用 C 語言來表達以上表格的含義,如下:

uint8_t state = 0;nnvoid Update(void)n{nt//tRead new state bitsntif (digitalRead(A))nt{nttstate |= 0x02;nt}ntif (dagitalRead(B))nt{nttstate |= 0x01;nt}ntntswitch (state)nt{nttcase 0x01:nttcase 0x07:nttcase 0x08:nttcase 0x0E:ntttposition -= 1;ntttbreak;nttcase 0x02:nttcase 0x04:nttcase 0x0B:nttcase 0x0D:ntttposition += 1;ntttbreak;nttcase 0x03:nttcase 0x0C:ntttposition -= 2;ntttbreak;nttcase 0x06:nttcase 0x09:ntttposition += 2;ntttbreak;nttdefault:ntt//case 0x00:ntt//case 0x05:ntt//case 0x0A:ntt//case 0x0F:nttt//position += 0;ntttbreak;nt}ntnt//tUpdate the old statentstate <<= 2;nt//tKeep the old state bits and clear other bitsntstate &= 0x0C;n}n

實現以上函數,並儘可能頻繁地調用它(例如在 Arduino 的 loop 函數中調用),就可以得到編碼器旋轉的柵格數,從而可以計算出旋轉速度和距離。

參考鏈接:

What are Quadrature Encoders

en.wikipedia.org/wiki/R

推薦閱讀:

TAG:创客杂谈 | 点击链接显示动图 | WhatareQuadratureEncoders |