WinCE下光電編碼器的驅動程序設計
本文引用地址:http://www.eepw.com.cn/article/168291.htm近年來,嵌入式技術發展迅速,嵌入式系統在各行各業得到了廣泛的應用。然而,由於嵌入式計算機的專用性,系統的硬體、軟體結構千差萬別,其輸入設備也不再像通用計算機那樣單一。嵌入式計算機的輸入沒備一般有滑鼠、鍵盤、觸控螢幕、按鈕、旋鈕等,而光電編碼器(俗稱「單鍵飛梭」)作為一種輸入設備,由於其具有輸入靈活,簡單可靠等特點,因此特別適合應用在嵌入式儀器和手持式設備上,整個系統可以只用一個鍵作為輸入。觸控螢幕由於其方便靈活、節省空間、界面直觀等特點也備受青睞,但存在壽命短,長時間使用容易產生誤差等缺點。如果用光電編碼器輔助觸控螢幕作為輸入設備,必將大大增強系統的可靠性,使得人機接口更加人性化。但由於光電編碼器並不是WinCE的標準輸入設備,因此其驅動程序在嵌入式作業系統Windows CE Platform Builder中並未給出。本文以三星公司S3C2410(ARM9晶片)為CPU的嵌入式系統開發板為平臺,詳細闡述了嵌入式作業系統WinCE下光電編碼器驅動程序的設計方法,以供同行參考。
1 光電編碼器的工作原理
光電編碼器(OptICal Encoder)俗稱「單鍵飛梭」,其外觀好像一個電位器,因其外部有一個可以左右旋轉同時又可按下的旋鈕,很多設備(如顯示器、示波器等)用它作為人機互動接口。下面以美國Greyhill公司生產的光電編碼器為例,介紹其工作原理及使用方法。光電編碼器的內部電路如圖1所示,其內部有1個發光二極體和2個光敏三極體。當左右旋轉旋鈕時,中間的遮光板會隨旋鈕一起轉動,光敏三極體就會被遮光板有次序地遮擋,A、B相就會輸出圖2所示的波形;當按下旋鈕時,2、3兩腳接通,其用法同一般按鍵。
當順時針旋轉時,光電編碼器的A相相位會比B相超前半個周期;反之,A相會比B相滯後半個周期。通過檢測A、B兩相的相位就可以判斷旋鈕是順時針還是逆時針旋轉,通過記錄A或B相變化的次數,就可以得出旋鈕旋轉的次數,通過檢測2、3腳是否接通就可以判斷旋鈕是否按下。其具體的鑑相規則如下:
A為上升沿,B=0時,旋鈕右旋;
B為上升沿,A=l時,旋鈕右旋;
A為下降沿,B=1時,旋鈕右旋;
B為下降沿,A=O時,旋鈕右旋;
B為上升沿,A=0時,旋鈕左旋;
A為上升沿,B=1時,旋鈕左旋;
B為下降沿,A=l時,旋鈕左旋;
A為下降沿,B=0時,旋鈕左旋。
通過上述方法,可以很簡單地判斷旋鈕的旋轉方向。在判斷時添加適當的延時程序,以消除抖動幹擾。
2 WinCE提供的驅動模型
WinCE作業系統支持兩種類型的驅動程序。一種為本地驅動程序,是把設備驅動程序作為獨立的任務實現的,直接在頂層任務中實現硬體操作,因此都有明確和專一的目的。本地設備驅動程序適合於那些集成到Windows CE平臺的設備,諸如鍵盤、觸控螢幕、音頻等設備。另一種是具有定製接口的流接口驅動程序。它是一般類型的設備驅動程序。流接口驅動程序的形式為用戶一級的動態連結庫(DLL)文件,用來實現一組固定的函數稱為「流接口函數」,這些流接口函數使得應用程序可以通過文件系統訪問這些驅動程序。本文討論的光電編碼器就屬於流接口設備。
2.1 流設備驅動加載過程
WinCE.NET系統運行時會啟動負責流驅動的加載進程DEVICE.exe。DEVICE.exe進程對驅動的加載是通過裝載註冊表列舉器(RegEnum.dll)實現的。在WinCE.NET中,所有設備的資源信息都由OAL負責記錄在系統註冊表中,RegEnum.dll一個一個掃描註冊表項HEKY_LOCAL_MACHINEDriverBuiltIn下的子鍵,發現新設備就根據每個表項的內容進行硬體設備初始化。
2.2 中斷與中斷處理
如果一個驅動程序要處理一個中斷,那麼驅動程序需要首先使用CreateEvent函數建立一個事件,調用InterruptInitialize函數將該事件與中斷標識綁定。然後驅動程序中的IST就可以使用WaitForSing|eObject函數來等待中斷的發生。在一個硬體中斷發生之後,作業系統進入異常處理程序,異常處理程序調用OAL的OEMInterruptHandler函數,該函數檢測硬體並將中斷標識返回給系統;系統得到該中斷標識便會找到該中斷標識對應的事件,並喚醒等待相應事件的線程(IST),然後IST進行中斷處理。處理完成之後,IST需要調用InterruptDone函數來告訴作業系統中斷處理結束,作業系統再次調用OAL中的OEMInterruptDone函數,最後完成中斷的處理。圖3為WinCE.NET中斷處理的流程框圖。
51單片機相關文章:51單片機教程