王平安
(中石化西南石油工程有限公司油田工程服務(wù)分公司,四川 綿陽621000)
旋轉(zhuǎn)編碼開關(guān)又稱旋轉(zhuǎn)編碼器、數(shù)碼電位器等,在電子產(chǎn)品中經(jīng)常使用。該器件具有360°旋轉(zhuǎn)、調(diào)節(jié)范圍廣、調(diào)節(jié)速度可變、可控制、噪音小、壽命長的優(yōu)點[1],功能在一定程度上類似于電位器,但其結(jié)構(gòu)、工作原理和使用方法與普通電位器完全不同[2],在數(shù)字電路中的應(yīng)用有很多,如改變音量的大小,電機(jī)的轉(zhuǎn)速等。
在單片機(jī)電路中,通過旋轉(zhuǎn)編碼開關(guān)來實現(xiàn)相應(yīng)參數(shù)的改變使用起來非常的方便和簡單,可有效的改變或調(diào)節(jié)單片機(jī)的內(nèi)部參數(shù)及對外輸出參數(shù)等。旋轉(zhuǎn)編碼開關(guān)由于在使用過程中,其方向信號的識別和脈沖計數(shù)的增加和減少是整個設(shè)計應(yīng)用中的難點,筆者采用中斷方式、硬件自動處理、IO端口等3種方式介紹旋轉(zhuǎn)編碼開關(guān)在單片機(jī)中的具體應(yīng)用實現(xiàn)。
旋轉(zhuǎn)編碼開關(guān)是一種可用于取代模擬電位器的器件,常用的旋轉(zhuǎn)編碼開關(guān)旋轉(zhuǎn)一周輸出20個脈沖,每個脈沖代表編碼開關(guān)旋轉(zhuǎn)了一定的角度[3]。旋轉(zhuǎn)編碼開關(guān)有3個和5個引腳的,5腳的比3腳的僅多2個按鍵引腳,另外3個引腳的功能與只有3個引腳的旋轉(zhuǎn)編碼開關(guān)功能相同,分別實現(xiàn)旋轉(zhuǎn)時輸出脈沖,在對編碼器進(jìn)行左旋和右旋時,其輸出波形如圖1(a)和圖1(b)所示。
旋轉(zhuǎn)編碼開關(guān)旋轉(zhuǎn)一周分別輸出固定數(shù)目的脈沖數(shù),通過對其波形的識別,可識別出編碼開關(guān)是左旋還是右旋,從而實現(xiàn)其輸入數(shù)值的增加及減少,以實現(xiàn)其在單片機(jī)中的調(diào)節(jié)功能。
圖1 旋轉(zhuǎn)編碼器旋轉(zhuǎn)方向及旋轉(zhuǎn)脈沖數(shù)的識別
左轉(zhuǎn)和右轉(zhuǎn)的信號判別是難點,從圖1分析編碼開關(guān)左旋和右旋的波形可知,當(dāng)AC相超前BC相,轉(zhuǎn)動方向為右轉(zhuǎn);當(dāng)BC相超前AC相,則為左轉(zhuǎn)。在左旋時,BC波形的相位滯后于AC相位一定角度,當(dāng)AC波形上升沿時,BC波形為低電平;在右旋時,BC波形超前于AC波形相位一定角度,當(dāng)AC波形為上升沿時,BC波形的電平為高電平。
波形如圖1所示,AC信號超前BC信號一個時間Δt,該時間隨旋轉(zhuǎn)的快慢而不同,通過檢測AC信號上升時BC信號的電平值的高低,便能識別出其旋轉(zhuǎn)方向。在AC信號上升時,BC信號為ON,此時旋轉(zhuǎn)編碼開關(guān)右旋轉(zhuǎn);AC信號上升時BC的信號為OFF,此時旋轉(zhuǎn)編碼開關(guān)左旋轉(zhuǎn);因此,只需要在AC信號上升沿的瞬間,判斷BC信號的高低狀態(tài),便可實現(xiàn)旋轉(zhuǎn)編碼器的方向識別,通過對AC信號的脈沖數(shù)根據(jù)旋轉(zhuǎn)方向來實現(xiàn)加減計數(shù),便能實現(xiàn)旋轉(zhuǎn)編碼開關(guān)信號值的輸入。
在使用編程時,只需要判斷當(dāng)輸出AC為跳變?yōu)楦唠娖綍r,輸出BC當(dāng)時的電平狀態(tài)就可以判斷出是左旋還是右旋,對于查詢方式,無法直接獲取AC或BC的電平跳變狀態(tài),則通過定時查詢AC和BC的狀態(tài),便能實時對旋轉(zhuǎn)編碼開關(guān)的方向識別。由于對其方向的識別和脈沖信號的處理是應(yīng)用中的主要技術(shù)難點,下面介紹旋轉(zhuǎn)編碼開關(guān)在宏晶STC51單片機(jī)上的幾種較為典型的硬件接口及軟件識別及處理方法。
STC51單片機(jī)的計數(shù)器T2本身只有自動遞增或遞減的功能,利用T2的該功能,便能自動實現(xiàn)對旋轉(zhuǎn)編碼開關(guān)的方向和脈沖的計數(shù),通過簡單的程序便能實現(xiàn)旋轉(zhuǎn)編碼開關(guān)的正轉(zhuǎn)或反轉(zhuǎn)的計數(shù)和方向識別。
編碼開關(guān)信號的捕獲,通過采用計數(shù)器功能來實現(xiàn)。筆者采用STC89C54 RD單片機(jī)計數(shù)器T2來實現(xiàn)。STC單片機(jī)的計數(shù)器T2有3種工作模式:捕獲、自動重新裝載(遞增或遞減計數(shù))和波特率發(fā)生器,編碼開關(guān)的信號處理采用的是自動裝載模式,通過遞增計數(shù)和遞減計數(shù)實現(xiàn)旋轉(zhuǎn)編碼開關(guān)正反向計數(shù)。定時器的自動重裝模式如圖2所示。
圖2 定時器自動重裝模式(DCEN=1)
圖3 采用T2讀取旋轉(zhuǎn)編碼開關(guān)的硬件電路
該種方式中未采用計數(shù)器T2中斷方式,主要是由于要計數(shù)器T2產(chǎn)生中斷,需要每次中斷后改變RCAP2 H、RCAP2L中的值和TH2、TL2中的值,使得產(chǎn)生中斷的程序變得較復(fù)雜。通過T2的自動遞增和遞減計數(shù)來實現(xiàn),T2將不會產(chǎn)生中斷,在軟件中通過讀取TH2和TL2的值,便能自動讀取出旋轉(zhuǎn)編碼開關(guān)的調(diào)節(jié)值,使程序變得更為簡單。
利用宏晶51單片機(jī)的T2的自動重裝功能,很好的解決旋轉(zhuǎn)編碼器的轉(zhuǎn)向及計數(shù)的識別,單片機(jī)的P1.0腳是T2的計數(shù)輸入端口,P1.1是T2的方向輸入端口,如圖3所示,W1為旋轉(zhuǎn)編碼器的3個引腳,中間是公共端C腳,上端為A腳,下端為B腳,旋轉(zhuǎn)時AC、BC信號如圖1(a)和圖1(b)所示,將AC信號輸入到單片機(jī)的P1.0腳,BC信號輸入到單片機(jī)的P1.1腳。該電路中,R1和R2是輸入的上拉電阻,阻值選擇為10kΩ便可以,C1和C2為濾波電容,選擇為0.1μF,可以消除A,B信號的抖動,經(jīng)過實踐證明,該電路可保證編碼開關(guān)的正常工作。
由于程序中未能使用T2中斷,程序只需要初始化T2的工作方式和對TH2、TL2賦值便完成初始化,在主程序中,并沒使用中斷函數(shù),而是直接通過對T H2、TL2進(jìn)行訪問,僅對TL2進(jìn)行了數(shù)據(jù)處理。在該種方式中,TL2相當(dāng)于一個寄存器使用,通過訪問TL2便能實現(xiàn)對旋轉(zhuǎn)編碼開關(guān)的數(shù)據(jù)輸入。主要實現(xiàn)程序如下:
由于單片機(jī)外部中斷可以實現(xiàn)脈沖邊沿信號和電平觸發(fā)信號2種中斷功能,可以很方便捕獲旋轉(zhuǎn)編碼開關(guān)輸入信號電平的變化,能夠及時處理脈沖信號跳變時的方向信號,從而識別旋轉(zhuǎn)編碼開關(guān)的旋轉(zhuǎn)方向。該電路中采用了單片機(jī)的INT0及一個IO腳來實現(xiàn)對旋轉(zhuǎn)編碼開關(guān)的另一信號的識別,如果中斷輸入信號AC變化時,根據(jù)BC電平信號的高低便能判別旋轉(zhuǎn)編碼開關(guān)的左旋和右旋,并對中斷信號AC的值作增加或減少處理,實現(xiàn)編碼開關(guān)數(shù)值的處理。
INT0是單片機(jī)的中斷電路,利用該端口將在編碼開關(guān)轉(zhuǎn)動時,會產(chǎn)生中斷,由中斷程序來實現(xiàn)旋轉(zhuǎn)編碼開關(guān)輸入量的識別,其電路如圖4所示,P3.2為MCS51單片機(jī)的INT0中斷端口,P1.2為普通IO端口。
圖4 采用INT0中斷方式讀取編碼開關(guān)的硬件電路圖
INT0作編碼開關(guān)輸入時,采用中斷方式,在編寫程序時,需要對INT0進(jìn)行中斷和初始化,在INT0產(chǎn)生中斷后,其轉(zhuǎn)向由中斷程序進(jìn)行處理,該方式中,如果編碼開關(guān)沒有轉(zhuǎn)動,中斷程序?qū)⒉粫?zhí)行,可提高單片機(jī)處理其他任務(wù)的能力,通過占用1個中斷IO端口和普通IO端口便可實現(xiàn)其信息的輸入。通過中斷方式讀取的初始化實現(xiàn)程序如下:
上述編碼開關(guān)輸入方法中,要占用計數(shù)器T2、中斷INT0等IO端口,由于單片機(jī)的計數(shù)器、中斷端口的數(shù)量有限,被輸入編碼開關(guān)占用后,有可能造成單片機(jī)該類輸入端口數(shù)量不夠,通過普通IO端口實現(xiàn)旋轉(zhuǎn)編碼開關(guān)數(shù)據(jù)輸入能夠有效解決由于單片機(jī)中斷資源不足的情況。
該方式可采用普通的IO端口作為編碼開關(guān)的A、B輸入,電路硬件圖參考圖2所示,假設(shè)P1.2仍為編碼開關(guān)的BC端輸入,P3.2為AC端輸入,程序中不使用中斷方式,把P3.2作為普通IO端口方式,其他硬件原理同上面介紹的功能相同。
圖5 IO口處理編碼開關(guān)的流程圖
在該種方式下,由于P3.2作為普通的IO端口,普通IO端口只能采用查詢方式訪問,軟件中只能采用查詢來進(jìn)行訪問,如果直接采用查詢程序,必將耗費(fèi)大量的單片機(jī)運(yùn)算周期,降低其運(yùn)行速度。通過定時查詢方式,便可有效降低程序查詢開銷,提高系統(tǒng)效率。定時查詢使用定時器產(chǎn)生定時中斷,定時查詢編碼開關(guān)AC和BC的輸入狀態(tài),從而完成對編碼開關(guān)的輸入脈沖及旋轉(zhuǎn)方向的處理。數(shù)碼電位器的采樣頻率不能太低,否則會限制旋轉(zhuǎn)編碼開關(guān)的旋轉(zhuǎn)速度[4],取的時間掃描周期為1 ms,圖5是時鐘主頻為12 MHz的程序流程圖。
對于旋轉(zhuǎn)編碼開關(guān)在單片機(jī)的應(yīng)用中介紹了3種常用方法,根據(jù)單片機(jī)的資源使用情況,可根據(jù)設(shè)計中的實際情況采用不同的方法來實現(xiàn)旋轉(zhuǎn)編碼開關(guān)的輸入。通過采用旋轉(zhuǎn)編碼開關(guān)實現(xiàn)控制參數(shù)的變化比采用傳統(tǒng)按鈕方式更加方便直觀。由于其硬件簡單,編程也容易實現(xiàn),且它的軟、硬件可移植性強(qiáng)[5],可適用于不同的單片機(jī)電路中。
[1]楊紹洲,王勝軍,陳宏文 .數(shù)碼電位器在醫(yī)學(xué)儀器的應(yīng)用和編程[J].中國醫(yī)療器械雜志,2002,26(6):447-448.
[2]陳國杰 .數(shù)碼電位器的單片機(jī)接口方法及其編程[J].計算機(jī)應(yīng)用,2000(4):38-40.
[3]王子博 .編碼器四倍頻電路的單片機(jī)高速算法設(shè)計[J].控制與檢測,2007(11):73-74,78.
[4]陳國杰 .數(shù)碼電位器的單片機(jī)接口方法及其編程[J].電子技術(shù),2000(4):38-40.
[5]方煒,任一峰 .絕對值型編碼器數(shù)據(jù)采集設(shè)計[J].中北大學(xué)學(xué)報(自然科學(xué)版),2007,28(z1):60-62.