機械測量中旋轉(zhuǎn)編碼器與單片機的通用接口
在準備”Freescale”杯全國大學(xué)生智能車比賽中我們開始的時候是采用紅外傳感器來測量速度,但是它受環(huán)境的干擾很大,且響應(yīng)頻率很小,還達不到1K Hz,為了提高速度測量精度和響應(yīng)頻率,減小環(huán)境的干擾,決定采用了旋轉(zhuǎn)編碼器,我們成功地開發(fā)了單片機與旋轉(zhuǎn)編碼器的最簡硬件接口。
旋轉(zhuǎn)編碼器及其工作原理
旋轉(zhuǎn)編碼器是用來測量角度的裝置。它分為單路輸出和雙路輸出兩種。單路輸出是指旋轉(zhuǎn)編碼器的輸出是一組脈沖,而雙路輸出的旋轉(zhuǎn)編碼器輸出兩組相位差90度的脈沖,通過這兩組脈沖不僅可以測量轉(zhuǎn)速,還可以判斷旋轉(zhuǎn)的方向。
它將測量到的角度量轉(zhuǎn)換為數(shù)字脈沖信號輸出,用來檢測被檢對象的角位移、角速度、角加速度、線位移、線速度和線加速度等,因而,應(yīng)用十分廣泛。旋轉(zhuǎn)編碼器有絕對式和增量式兩種。絕對式所測量到的角位置是絕對位置;而增量式所測量的是轉(zhuǎn)動體角位移的累計量。
旋轉(zhuǎn)編碼器有一個中心有軸的光電碼盤,其上有環(huán)形通、暗的刻線,有光電發(fā)射和接收器件讀取,獲得四組正弦波信號組合成A、B、C、D,每個正弦波相差90度相位差(相對于一個周波為360度),將C、D信號反向,疊加在A、B兩相上,可增強穩(wěn)定信號;另每轉(zhuǎn)輸出一個Z相脈沖以代表零位參考位。
由于A、B兩相相差90度,可通過比較A相在前還是B相在前,以判別編碼器的正轉(zhuǎn)與反轉(zhuǎn),通過零位脈沖,可獲得編碼器的零位參考位。
信號輸出有正弦波(電流或電壓),方波(TTL、HTL),集電極開路(PNP、NPN),推拉式多種形式,其中TTL為長線差分驅(qū)動(對稱A,A-;B,B-;Z,Z-),HTL也稱推拉式、推挽式輸出,編碼器的信號接收設(shè)備接口應(yīng)與編碼器對應(yīng)。編碼器的脈沖信號一般連接計數(shù)器、PLC、計算機,PLC和計算機連接的模塊有低速模塊與高速模塊之分,開關(guān)頻率有低有高。如單相聯(lián)接,用于單方向計數(shù),單方向測速。B兩相聯(lián)接,用于正反向計數(shù)、判斷正反向和測速。 A、B、Z三相聯(lián)接,用于帶參考位修正的位置測量。A、A- 、B、B- 、Z、Z-連接,由于帶有對稱負信號的連接,電流對于電纜貢獻的電磁場為0,衰減最小,抗干擾最佳,可傳輸較遠的距離。
為方便用戶使用,旋轉(zhuǎn)編碼器信號有電壓、NPN、PNP、T、D多種輸出方式。不同輸出方式的抗電磁干擾的能力也不同。因而,可根據(jù)使用的具體要求選擇恰當輸出形式的旋轉(zhuǎn)編碼器。本設(shè)計采用旋轉(zhuǎn)編碼器的單相聯(lián)接輸出方波。
旋轉(zhuǎn)編碼器與單片機的接口
由于工程實踐和比賽的需要,我們研究開發(fā)了一種單片機與旋轉(zhuǎn)編碼器直接接口的方法。此方法就是直接將旋轉(zhuǎn)編碼器信號端與Freescale 的S12的單片機的輸入捕捉/輸出比較通道(IOC)極為簡潔,由此構(gòu)成的系統(tǒng)極為簡單而可靠性很高。旋轉(zhuǎn)編碼器A相輸出信號,故可使用單片機的IOC1(IOC0~IOC7任意一個都可以)與之相接。實際使用時,根據(jù)旋轉(zhuǎn)編碼器信號線的長度及電磁干擾的程度,可以在旋轉(zhuǎn)編碼器與單片機之間增加光電耦合器,或整形門電路,以抵抗干擾,調(diào)理旋轉(zhuǎn)編碼器的輸入信號。我們在使用中采用了電壓輸出形式的旋轉(zhuǎn)編碼器,而且信號線很短,接口電路見圖1。
圖1 旋轉(zhuǎn)編碼器與單片機的接口電路
圖1上拉電阻R是因為我們的編碼器是NPN型集電極開路的。在這個接口方式中,將旋轉(zhuǎn)編碼器的A相與單片機的IOC1/PT1引腳相連,輸出端需接1KΩ的上拉電阻,這個電阻是我們通過實驗得到的結(jié)果,其空載輸出脈沖頻率為0~10KHz。
實物圖見圖2,我們采用齒輪嚙合的原理將電機的齒輪和編碼器的齒輪嚙合,當電機旋轉(zhuǎn)帶動編碼器的旋轉(zhuǎn),編碼器就在接上拉電阻的信號線A上產(chǎn)生方波。
圖2 智能車上旋轉(zhuǎn)編碼器的安裝
接口程序[!--empirenews.page--]
上述接口方法是利用了S12單片機的ECT模塊的外部輸入捕捉/輸出比較工作方式。單片機也僅僅使用外部輸入捕捉的來處理旋轉(zhuǎn)編碼器數(shù)據(jù),只要將旋轉(zhuǎn)編碼器的A相(或B相)接至外部輸入捕捉口IOC1(IOC0~IOC7任意一個都可以),程序如下:
用PT1(IOC1)通道作為速度脈沖信號輸入,ECT模塊初始化步驟如下:
1)設(shè)置TIOS寄存器,設(shè)置PT1通道為輸入;
2)設(shè)置TCTL4寄存器,使得上升沿和下降沿(任何沿)均能得到捕捉;
3)設(shè)置ICOVW_NOVW寄存器,保護脈沖累加器的數(shù)據(jù);
4)置位ICPAR_PA1EN,使能脈沖累加器。設(shè)置此寄存器之后,脈沖累加器開始計數(shù);
5)通過讀取PACN1寄存器,即可以獲取當前的脈沖累加值。
初始化程序為:
void ECT_initial(void) //ECT初始化
{
DDRT_DDRT1=0; //置PT1(IOC1)腳為輸入
TIOS_IOS0=0;
TIOS_IOS1=0; //通道1為輸入捕捉
TCTL4=0b00001101; //通道1為任何沿捕捉
TSCR1_TEN=1; //計數(shù)器1使能
ICOVW_NOVW1 = 1; //保護
ICPAR_PA1EN = 1; //脈沖累加器使能
}
在每一控制周期開始時,MC9S12DG128讀取脈沖累加器中的數(shù)值(average[5]),然后與前5個控制周期的脈沖累加器值求和(all_speed)再求平均值,做為當前速度反饋值(speed)。程序流程圖如圖3所示。
圖3 直流電機測速流程圖
計數(shù)速度的測試
采用以下兩種方法對電機測速部分進行測試:
1)讓智能車在賽道上行駛,每20ms將賽車當前速度值通過SCI串口發(fā)送到上位機上,并利用串口調(diào)試器進行監(jiān)控。對正好在一圈當中賽車行駛的速度值進行累加求和,再乘以20ms,得到的總行駛距離約為27m,而模擬賽道總長約為26m,兩者的相對誤差不到4%。這說明,速度傳感器測量基本準確。
2)直流電機空載運行時,改變脈沖捕捉方式,在上升沿、下降沿和任何沿捕捉方式間進行切換。不改變驅(qū)動電機占空比設(shè)置,理想情況下,單位時間內(nèi)捕捉的脈沖數(shù)滿足:上升沿獲取下的脈沖數(shù)=下降沿獲取下的脈沖數(shù)=任何沿獲取下的脈沖數(shù)/2。在脈沖捕捉方式不變的情況下,改變PWM信號占空比(即改變速度給定值),檢測的速度值與占空比近似成線性比例關(guān)系。以上間接說明脈沖檢測的可靠性。