說明:
旋轉編碼器可通過旋轉來計數(即可從0開始不但加一或者減一,計數范圍沒有限制),實現精確數字的調節。電機角度等需要特別精確調節的元器件可以利用編碼器來實現精細控制。配合旋轉編碼器上的按鍵,可以復位到初始狀態,即從0開始計數。
依照內部數字讀取辦法,編碼器能夠分為機械式和非機械式兩種:機械式選用電刷輸出,電刷接觸到導電區則引腳輸出高電平,接觸到絕緣區則為低電平;非機械式的承受靈敏元件是光敏元件或磁敏元件,選用光敏元件時以透光區和不透光區來表明輸出是“高”還是“低”。
目前常用的增量式編碼器全部為機械式編碼器,優點在于好用且成本低,高端的一般為非機械光電式的。我們采用的模塊也使用得機械式。
07旋轉編碼器照片.png (473.28 KB, 下載次數: 55)
下載附件
2020-7-22 20:26 上傳
如果你手上有一個旋轉編碼器,你可以試著擰一下:并不是連續旋轉,而是擰的得時候會明顯感受到不連續,一下一下的。因此,我們可以實現精確的計數,這與電位器是不同的
那么問題來了,怎么計數呢?我們可以做以下規定:
以順時針方向為正,凡往順勢針方向轉一下,則計數加一,同理轉N下,則計數加n。反之,如果向逆時針轉一下,則計數減一,同理轉N下,則計數減n。
逆時針同理。
現在問題又來了,旋轉編碼器怎么告訴微處理器,我的旋轉方向是什么呢?這些我們打開旋轉編碼器的微觀結構:
實際上旋轉編碼器內部結構如下所示。基本上由絕緣圓盤(灰色)和放置在圓盤頂部的導電墊(藍色)組成。
這些導電墊分離放置,因此當旋轉旋鈕時,旋轉一單位,原先空著的部分會被導電墊填充,而導電墊離開的位置則重新恢復絕緣。因此,當導電墊通過A和B輸出引腳時,引腳會輸出高電平信號,反之則不會輸出高電平。因此只要判斷引腳信號與上一次是否相同,就能得知是否發生了旋轉。
如下圖,每一次旋轉的時候,當順時針旋轉,A總是先比B接觸到導電墊,或者離開導電墊,因此A總是比B先改變電平輸出狀態,此時當A發生變化后一定與B信號不同。下圖為兩次順時針旋轉時,A、B電平變化(紅色為輸出高電平信號)
07旋轉編碼器示意圖01.png (70.42 KB, 下載次數: 61)
下載附件
2020-7-22 20:38 上傳
07旋轉編碼器示意圖02.png (72.85 KB, 下載次數: 63)
下載附件
2020-7-22 20:38 上傳
而當逆時針旋轉時,B先于A轉換電平,因此當檢測到A發生變化時,此時B已經完成了信號轉換,此時A、B信號相同。
實驗目的:
利用旋轉編碼器實現計數。 器材:
StduinoUno/Nano;杜邦線;旋轉編碼器模塊。 電路連接:
07旋轉編碼器電路圖.png (158.7 KB, 下載次數: 50)
下載附件
2020-7-22 20:39 上傳
代碼展示: #define outputA 6
#define outputB 7
int counter = 0;
int aState;
int aLastState;
void setup()
{
pinMode (outputA,INPUT);
pinMode (outputB,INPUT);
Serial.begin (9600);
aLastState = digitalRead(outputA);
}
void loop()
{
aState = digitalRead(outputA); // 讀取當前A電平
//如果當前A電平與上一次(初始)A電平不同,說明發生了旋轉
if (aState != aLastState)
{
// 如果A\B電平不同,說明A先于B變化,因此是順時針旋轉。順時針旋轉則計數加一;反之則減一
if (digitalRead(outputB) != aState)
{
counter ++;
} else
{
counter --;
}
Serial.print("Position: ");
Serial.println(counter);
}
aLastState = aState; //更新aLastState狀態的記錄
實驗效果:
當順時針旋轉的時候,計數數目逐次加一;當逆時針旋轉時,技術數目逐次減一。下面所示為順時針旋轉八個單位的過程中串口輸出情況。
07旋轉編碼器效果圖.png (19.95 KB, 下載次數: 57)
下載附件
2020-7-22 20:40 上傳
|