使用Arduino開發板連接ec11旋轉編碼器
因為最近要用到旋轉編碼器,從網上花了好長時間找了好多關于arduino使用旋轉編碼器的資料,總是找不到合適的,最后總結了一下(部分內容有借鑒,僅作分享,未作商用),分享給大家,
需要的元件:
杜邦線、arduino uno開發板、ec旋轉編碼器、面包板
首先了解一下編碼器(附上幾張ec11編碼器的圖)



旋轉編碼器的功能是什么呢:
首先旋轉編碼器是一種電子組件,能夠在旋轉時監視運動和位置,旋轉編碼器利用光學傳感器,當旋轉編碼器旋轉時,光學傳感器可以產生脈沖,它能把被測的角位移直接轉換成數字信號,可以分為增量型編碼器和絕對型編碼器,在本文中,我們將使用簡單的增量式旋轉編碼器,
EC11編碼器一共五條引線,當然兩邊還有兩個角,那是用來固定的,五條引線分別是:
**下面三個:**A信號輸出、B信號輸出、GND(接地)
上面兩個:一路開關信號輸入,一路GND接地
具體看下圖:

介紹一下編碼器的作業原理:
編碼器具有一個磁盤,該磁盤具有均勻分布的接觸區,這些接觸區連接到公共引腳C和兩個其他單獨的接觸引腳A和B,如下所示,

當磁盤逐步開始旋轉時,引腳A和B將開始與公共引腳接觸,因此將產生兩個方波輸出信號,
如果我們僅對信號脈沖進行計數,則可以使用兩個輸出中的任何一個來確定旋轉位置,但是,如果我們也要確定旋轉方向,則需要同時考慮兩個信號,
我們可以注意到,兩個輸出信號彼此之間相差90度,如果編碼器順時針旋轉,則輸出A將在輸出B之前

因此,如果我們每次計算信號從高到低或從低到高變化的步數,我們就會注意到那時兩個輸出信號的值相反,如果編碼器逆時針旋轉,則輸出信號具有相等的值,因此,考慮到這一點,我們可以輕松地對控制器進行編程以讀取編碼器位置和旋轉方向,
**接下來我們進行arduino和ec11編碼器的連接**
GND------GND
VCC------+5V
SW--------D4
DT(A信號輸出)---------D3
CLK(B信號輸出)------D2
我們的程式采用中斷(可百度搜索arduino 的 attachInterrupt函式進一步了解)的方式,所以連接用了中斷引腳(我們D2用來中斷,D3 僅作為普通引腳):
#define encoder0PinA 2
#define encoder0PinB 3
#define encoder0Btn 4
int encoder0Pos = 0;
void setup() {
Serial.begin(9600);
pinMode(encoder0PinA, INPUT_PULLUP);
pinMode(encoder0PinB, INPUT_PULLUP);
pinMode(encoder0Btn, INPUT_PULLUP);
attachInterrupt(0, doEncoder, CHANGE);
}
int valRotary,lastValRotary;
void loop() {
int btn = digitalRead(encoder0Btn);
Serial.print(btn);
Serial.print(" ");
Serial.print(valRotary);
if(valRotary>lastValRotary)
{
Serial.print(" CW");
}
if(valRotary) {
Serial.print(" CCW");
}
lastValRotary = valRotary;
Serial.println(" ");
delay(250);
}
void doEncoder()
{
if (digitalRead(encoder0PinA) == digitalRead(encoder0PinB))
{
encoder0Pos++;
}
else
{
encoder0Pos--;
}
valRotary = encoder0Pos/2.5;
}
**解釋一下程式:**
第一部分當然是先定義要要連接的引腳
#define encoder0PinA 2
#define encoder0PinB 3
#define encoder0Btn 4
下面是啟動串口通訊,并將引腳定義為輸入上拉模式,當然還有中斷函式attachInterrupt()用于啟用D2的中斷
void setup() {
Serial.begin(9600);
pinMode(encoder0PinA, INPUT_PULLUP);
pinMode(encoder0PinB, INPUT_PULLUP);
pinMode(encoder0Btn, INPUT_PULLUP);
attachInterrupt(0, doEncoder, CHANGE);
}
下面的程式是確定旋轉編碼器CW還是CCW的程式,當前的旋轉編碼器讀數大于先前的旋轉資料,然后表示為CW,而如果當前讀數小于先前讀數,則將其表示為CCW
void loop() {
int btn = digitalRead(encoder0Btn);
Serial.print(btn);
Serial.print(" ");
Serial.print(valRotary);
if(valRotary>lastValRotary)
{
Serial.print(" CW");
}
if(valRotary) {
Serial.print(" CCW");
}
lastValRotary = valRotary;
Serial.println(" ");
delay(250);
}
在下面的“ doEncoder”功能中,,如果DT和CLK(Arduino Uno的引腳)的值相同,則“ encoder0Pos”變數將增加,否則,“encoder0Pos”變數將減少,ValRotary值是已運行的步驟數的值,ValRotary值由旋轉傳感器編碼器讀數值除以2.5獲得,從測驗中獲得2.5的值,因為旋轉編碼器的一個步長可能會超過1,所以根據每個步長以及讀取延遲的增加將其值除以2.5,
void doEncoder()
{
if (digitalRead(encoder0PinA) == digitalRead(encoder0PinB))
{
encoder0Pos++;
}
else
{
encoder0Pos--;
}
valRotary = encoder0Pos/2.5;
}
因為我的EC11旋轉編碼器沒有焊片,所以在連接時不好連接,所以只連接測驗了下面三個引腳,即A信號輸出、B信號輸出、和GND,測驗運行沒問題(連接好接線并燒入上面的程式后,打開arduino的串口監視器,按下復位一次(不按應該也可以),可以看到有輸出,旋轉編碼器,可以看到資料發生變化)
如果為了好連接,可以購買下圖(為了省事,圖來自網路,如有侵權,請聯系我,立刪)這種,比較好連接)
我的運行輸出:

中間一列是轉動轉編碼器的資料變化顯示,最左邊一列是未按下開關時的初始值,
至此,分享結束,我非專業人士,我也不是很精通,有問題歡迎評論討論,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/234323.html
標籤:其他
上一篇:Ardunio 下的stm32f103指南者串口通信
下一篇:Error: L6406E: No space in execution regions with .ANY selector matching 原因及解決辦法
