WinCE下光電編碼器的驅動程序設計
發(fā)布時間:2008/8/20 0:00:00 訪問次數(shù):473
引言
近年來,嵌入式技術發(fā)展迅速,嵌入式系統(tǒng)在各行各業(yè)得到了廣泛的應用。然而,由于嵌入式計算機的專用性,系統(tǒng)的硬件、軟件結構千差萬別,其輸入設備也不再像通用計算機那樣單一。
嵌入式計算機的輸入設備一般有鼠標、鍵盤、觸摸屏、按鈕、旋鈕等,而光電編碼器(俗稱“單鍵飛梭”)作為一種輸入設備,由于其具有輸入靈活,簡單可靠等特點,因此特別適合應用在嵌入式儀器和手持式設備上,整個系統(tǒng)可以只用一個鍵作為輸入。觸摸屏由于其方便靈活、節(jié)省空間、界面直觀等特點也備受青睞,但存在壽命短,長時間使用容易產生誤差等缺點。如果用光電編碼器輔助觸摸屏作為輸入設備,必將大大增強系統(tǒng)的可靠性,使得人機接口更加人性化。但由于光電編碼器并不是wince的標準輸入設備,因此其驅動程序在嵌入式操作系統(tǒng)windows ce platform builder中并未給出。本文以三星公司s3c2410(arm9芯片)為cpu的嵌入式系統(tǒng)開發(fā)板為平臺,詳細闡述了嵌入式操作系統(tǒng)wince下光電編碼器驅動程序的設計方法,以供同行參考。
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ī)則如下:
、 a為上升沿,b=0時,旋鈕右旋;
、 b為上升沿,a=1時,旋鈕右旋;
、 a為下降沿,b=1時,旋鈕右旋;
、 b為下降沿,a=0時,旋鈕右旋;
、 b為上升沿,a=0時,旋鈕左旋;
、 a為上升沿,b=1時,旋鈕左旋;
、 b為下降沿,a=1時,旋鈕左旋;
、 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就可以使用waitforsingleobject函數(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 光電編碼器驅動程序的設計
3.1 光電編碼器與s3c2410的硬件接口
光電編碼器與s3c2410的接口電路如圖4所示。光電編碼器的a、b相為集電極開路輸出,由于s3c2410的i/o口電平為3.3 v,所以將其通過電阻上拉到3.3 v后再分別接到cpu的ei
引言
近年來,嵌入式技術發(fā)展迅速,嵌入式系統(tǒng)在各行各業(yè)得到了廣泛的應用。然而,由于嵌入式計算機的專用性,系統(tǒng)的硬件、軟件結構千差萬別,其輸入設備也不再像通用計算機那樣單一。
嵌入式計算機的輸入設備一般有鼠標、鍵盤、觸摸屏、按鈕、旋鈕等,而光電編碼器(俗稱“單鍵飛梭”)作為一種輸入設備,由于其具有輸入靈活,簡單可靠等特點,因此特別適合應用在嵌入式儀器和手持式設備上,整個系統(tǒng)可以只用一個鍵作為輸入。觸摸屏由于其方便靈活、節(jié)省空間、界面直觀等特點也備受青睞,但存在壽命短,長時間使用容易產生誤差等缺點。如果用光電編碼器輔助觸摸屏作為輸入設備,必將大大增強系統(tǒng)的可靠性,使得人機接口更加人性化。但由于光電編碼器并不是wince的標準輸入設備,因此其驅動程序在嵌入式操作系統(tǒng)windows ce platform builder中并未給出。本文以三星公司s3c2410(arm9芯片)為cpu的嵌入式系統(tǒng)開發(fā)板為平臺,詳細闡述了嵌入式操作系統(tǒng)wince下光電編碼器驅動程序的設計方法,以供同行參考。
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ī)則如下:
、 a為上升沿,b=0時,旋鈕右旋;
② b為上升沿,a=1時,旋鈕右旋;
、 a為下降沿,b=1時,旋鈕右旋;
、 b為下降沿,a=0時,旋鈕右旋;
、 b為上升沿,a=0時,旋鈕左旋;
、 a為上升沿,b=1時,旋鈕左旋;
、 b為下降沿,a=1時,旋鈕左旋;
、 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就可以使用waitforsingleobject函數(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 光電編碼器驅動程序的設計
3.1 光電編碼器與s3c2410的硬件接口
光電編碼器與s3c2410的接口電路如圖4所示。光電編碼器的a、b相為集電極開路輸出,由于s3c2410的i/o口電平為3.3 v,所以將其通過電阻上拉到3.3 v后再分別接到cpu的ei