了解EC11旋轉編碼器,編寫EC11旋轉編碼器驅動程序。


一、EC11旋轉編碼器基本認識

(1)、ALPS旋轉編碼器選型垂直型

 

(2)、ALPS旋轉編碼器選型側裝型

 

(3)、ALPS旋轉編碼器選型機械尺寸圖

(4)、ALPS旋轉編碼器選型引腳圖

 

(5)、ALPS旋轉編碼器選型內部觸點開關結構圖

(6)、ALPS旋轉編碼器選型時序圖

 (7)、EC11旋轉編碼器測試電路原理圖接法

  1、接外部上拉電阻,適用於浮空輸入和輸入上拉模式的IO口,如下圖所示。

 

  2、無外部上拉電阻,幾乎所有單片機IO口都可以設置為輸入上拉模式的IO口,如下圖所示。

 

二、EC11旋轉編碼器初級認識

(1)、EC11旋轉編碼器按旋轉出動作

 EC11旋轉編碼器按旋轉的輸出動作分為2種,一種就是轉一格,A、B對C端輸出一個完整脈沖,簡稱一定位一脈沖;另一種是轉兩格,A、B對C端輸出一個完整脈沖(轉一格就只是由低電平---高電平或由高電平---低電平),簡稱兩定位一脈沖。

(2)、EC11旋轉編碼器按旋轉出動作:一定位一脈沖

  1、一定位一脈沖EC11旋轉編碼器轉動一格輸出波形圖

 

解釋上圖:一定位一脈沖的EC11旋轉編碼器按測試電路圖的接法,在靜止的時候A、B兩線輸出都是高電平。轉動一格,A、B兩線各自輸出一個低電平脈沖,然后又回到高電平狀態,對應於EC11旋轉編碼器內部A、B兩個觸點開關的動作為:斷開---閉合---斷開。

(3)、EC11旋轉編碼器按旋轉出動作:兩定位一脈沖
  1、兩定位一脈沖EC11旋轉編碼器轉動一格輸出下降沿波形圖
 

   2、兩定位一脈沖EC11旋轉編碼器轉動一格輸出上升沿波形圖

 

解釋上兩圖:兩定位一脈沖的EC11旋轉編碼器稍微復雜一些,轉動一格只會輸出半個脈沖。靜止時,A、B觸點開關可以是斷開的也可以是閉合的。若初始狀態時A、B都是高電平,轉動一格就輸出從高電平到低電平的下降沿,隨后一直輸出低電平,對應於EC11旋轉編碼器內部A、B兩個觸電開關的動作為斷開---閉合。若初始狀態時A、B都是低電平,轉動一格就輸出從低電平到高電平的上升沿,隨后一直輸出低電平,對應於EC11旋轉編碼器內部AB兩個觸點開關的動作為閉合---斷開。由於兩定位一脈沖EC11旋轉編碼器會有兩種初始狀態,寫驅動程序就需要考慮多一些情況。再者,這類EC11旋轉編碼器在轉動到內部A、B觸點一直閉合的時候,就相當於把上拉電阻的另一端接地,無形中加大了系統的功耗(若外接10K上拉電阻到5V電源就是500uA的電流),這對於低功耗應用來說是非常不利的。

(4)、EC11旋轉編碼器旋轉定位和脈沖分辨
目前分有20定位數20脈沖與30定位數15脈沖。咋樣分辨20定位數20脈沖與30定位數15脈沖?要辨別的話也很簡單,拿一個位未知類型的EC11旋轉編碼器,看准一個點轉一圈,邊轉圈邊數這一圈有多少格就知道了。一般轉一圈有30格的都是兩定位一脈沖的類型,20格的都是一定位一脈沖的類型。對於沒 無步進手感的EC11旋轉編碼器,旋轉的時候是均勻的阻尼感,而不會有一格一格的步進手感,這種時候想辨別就需要用一個萬用表了。如果是一定位一脈沖的類型,不轉動的時候A,B於C端都不導通。如果是兩定位一脈沖的類型,會有A,B與C端導通和A,B與C端不導通兩種情況。稍微轉一下轉軸然后測量,若A,B與C端都導通,那么就是兩定位一脈沖類型。 雖然這種EC11旋轉編碼器無步進手感,但是大多數也是轉一圈輸出15脈沖(30格)或20脈沖(20格)的類型。
三、EC11旋轉編碼器進一步認識
(1)、EC11旋轉編碼器旋轉與按下按鍵波形圖

(2)、EC11旋轉編碼器一定位一脈沖波形圖

  1、EC11旋轉編碼器正轉一定位一脈沖波形圖

 解釋上圖:旋轉EC11旋轉編碼器操作順序為:正轉一格---停頓---連續正轉---停

 2、EC11旋轉編碼器反轉一定位一脈沖波形圖

 解釋上圖:旋轉EC11旋轉編碼器操作順序為:反轉一格---停頓---連續反轉---停

 (3)、EC11旋轉編碼器一定位一脈沖波形圖解讀

根據以上正反轉一定位一脈沖波形圖可知:若將EC11旋轉編碼器的A端視為時鍾,B端視為數據,整個EC11旋轉編碼器就可以視為根據時鍾脈沖輸出信號的同步元件。可以看做數據在時鍾的邊沿處輸出(即時鍾線檢測邊沿,數據線檢測電平,這個思路編程最簡單),當EC11旋轉編碼器正轉時,在時鍾線的下降沿處,數據線為高電平,或在時鍾線的上升沿處,數據線為低電平;EC11旋轉編碼器反轉時,在時鍾線的下降沿處,數據線為低電平,或在時鍾線的上升沿處,數據線為高電平。可以不嚴謹的簡單概括為:在時鍾的下降沿處,A、B反相為正轉,同相為反轉。進一步總結為:EC11旋轉編碼器每轉一格,A、B兩線就會各自輸出一個完整的脈沖,因此我們可以僅檢測時鍾線的時鍾單邊沿(上升沿或者下降沿任選一個做檢測),根據時鍾線的邊沿處,信號線的電平來判斷EC11旋轉編碼器是正轉還是反轉。為什么這樣檢測?由於一定位一脈沖的EC11旋轉編碼器在正常情況下A、B線初始狀態都是高電平,所以直接檢測時鍾線的下降沿更方便。(另一種方法也可以看做數據與時鍾的相位關系(即檢測數據線和時鍾線哪根線的邊沿先出現,這個思路編程較為復雜,適合做硬件實現):正轉時,A線相位超前於B線相位;反轉時,B線相位超前於A線相位。使用簡單的數字邏輯電路(異或門與D觸發器)就可以識別到A、B的相位關系與轉動次數。

 (4)、EC11旋轉編碼器一定位一脈沖驅動編程

#define EC11_A_Now P36 //EC11旋轉編碼器的A引腳,視為時鍾線,也表示EC11旋轉編碼器A引腳當前狀態,未旋轉時處於高電平狀態。
#define EC11_B_Now P35 //EC11旋轉編碼器的B引腳,視為信號線,也表示EC11旋轉編碼器B引腳當前狀態,未旋轉時處於高電平狀態
#define EC11_Key P37 //EC11旋轉編碼器的按鍵 
static char EC11_A_Last = 0; //EC11旋轉編碼器的A引腳上一次的狀態
static char EC11_B_Last = 0; //EC11旋轉編碼器的B引腳上一次的狀態
static char EC11_Type = 1; //定義變量暫存EC11旋轉編碼器的類型,即 0:一定位對應一脈沖,1:兩定位對應一脈沖。
//所謂一定位對應一脈沖,是指EC11旋轉編碼器每轉動一格,A和B都會輸出一個完整的方波。兩定位對應一脈沖,是指EC11旋轉編碼器每轉動兩格,A和B才會輸出一個完整的方波,只轉動一格只輸出A和B的上升沿或下降沿。
  char Encoder_EC11_Scan() //EC11旋轉編碼器掃描函數, 這里只是部分代碼 。
{ //以下儲存A、B上一次值的變量聲明為靜態全局變量,方便對EC11旋轉編碼器對應的IO口做初始化。 // static char EC11_A_Last = 0; // static char EC11_B_Last = 0; char ScanResult = 0; //返回編碼器掃描結果,用於分析EC11編碼器的動作,0:無動作,1:正轉,-1:反轉,2:只按下按鍵,3:按着按鍵正轉,-3:按着按鍵反轉。 if(EC11_Type == 0) //一定位一脈沖的EC11編碼器 { if(EC11_A_Now != EC11_A_Last) //判斷EC11旋轉編碼器A引腳當前狀態是否不等於EC11旋轉編碼器的A引腳上一次的狀態EC11旋轉編碼器A引腳為時鍾,EC11旋轉編碼器B引腳為數據,正轉時A、B反相,反轉時A、B同相。 { if(EC11_A_Now == 0)//EC11旋轉編碼器旋轉后,判斷EC11旋轉編碼器A引腳當前狀態是否處在低電平狀態。若處在低電平狀態,那么EC11旋轉編碼器A引腳當前狀態由高電平狀態變為低電平狀態,有下降沿產生。由於只需要采集EC11旋轉編碼器A引腳的上升沿或下降沿的任意一個狀態,再檢測EC11旋轉編碼器B引腳輸出電平類型,就可以判斷出EC11旋轉編碼器旋轉方向。即當EC11旋轉編碼器A引腳為下降沿或上升沿,EC11旋轉編碼器B引腳為高電平(即1)或低電平(即0)時,EC11旋轉編碼器正轉,另之反轉。 { if(EC11_B_Now == 1) //EC11旋轉編碼器旋轉后,判斷EC11旋轉編碼器B引腳當前狀態是否處在高電平狀態 ScanResult = 1; //正轉 else ScanResult = -1;//反轉 } EC11_A_Last = EC11_A_Now; //更新編碼器上一個狀態暫存變量 EC11_B_Last = EC11_B_Now; //更新編碼器上一個狀態暫存變量 } } return ScanResult; //返回值的取值:0:無動作,1:正轉,-1:反轉。 }

(5)、EC11旋轉編碼器兩定位一脈沖波形圖

  1、EC11旋轉編碼器正轉兩定位一脈沖波形圖

解釋上圖:旋轉EC11旋轉編碼器操作順序為:正轉第一格---停頓---正轉第二格---停頓---連續正轉---停

  2、EC11旋轉編碼器反轉兩定位一脈沖波形圖

解釋上圖:旋轉EC11旋轉編碼器操作順序為:反轉第一格---停頓---反轉第二格---停頓---連續反轉---停

  3、EC11旋轉編碼器正轉-反轉-正轉-正轉-反轉兩定位一脈沖波形圖

解釋上圖:旋轉EC11旋轉編碼器操作順序為:正轉一格---反轉一格---正轉一格---正轉一格---反轉一格---停

 (6)、EC11旋轉編碼器兩定位一脈沖波形圖解讀

 

(7)、EC11旋轉編碼器兩定位一脈沖(檢測相位超前或滯后的方式)驅動編程

/*  本程序是對上面char Encoder_EC11_Scan()函數的補充。即else對應的if為if(EC11_Type == 0) 即此處EC11_Type!= 0  */                            
else//兩定位一脈沖的EC11旋轉編碼器
{
if(EC11_A_Now !=EC11_A_Last)//判斷EC11旋轉編碼器A引腳當前狀態是否不等於EC11旋轉編碼器的A引腳上一次的狀態。若A 0->1 時,B 1->0 正轉;若A 1->0 時,B 0->1 正轉;若A 0->1 時,B 0->1 反轉;若A 1->0 時,B 1->0 反轉。 { if(EC11_A_Now == 1)//EC11旋轉編碼器旋轉后,判斷EC11旋轉編碼器A引腳當前狀態是否處在高電平狀態。 { if((EC11_B_Last == 1)&&(EC11_B_Now == 0))//EC11旋轉編碼器B引腳上一次狀態為高電平,EC11旋轉編碼器B引腳當前狀態低電平狀態。 ScanResult = 1;//正轉 if((EC11_B_Last == 0)&&(EC11_B_Now == 1))//EC11旋轉編碼器B引腳上一次狀態為低電平,EC11旋轉編碼器B引腳當前狀態高電平狀態。 ScanResult = -1;//反轉 //下面為正轉一次再反轉或反轉一次再正轉處理
if((EC11_B_Last == EC11_B_Now)&&(EC11_B_Now == 0))//EC11旋轉編碼器A引腳上升沿時,采集的B不變且為0。 ScanResult = 1;//正轉 if((EC11_B_Last == EC11_B_Now)&&(EC11_B_Now == 1)) //EC11旋轉編碼器A引腳上升沿時,采集的B不變且為1。 ScanResult = -1;//反轉 } else//EC11旋轉編碼器旋轉后,判斷EC11旋轉編碼器A引腳當前狀態是否處在低電平狀態。 { if((EC11_B_Last == 1)&&(EC11_B_Now == 0))//EC11旋轉編碼器B引腳上一次狀態為高電平,EC11旋轉編碼器B引腳當前狀態低電平狀態。 ScanResult = -1;//反轉 if((EC11_B_Last == 0)&&(EC11_B_Now == 1))//EC11旋轉編碼器B引腳上一次狀態為低電平,EC11旋轉編碼器B引腳當前狀態高電平狀態。 ScanResult = 1;//正轉 //下面為正轉一次再反轉或反轉一次再正轉處理
if((EC11_B_Last == EC11_B_Now)&&(EC11_B_Now == 0))//EC11旋轉編碼器A引腳上升沿時,采集的B不變且為0。 ScanResult = -1;//反轉 if((EC11_B_Last == EC11_B_Now)&&(EC11_B_Now == 1))//EC11旋轉編碼器A引腳上升沿時,采集的B不變且為1。 ScanResult = 1;//正轉 } EC11_A_Last = EC11_A_Now;//更新編碼器上一個狀態暫存變量 EC11_B_Last = EC11_B_Now;//更新編碼器上一個狀態暫存變量 return ScanResult;//返回值的取值,0:無動作,1:正轉;-1:反轉。 } }

 





 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM