編碼電位器驅動原理

脈衝電位器的工作原理

從外觀看,脈衝電位器與普通電位器一樣都是三個引腳,但在其內部與引腳12相連的是兩個長短不一的金屬靜片,與引腳3相連的是一週有1224個齒的金屬動片。當脈衝電位器旋轉時可出現四種狀態:即引腳3與引腳1相連,引腳3與引腳2及引腳1全相連;引腳3與引腳2相連,引腳3與引腳2及引腳1全斷開。

在實際使用中,一般將引腳3接地作爲數據輸入端。而引腳12作爲數據輸出端與單片機I/O 口相連。如圖2中所示,將引腳1與單片機的P1.0相連,引腳2與單片機的P1.1相連。當脈衝電位器左旋或右旋時,P1.0P1.1就會週期性地產生圖1所示的波形,如果是12點的脈衝電位器旋轉一圈就會產生12組這樣的波形,24點的脈衝電位器就會產生24組這樣的波形;一組波形(或一個週期)包含了4個工作狀態。因此只要檢測出P1.0P1.1的波形,就能識別脈衝電位器是否旋轉是左旋還是右旋。

 

脈衝電位器接口編程方法

1.脈衝電位器旋轉的識別

進一步分析右的波形並按時間軸展開可以看出,雖然脈衝電位器左旋和右旋的波形都相同。但左旋時,在第1狀態,腳1先比腳2變爲低電平;在第2狀態,腳2也變爲低電平;在第3狀態,腳1先比腳2變爲高電平;在第4狀態,腳2也變爲高電平;脈衝電位器右旋時,腳1和腳2輸出波形的變化規律正好與左旋相反。故可根據時間識別法(比較P1.0P1.1低電平出現和結束的時差)來識別脈衝電位器是左旋還是右旋。

在動態掃描中,因採樣頻率操作速度等因素的影響,實際上很難測出P1.0P1.1的波形;也很難測準P1.0P1.1低電平出現和結束的時差,只能快速地對P1.0P1.1電平採樣。對應圖1所示波形按時間軸展開,每當P1.0P1.1的組合電平依次爲01 00 10 11四種狀態碼組成一個字節即4BH 時,就表示左旋一位音量減1。而每當P1.0P1.1的組合電平依次爲10 00 01 11四種狀態碼組成一個字節即87H時;就表示右旋一位音量加1.這裏將“4BH”稱爲左旋一位的特徵碼,“87H”稱爲右旋一位的特徵碼。編程的任務就是要在脈衝電位器旋轉過程中識別出這兩種特徵碼,並以此爲依據,對音量進行增減控制。實際編程時可以用不同的方法識別出這兩種特徵碼。但我們在實踐中經過比較,用狀態(位置)採樣法實現編程是較爲理想的一種方法。這種方法對採樣頻率和操作速度沒有特別要求,也可不用定時器和中斷資源,只需在主程序裏面就能完成,而且具有編程簡單抗干擾能力強工作可靠的優點。

由於脈衝電位器在工作過程中有三種情形:一是沒有被旋轉而停留在某一狀態(位置);二是雖然被旋轉但沒有完成一個週期(4個狀態)而停留在某一狀態;三是不停地被旋轉而超過一個週期。狀態(位置)採樣法就是要準確地跟蹤識別和記錄脈衝電位器變化的每一個狀態值(包括位置值和它對應的特徵碼)。程序一開始就要識別出脈衝電位器所處的現態位置和其對應的特徵碼;隨後不斷跟蹤掃描記錄脈衝電位器的每一變化過程。顯然,脈衝電位器只有旋轉到第4個狀態纔有一個我們所需要的特徵碼出現,程序根據這個特徵碼的性質再對音量進行加減控制。
2.根據以上原理進行,我自己寫的代碼
進入代碼的時間片我約定的是1ms,也可以更快,Shuttle_Key_IO是採樣引腳1和引腳2
可以中斷,可以主程序輪訓,通過四個步驟
-引腳1和引腳2全是高電平,復位後,剛開始默認狀態
-當手動旋轉的時候,出現引腳1和引腳2高、低電平狀態
引腳1高引腳2低:表示左轉
引腳2低引腳1高:表示右轉
-當出現引腳1和引腳2全是低電平
表示當前旋轉狀態穩定
-引腳1和引腳2全是高電平,又恢復到復位狀態,準備新的採樣的到來


以下的代碼是通過四個步驟,最終採樣到一次旋鈕動作
switch(Shuttle_Key_IO)
 {
  case 0:
         switch( Shuttle_Key_buf)
{                 
 case 2:
    if((*Key_Data) > data3)
 (*Key_Data)--;
else
{
 (*Key_Data) = data4;
                  back_data=2;
 } 
                 break;    
          case 1:
    if((*Key_Data) < data1)
 (*Key_Data)++;
else
{
     (*Key_Data) = data2;
                  back_data=1;
 } 
                 break;
 default:break;
}
         Shuttle_Key_buf =0x0F;
         break;
  case 1: 
  case 2:
         if(Shuttle_Key_buf==0xFF)
          Shuttle_Key_buf = Shuttle_Key_IO;
         break;
  case 3:
         Shuttle_Key_buf =0xFF;break;
  default:break; 
 }

發佈了67 篇原創文章 · 獲贊 13 · 訪問量 37萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章