1 光電編碼器的工作原理
光電編碼器(Optical Encoder)俗稱“單鍵飛梭”,其外觀好像一個電位器,因其外部有一個可以左右旋轉同時又可按下的旋鈕,很多設備(如顯示器、示波器等)用它作為人機交互接口。下面以美國Greyhill公司生產的光電編碼器為例,介紹其工作原理及使用方法。光電編碼器的內部電路如圖1所示,其內部有1個發(fā)光二極管和2個光敏三極管。當左右旋轉旋鈕時,中間的遮光板會隨旋鈕一起轉動,光敏三極管就會被遮光板有次序地遮擋,A、B相就會輸出圖2所示的波形;當按下旋鈕時,2、3兩腳接通,其用法同一般按鍵。
當順時針旋轉時,光電編碼器的A相相位會比B相超前半個周期;反之,A相會比B相滯后半個周期。通過檢測A、B兩相的相位就可以判斷旋鈕是順時針還是逆時針旋轉,通過記錄A或B相變化的次數(shù),就可以得出旋鈕旋轉的次數(shù),通過檢測2、3腳是否接通就可以判斷旋鈕是否按下。其具體的鑒相規(guī)則如下:
1.??????? A為上升沿,B=0時,旋鈕右旋;
2.??????? B為上升沿,A=l時,旋鈕右旋;
3.??????? A為下降沿,B=1時,旋鈕右旋;
4.??????? B為下降沿,A=O時,旋鈕右旋;
5.??????? B為上升沿,A=0時,旋鈕左旋;
6.??????? A為上升沿,B=1時,旋鈕左旋;
7.??????? B為下降沿,A=l時,旋鈕左旋;
8.??????? A為下降沿,B=0時,旋鈕左旋。
通過上述方法,可以很簡單地判斷旋鈕的旋轉方向。在判斷時添加適當?shù)难訒r程序,以消除抖動干擾。
2 WinCE提供的驅動模型
WinCE操作系統(tǒng)支持兩種類型的驅動程序。一種為本地驅動程序,是把設備驅動程序作為獨立的任務實現(xiàn)的,直接在頂層任務中實現(xiàn)硬件操作,因此都有明確和專一的目的。本地設備驅動程序適合于那些集成到Windows CE平臺的設備,諸如鍵盤、觸摸屏、音頻等設備。另一種是具有定制接口的流接口驅動程序。它是一般類型的設備驅動程序。流接口驅動程序的形式為用戶一級的動態(tài)鏈接庫(DLL)文件,用來實現(xiàn)一組固定的函數(shù)稱為“流接口函數(shù)”,這些流接口函數(shù)使得應用程序可以通過文件系統(tǒng)訪問這些驅動程序。本文討論的光電編碼器就屬于流接口設備。
2.1 流設備驅動加載過程
WinCE.NET系統(tǒng)運行時會啟動負責流驅動的加載進程DEVICE.exe。DEVICE.exe進程對驅動的加載是通過裝載注冊表列舉器(RegEnum.dll)實現(xiàn)的。在WinCE.NET中,所有設備的資源信息都由OAL負責記錄在系統(tǒng)注冊表中,RegEnum.dll一個一個掃描注冊表項HEKY_LOCAL_MACHINE\Driver\BuiltIn下的子鍵,發(fā)現(xiàn)新設備就根據(jù)每個表項的內容進行硬件設備初始化。
2.2 中斷與中斷處理
如果一個驅動程序要處理一個中斷,那么驅動程序需要首先使用CreateEvent函數(shù)建立一個事件,調用InterruptInitialize函數(shù)將該事件與中斷標識綁定。然后驅動程序中的IST就可以使用WaitForSing|eObject函數(shù)來等待中斷的發(fā)生。在一個硬件中斷發(fā)生之后,操作系統(tǒng)進入異常處理程序,異常處理程序調用OAL的OEMInterruptHandler函數(shù),該函數(shù)檢測硬件并將中斷標識返回給系統(tǒng);系統(tǒng)得到該中斷標識便會找到該中斷標識對應的事件,并喚醒等待相應事件的線程(IST),然后IST進行中斷處理。處理完成之后,IST需要調用InterruptDone函數(shù)來告訴操作系統(tǒng)中斷處理結束,操作系統(tǒng)再次調用OAL中的OEMInterruptDone函數(shù),最后完成中斷的處理。圖3為WinCE.NET中斷處理的流程框圖。
3 光電編碼器驅動程序的設計
3.1 光電編碼器與S3C2410的硬件接口
光電編碼器與S3C24lO的接口電路如圖4所示。光電編碼器的A、B相為集電極開路輸出,由于S3C2410的I/O口電平為3.3 V,所以將其通過電阻上拉到3.3V后再分別接到CPU的EINT0和EINT1上;將Pl直接接到3.3V,P2通過電阻下拉到GND。當旋鈕按下時,P2口輸出為高電平,否則輸出為低電平。
工作狀態(tài)下,將EINTO、EINTl配置成上升沿和下降沿均觸發(fā)的外部中斷,將EINT2配置成上升沿觸發(fā)的中斷,旋鈕按下時EINT2引腳產生上升沿觸發(fā)中斷。
3.2 外部中斷初始化及中斷服務程序的編寫
首先必須完成CPU的I/O口和中斷的初始化工作,然后再編寫中斷處理程序。具體分為4個步驟:
1.??????? 初始化I/O口。在Port_Init()函數(shù)中,將EINT0和EINTl初始化為上升沿和下降沿均觸發(fā)的中斷。將EINT2初始化為上升沿觸發(fā)的中斷。
2.??????? 添加中斷號。在oalint.h下添加光電編碼器中斷向量的宏定義。代碼為#define SYSINTR_OED(SYSINTR_FIRMWARE+20)
3.??????? 添加中斷的初始化、禁止、復位等函數(shù),分別在OEMInterruptEnable()、OEMInterruptDisable()、OEM-InterruptDone()等函數(shù)中加入相關代碼。
4.??????? 返同中斷標識,由OEMInterruptHandler()函數(shù)返回中斷標識(SYSINTR_OED)。
3.3 編寫流接口驅動程序
Windows CE.net把中斷處理分成兩個部分:中斷服務程序(ISR)和中斷服務線程(IST)。TSR通常要求越短、越快越好,它的唯一任務就是返回中斷標識。正由于ISR很小,只能做少量的處理,因此中斷處理器就調用IST執(zhí)行大多數(shù)的中斷處理。中斷服務線程(IST)在從waitForSingleObject()函數(shù)得到中斷已經發(fā)生的信號前一直保持空閑;當接收到中斷信號后,它就在本機設備驅動程序的PDD層調用子程序,這些程序反過來訪問硬件以獲得硬件的狀態(tài)。IST使用InterruptInitialize()函數(shù)來注冊自己,然后使用WaitForSingleObject()函數(shù)等待中斷信號。如果這時中斷信號到來,則應將光電編碼器的狀態(tài)記錄下來,保存在變量OED_Status中。OED_Status=1表示旋鈕按下,OED_Status=2表示旋鈕逆時針旋轉,OED_Status=3表示旋鈕順時針旋轉。
這里還有一種比較簡單的鑒相規(guī)則,具體步驟是,當創(chuàng)建線程時讀出EINTl的電平狀態(tài)并保存在變量PreEINTl中,每次中斷到來時首先判斷EINT2是否為高電平。如果為高電平,則說明按鈕按下;如果EINT2為低電平,則判斷EINTO電平是否與PreEINTl相同。如果相同,則說明旋鈕逆時針旋轉;反之,旋鈕順時針旋轉,判斷的流程如圖5所示。
Windows CE流接口驅動程序模型要求驅動程序開發(fā)者編寫10個接口函數(shù),針對光電編碼器的驅動主要應完成設備初始化和數(shù)據(jù)讀取2個函數(shù)的編寫。WindowsCE設備文件名前綴由3個大寫字母組成,操作系統(tǒng)使用這3個字母來識別與流接口驅動程序相對應的設備。這里定義設備文件名前綴為“OED”(Optical Encoder),其中設備初始化函數(shù)OED_Init()在Windows CE裝載驅動程序時用于創(chuàng)建中斷事件和中斷服務線程。在函數(shù)OED_Read()中將光電編碼器的狀態(tài)(OED_Status)返回。
3.4 封裝驅動程序并加入到WinCE中
根據(jù)上述方法編譯出動態(tài)鏈接庫(DLL)還不夠,因為它的接口函數(shù)還沒有導出,還需要告訴鏈接程序輸出什么樣的函數(shù),因此必須建立一個后綴名為def的文件。在本設計中為OpticalEnccder.def。下面是此文件的內容:
一個具體的流接口驅動程序和注冊表是密不可分的。向WinCE內核添加注冊表項的方法有兩種:一種是直接修改Platform Builder下的reg文件;另一種是自己編寫一個注冊表文件,通過添加組件的方法將動態(tài)鏈接庫文件添加到內核中。這里用第2種方法,將OpticalEncoder.dll添加到內核中。編寫的注冊表文件內容如下:
最后編寫一個CEC文件,完成對定制內核注冊表部分的修改并將OpticalEncoder.dll添加到系統(tǒng)內核中去,然后在Platform Builder中就可以直接添加已經編寫好的驅動程序了。
光電編碼器的應用
1、角度測量
? 汽車駕駛模擬器,對方向盤旋轉角度的測量選用光電編碼器作為傳感器。重力測量儀,采用光電編碼器,把他的轉軸與重力測量儀中補償旋鈕軸相連,扭轉角度儀,利用編碼器測量扭轉角度變化,如扭轉實驗機、漁竿扭轉釣性測試等。
?? 擺錘沖擊實驗機,利用編碼器計算沖擊是擺角變化。
2、長度測量
計米器,利用滾輪周長來測量物體的長度和距離。
拉線位移傳感器,利用收卷輪周長計量物體長度距離。
聯(lián)軸直測,與驅動直線位移的動力裝置的主軸聯(lián)軸,通過輸出脈沖數(shù)計量。
介質檢測,在直齒條、轉動鏈條的鏈輪、同步帶輪等來傳遞直線位移信息。
3、速度測量
線速度,通過跟儀表連接,測量生產線的線速度
角速度,通過編碼器測量電機、轉軸等的速度測量
4、位置測量
機床方面,記憶機床各個坐標點的坐標位置,如鉆床等
自動化控制方面,控制在牧歌位置進行指定動作。如電梯、提升機等
5、同步控制
通過角速度或線速度,對傳動環(huán)節(jié)進行同步控制,以達到張力控制
結語
本文主要介紹了光電旋轉編碼器的原理及應用方法,并詳細介紹了WinCE驅動程序的結構,成功地開發(fā)出了光電編碼器在嵌入式操作系統(tǒng)WinCE下的驅動程序。實驗證明,該方法正確可行,程序運行穩(wěn)定可靠.
光電編碼器的應用電路
1、 EPC-755A光電編碼器的應用
EPC-755A光電編碼器具備良好的使用性能,在角度測量、位移測量時抗干擾能力很強,并具有穩(wěn)定可靠的輸出脈沖信號,且該脈沖信號經計數(shù)后可得到被測量的數(shù)字信號。因此,我們在研制汽車駕駛模擬器時,對方向盤旋轉角度的測量選用EPC-755A光電編碼器作為傳感器,其輸出電路選用集電極開路型,輸出分辨率選用360個脈沖/圈,考慮到汽車方向盤轉動是雙向的,既可順時針旋轉,也可逆時針旋轉,需要對編碼器的輸出信號鑒相后才能計數(shù)。圖2給出了光電編碼器實際使用的鑒相與雙向計數(shù)電路,鑒相電路用1個D觸發(fā)器和2個與非門組成,計數(shù)電路用3片74LS193組成。
當光電編碼器順時針旋轉時,通道A輸出波形超前通道B輸出波形90°,D觸發(fā)器輸出Q(波形W1)為高電平,Q(波形W2)為低電平,上面與非門打開,計數(shù)脈沖通過(波形W3),送至雙向計數(shù)器74LS193的加脈沖輸入端CU,進行加法計數(shù);此時,下面與非門關閉,其輸出為高電平(波形W4)。當光電編碼器逆時針旋轉時,通道A輸出波形比通道B輸出波形延遲90°,D觸發(fā)器輸出Q(波形W1)為低電平,Q(波形W2)為高電平,上面與非門關閉,其輸出為高電平(波形W3);此時,下面與非門打開,計數(shù)脈沖通過(波形W4),送至雙向計數(shù)器74LS193的減脈沖輸入端CD,進行減法計數(shù)。
汽車方向盤順時針和逆時針旋轉時,其最大旋轉角度均為兩圈半,選用分辨率為360個脈沖/圈的編碼器,其最大輸出脈沖數(shù)為900個;實際使用的計數(shù)電路用3片74LS193組成,在系統(tǒng)上電初始化時,先對其進行復位(CLR信號),再將其初值設為800H,即2048(LD信號);如此,當方向盤順時針旋轉時,計數(shù)電路的輸出范圍為2048~2948,當方向盤逆時針旋轉時,計數(shù)電路的輸出范圍為2048~1148;計數(shù)電路的數(shù)據(jù)輸出D0~D11送至數(shù)據(jù)處理電路。
實際使用時,方向盤頻繁地進行順時針和逆時針轉動,由于存在量化誤差,工作較長一段時間后,方向盤回中時計數(shù)電路輸出可能不是2048,而是有幾個字的偏差;為解決這一問題,我們增加了一個方向盤回中檢測電路,系統(tǒng)工作后,數(shù)據(jù)處理電路在模擬器處于非操作狀態(tài)時,系統(tǒng)檢測回中檢測電路,若方向盤處于回中狀態(tài),而計數(shù)電路的數(shù)據(jù)輸出不是2048,可對計數(shù)電路進行復位,并重新設置初值。
2.2 光電編碼器在重力測量儀中的應用
采用旋轉式光電編碼器,把它的轉軸與重力測量儀中補償旋鈕軸相連。重力測量儀中補償旋鈕的角位移量轉化為某種電信號量;旋轉式光電編碼器分兩種,絕對編碼器和增量編碼器。
增量編碼器是以脈沖形式輸出的傳感器,其碼盤比絕對編碼器碼盤要簡單得多且分辨率更高。一般只需要三條碼道,這里的碼道實際上已不具有絕對編碼器碼道的意義,而是產生計數(shù)脈沖。它的碼盤的外道和中間道有數(shù)目相同均勻分布的透光和不透光的扇形區(qū)(光柵),但是兩道扇區(qū)相互錯開半個區(qū)。當碼盤轉動時,它的輸出信號是相位差為90°的A相和B相脈沖信號以及只有一條透光狹縫的第三碼道所產生的脈沖信號(它作為碼盤的基準位置,給計數(shù)系統(tǒng)提供一個初始的零位信號)。從A,B兩個輸出信號的相位關系(超前或滯后)可判斷旋轉的方向。由圖3(a)可見,當碼盤正轉時,A道脈沖波形比B道超前π/2,而反轉時,A道脈沖比B道滯后π/2。圖3(b)是一實際電路,用A道整形波的下沿觸發(fā)單穩(wěn)態(tài)產生的正脈沖與B道整形波相‘與’,當碼盤正轉時只有正向口脈沖輸出,反之,只有逆向口脈沖輸出。因此,增量編碼器是根據(jù)輸出脈沖源和脈沖計數(shù)來確定碼盤的轉動方向和相對角位移量。通常,若編碼器有N個(碼道)輸出信號,其相位差為π/ N,可計數(shù)脈沖為2N倍光柵數(shù),現(xiàn)在N=2。圖3電路的缺點是有時會產生誤記脈沖造成誤差,這種情況出現(xiàn)在當某一道信號處于‘高’或‘低’電平狀態(tài),而另一道信號正處于‘高’和 ‘低’之間的往返變化狀態(tài),此時碼盤雖然未產生位移,但是會產生單方向的輸出脈沖。例如,碼盤發(fā)生抖動或手動對準位置時(下面可以看到,在重力儀測量時就會有這種情況)。
圖4是一個既能防止誤脈沖又能提高分辨率的四倍頻細分電路。在這里,采用了有記憶功能的D型觸發(fā)器和時鐘發(fā)生電路。由圖4可見,每一道有兩個D觸發(fā)器串接,這樣,在時鐘脈沖的間隔中,兩個Q端(如對應B道的74LS175的第2、7引腳)保持前兩個時鐘期的輸入狀態(tài),若兩者相同,則表示時鐘間隔中無變化;否則,可以根據(jù)兩者關系判斷出它的變化方向,從而產生‘正向’或‘反向’輸出脈沖。當某道由于振動在‘高’、‘低’間往復變化時,將交替產生‘正向’和‘反向’脈沖,這在對兩個計數(shù)器取代數(shù)和時就可消除它們的影響(下面儀器的讀數(shù)也將涉及這點)。由此可見,時鐘發(fā)生器的頻率應大于振動頻率的可能最大值。由圖4還可看出,在原一個脈沖信號的周期內,得到了四個計數(shù)脈沖。例如,原每圈脈沖數(shù)為1000的編碼器可產生4倍頻的脈沖數(shù)是4000個,其分辨率為0.09°。實際上,目前這類傳感器產品都將光敏元件輸出信號的放大整形等電路與傳感檢測元件封裝在一起,所以只要加上細分與計數(shù)電路就可以組成一個角位移測量系統(tǒng)(74159是4-16譯碼器)。