天天看點

37種傳感器(七)之旋轉編碼傳感器子產品+Stduino Nano&UNO37種傳感器(七)之旋轉編碼傳感器子產品+Stduino Nano&UNO

37種傳感器(七)之旋轉編碼傳感器子產品+Stduino Nano&UNO

本文轉載自:http://www.stduino.com/forum.php?mod=viewthread&tid=29&extra=page%3D1=

關鍵詞:

51、stm32、arduino、stduino、單片機、stduino UNO&Nano、旋轉編碼傳感器子產品

說明:

旋轉編碼器可通過旋轉來計數(即可從0開始不但加一或者減一,計數範圍沒有限制),實作精确數字的調節。電機角度等需要特别精确調節的元器件可以利用編碼器來實作精細控制。配合旋轉編碼器上的按鍵,可以複位到初始狀态,即從0開始計數。

依照内部數字讀取辦法,編碼器能夠分為機械式和非機械式兩種:機械式選用電刷輸出,電刷接觸到導電區則引腳輸出高電平,接觸到絕緣區則為低電平;非機械式的承受靈敏元件是光敏元件或磁敏元件,選用光敏元件時以透光區和不透光區來表明輸出是“高”還是“低”。

目前常用的增量式編碼器全部為機械式編碼器,優點在于好用且成本低,高端的一般為非機械光電式的。我們采用的子產品也使用得機械式。

37種傳感器(七)之旋轉編碼傳感器子產品+Stduino Nano&UNO37種傳感器(七)之旋轉編碼傳感器子產品+Stduino Nano&UNO

如果你手上有一個旋轉編碼器,你可以試着擰一下:并不是連續旋轉,而是擰的得時候會明顯感受到不連續,一下一下的。是以,我們可以實作精确的計數,這與電位器是不同的

那麼問題來了,怎麼計數呢?我們可以做以下規定:

以順時針方向為正,凡往順勢針方向轉一下,則計數加一,同理轉N下,則計數加n。反之,如果向逆時針轉一下,則計數減一,同理轉N下,則計數減n。

逆時針同理。

現在問題又來了,旋轉編碼器怎麼告訴微處理器,我的旋轉方向是什麼呢?這些我們打開旋轉編碼器的微觀結構:

實際上旋轉編碼器内部結構如下所示。基本上由絕緣圓盤(灰色)和放置在圓盤頂部的導電墊(藍色)組成。

這些導電墊分離放置,是以當旋轉旋鈕時,旋轉一機關,原先空着的部分會被導電墊填充,而導電墊離開的位置則重新恢複絕緣。是以,當導電墊通過A和B輸出引腳時,引腳會輸出高電平信号,反之則不會輸出高電平。是以隻要判斷引腳信号與上一次是否相同,就能得知是否發生了旋轉。

如下圖,每一次旋轉的時候,當順時針旋轉,A總是先比B接觸到導電墊,或者離開導電墊,是以A總是比B先改變電平輸出狀态,此時當A發生變化後一定與B信号不同。下圖為兩次順時針旋轉時,A、B電平變化(紅色為輸出高電平信号)

37種傳感器(七)之旋轉編碼傳感器子產品+Stduino Nano&UNO37種傳感器(七)之旋轉編碼傳感器子產品+Stduino Nano&UNO
37種傳感器(七)之旋轉編碼傳感器子產品+Stduino Nano&UNO37種傳感器(七)之旋轉編碼傳感器子產品+Stduino Nano&UNO

而當逆時針旋轉時,B先于A轉換電平,是以當檢測到A發生變化時,此時B已經完成了信号轉換,此時A、B信号相同。

實驗目的:

利用旋轉編碼器實作計數。

器材:

StduinoUno/Nano;杜邦線;旋轉編碼器子產品。

電路連接配接:

37種傳感器(七)之旋轉編碼傳感器子產品+Stduino Nano&UNO37種傳感器(七)之旋轉編碼傳感器子產品+Stduino Nano&UNO

代碼展示:

#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狀态的記錄
}
           

實驗效果:

當順時針旋轉的時候,計數數目逐次加一;當逆時針旋轉時,技術數目逐次減一。下面所示為順時針旋轉八個機關的過程中序列槽輸出情況。

37種傳感器(七)之旋轉編碼傳感器子產品+Stduino Nano&UNO37種傳感器(七)之旋轉編碼傳感器子產品+Stduino Nano&UNO

繼續閱讀