【學渣的自我修養】正交編碼器的原理與使用
原理
點擊鏈接顯示動圖:
上圖中 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
https://en.wikipedia.org/wiki/Rotary_encoder
推薦閱讀:
TAG:创客杂谈 | 点击链接显示动图 | WhatareQuadratureEncoders |