光電旋轉編碼器的原理及應用方法
近年來(lái),嵌入式技術(shù)發(fā)展迅速,嵌入式系統在各行各業(yè)得到了廣泛的應用。然而,由于嵌入式計算機的專(zhuān)用性,系統的硬件、軟件結構千差萬(wàn)別,其輸入設備也不再像通用計算機那樣單一。嵌入式計算機的輸入沒(méi)備一般有鼠標、鍵盤(pán)、觸摸屏、按鈕、旋鈕等,而光電編碼器(俗稱(chēng)“單鍵飛梭”)作為一種輸入設備,由于其具有輸入靈活,簡(jiǎn)單可靠等特點(diǎn),因此特別適合應用在嵌入式儀器和手持式設備上,整個(gè)系統可以只用一個(gè)鍵作為輸入。觸摸屏由于其方便靈活、節省空間、界面直觀(guān)等特點(diǎn)也備受青睞,但存在壽命短,長(cháng)時(shí)間使用容易產(chǎn)生誤差等缺點(diǎn)。如果用光電編碼器輔助觸摸屏作為輸入設備,必將大大增強系統的可靠性,使得人機接口更加人性化。但由于光電編碼器并不是WinCE的標準輸入設備,因此其驅動(dòng)程序在嵌入式操作系統Windows CE Platform Builder中并未給出。本文以三星公司S3C2410(ARM9芯片)為CPU的嵌入式系統開(kāi)發(fā)板為平臺,詳細闡述了嵌入式操作系統WinCE下光電編碼器驅動(dòng)程序的設計方法,以供同行參考。
1 光電編碼器的工作原理
光電編碼器(OptICal Encoder)俗稱(chēng)“單鍵飛梭”,其外觀(guān)好像一個(gè)電位器,因其外部有一個(gè)可以左右旋轉同時(shí)又可按下的旋鈕,很多設備(如顯示器、示波器等)用它作為人機交互接口。下面以美國Greyhill公司生產(chǎn)的光電編碼器為例,介紹其工作原理及使用方法。光電編碼器的內部電路如圖1所示,其內部有1個(gè)發(fā)光二極管和2個(gè)光敏三極管。當左右旋轉旋鈕時(shí),中間的遮光板會(huì )隨旋鈕一起轉動(dòng),光敏三極管就會(huì )被遮光板有次序地遮擋,A、B相就會(huì )輸出圖2所示的波形;當按下旋鈕時(shí),2、3兩腳接通,其用法同一般按鍵。

當順時(shí)針旋轉時(shí),光電編碼器的A相相位會(huì )比B相超前半個(gè)周期;反之,A相會(huì )比B相滯后半個(gè)周期。通過(guò)檢測A、B兩相的相位就可以判斷旋鈕是順時(shí)針還是逆時(shí)針旋轉,通過(guò)記錄A或B相變化的次數,就可以得出旋鈕旋轉的次數,通過(guò)檢測2、3腳是否接通就可以判斷旋鈕是否按下。其具體的鑒相規則如下:
A為上升沿,B=0時(shí),旋鈕右旋;
B為上升沿,A=l時(shí),旋鈕右旋;
A為下降沿,B=1時(shí),旋鈕右旋;
B為下降沿,A=O時(shí),旋鈕右旋;
B為上升沿,A=0時(shí),旋鈕左旋;
A為上升沿,B=1時(shí),旋鈕左旋;
B為下降沿,A=l時(shí),旋鈕左旋;
A為下降沿,B=0時(shí),旋鈕左旋。
通過(guò)上述方法,可以很簡(jiǎn)單地判斷旋鈕的旋轉方向。在判斷時(shí)添加適當的延時(shí)程序,以消除抖動(dòng)干擾。
2 WinCE提供的驅動(dòng)模型
WinCE操作系統支持兩種類(lèi)型的驅動(dòng)程序。一種為本地驅動(dòng)程序,是把設備驅動(dòng)程序作為獨立的任務(wù)實(shí)現的,直接在頂層任務(wù)中實(shí)現硬件操作,因此都有明確和專(zhuān)一的目的。本地設備驅動(dòng)程序適合于那些集成到Windows CE平臺的設備,諸如鍵盤(pán)、觸摸屏、音頻等設備。另一種是具有定制接口的流接口驅動(dòng)程序。它是一般類(lèi)型的設備驅動(dòng)程序。流接口驅動(dòng)程序的形式為用戶(hù)一級的動(dòng)態(tài)鏈接庫(DLL)文件,用來(lái)實(shí)現一組固定的函數稱(chēng)為“流接口函數”,這些流接口函數使得應用程序可以通過(guò)文件系統訪(fǎng)問(wèn)這些驅動(dòng)程序。本文討論的光電編碼器就屬于流接口設備。
2.1 流設備驅動(dòng)加載過(guò)程
WinCE.NET系統運行時(shí)會(huì )啟動(dòng)負責流驅動(dòng)的加載進(jìn)程DEVICE.exe。DEVICE.exe進(jìn)程對驅動(dòng)的加載是通過(guò)裝載注冊表列舉器(RegEnum.dll)實(shí)現的。在WinCE.NET中,所有設備的資源信息都由OAL負責記錄在系統注冊表中,RegEnum.dll一個(gè)一個(gè)掃描注冊表項HEKY_LOCAL_MACHINEDriverBuiltIn下的子鍵,發(fā)現新設備就根據每個(gè)表項的內容進(jìn)行硬件設備初始化。
2.2 中斷與中斷處理
如果一個(gè)驅動(dòng)程序要處理一個(gè)中斷,那么驅動(dòng)程序需要首先使用CreateEvent函數建立一個(gè)事件,調用InterruptInitialize函數將該事件與中斷標識綁定。然后驅動(dòng)程序中的IST就可以使用WaitForSing|eObject函數來(lái)等待中斷的發(fā)生。在一個(gè)硬件中斷發(fā)生之后,操作系統進(jìn)入異常處理程序,異常處理程序調用OAL的OEMInterruptHandler函數,該函數檢測硬件并將中斷標識返回給系統;系統得到該中斷標識便會(huì )找到該中斷標識對應的事件,并喚醒等待相應事件的線(xiàn)程(IST),然后IST進(jìn)行中斷處理。處理完成之后,IST需要調用InterruptDone函數來(lái)告訴操作系統中斷處理結束,操作系統再次調用OAL中的OEMInterruptDone函數,最后完成中斷的處理。圖3為WinCE.NET中斷處理的流程框圖。

51單片機相關(guān)文章:51單片機教程
評論