首頁 » 文檔資料 » [] 正文

WinCE下光電編碼器的驅動程序設計

來源:零零電子  作者:零零電子  時間:2008-03-30 08:55:54  閱讀:137

摘要 光電編碼器以其體積小、輸入靈活等特點作為輸入設備,廣泛應用于各種嵌入式儀器中。本文討論光電編碼器的原理及使用方法;以三星公司ARM9芯片S3C2410為CPU的嵌入式系統開發板為平臺,詳細闡述嵌入式操作系統WinCE下光電編碼器驅動程序的設計方法。實驗證明,該方法正確可行,程序運行穩定可靠。
關鍵詞 嵌入式系統 WinCE 光電編碼器 S3C2410


引 言
    近年來,嵌入式技術發展迅速,嵌入式系統在各行各業得到了廣泛的應用。然而,由于嵌入式計算機的專用性,系統的硬件、軟件結構千差萬別,其輸入設備也不再像通用計算機那樣單一。嵌入式計算機的輸入沒備一般有鼠標、鍵盤、觸摸屏、按鈕、旋鈕等,而光電編碼器(俗稱“單鍵飛梭”)作為一種輸入設備,由于其具有輸入靈活,簡單可靠等特點,因此特別適合應用在嵌入式儀器和手持式設備上,整個系統可以只用一個鍵作為輸入。觸摸屏由于其方便靈活、節省空間、界面直觀等特點也備受青睞,但存在壽命短,長時間使用容易產生誤差等缺點。如果用光電編碼器輔助觸摸屏作為輸入設備,必將大大增強系統的可靠性,使得人機接口更加人性化。但由于光電編碼器并不是WinCE的標準輸入設備,因此其驅動程序在嵌入式操作系統Windows CE Platform Builder中并未給出。本文以三星公司S3C2410(ARM9芯片)為CPU的嵌入式系統開發板為平臺,詳細闡述了嵌入式操作系統WinCE下光電編碼器驅動程序的設計方法,以供同行參考。


1 光電編碼器的工作原理
   
光電編碼器(Optical Encoder)俗稱“單鍵飛梭”,其外觀好像一個電位器,因其外部有一個可以左右旋轉同時又可按下的旋鈕,很多設備(如顯示器、示波器等)用它作為人機交互接口。下面以美國Greyhill公司生產的光電編碼器為例,介紹其工作原理及使用方法。獾綾嗦肫韉哪誆康緶啡繽?所示,其內部有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_MACHINE\Driver\BuiltIn下的子鍵,發現新設備就根據每個表項的內容進行硬件設備初始化。
2.2 中斷與中斷處理
   
如果一個驅動程序要處理一個中斷,那么驅動程序需要首先使用CreateEvent函數建立一個事件,調用InterruptInitialize函數將該事件與中斷標識綁定。然后驅動程序中的IST就可以使用WaitForSing|eObject函數來等待中斷的發生。在一個硬件中斷發生之后,操作系統進入異常處理程序,異常處理程序調用OAL的OEMInterruptHandler函數,該函數檢測硬件并將中斷標識返回給系統;系統得到該中斷標識便會找到該中斷標識對應的事件,并喚醒等待相應事件的線程(IST),然后IST進行中斷處理。處理完成之后,IST需要調用InterruptDone函數來告訴操作系統中斷處理結束,操作系統再次調用OAL中的OEMInterruptDone函數,最后完成中斷的處理。圖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口輸出為高電平,否則輸出為低電平。

    工作狀態下,將EINTO、EINTl配置成上升沿和下降沿均觸發的外部中斷,將EINT2配置成上升沿觸發的中斷,旋鈕按下時EINT2引腳產生上升沿觸發中斷。

3.2 外部中斷初始化及中斷服務程序的編寫
   
首先必須完成CPU的I/O口和中斷的初始化工作,然后再編寫中斷處理程序。具體分為4個步驟:
    ①初始化I/O口。在Port_Init()函數中,將EINT0和EINTl初始化為上升沿和下降沿均觸發的中斷。將EINT2初始化為上升沿觸發的中斷。
    ②添加中斷號。在oalint.h下添加光電編碼器中斷向量的宏定義。代碼為#define SYSINTR_OED(SYSINTR_FIRMWARE+20)
    ③添加中斷的初始化、禁止、復位等函數,分別在OEMInterruptEnable()、OEMInterruptDisable()、OEM-InterruptDone()等函數中加入相關代碼。
    ④返同中斷標識,由OEMInterruptHandler()函數返回中斷標識(SYSINTR_OED)。
3.3 編寫流接口驅動程序
    Windows CE.net把中斷處理分成兩個部分:中斷服務程序(ISR)和中斷服務線程(IST)。TSR通常要求越短、越快越好,它的唯一任務就是返回中斷標識。正由于ISR很小,只能做少量的處理,因此中斷處理器就調用IST執行大多數的中斷處理。中斷服務線程(IST)在從waitForSingleObject()函數得到中斷已經發生的信號前一直保持空閑;當接收到中斷信號后,它就在本機設備驅動程序的PDD層調用子程序,這些程序反過來訪問硬件以獲得硬件的狀態。IST使用InterruptInitialize()函數來注冊自己,然后使用WaitForSingleObject()函數等待中斷信號。如果這時中斷信號到來,則應將光電編碼器的狀態記錄下來,保存在變量OED_Status中。OED_Status=1表示旋鈕按下,OED_Status=2表示旋鈕逆時針旋轉,OED_Status=3表示旋鈕順時針旋轉。
    這里還有一種比較簡單的鑒相規則,具體步驟是,當創建線程時讀出EINTl的電平狀態并保存在變量PreEINTl中,每次中斷到來時首先判斷EINT2是否為高電平。如果為高電平,則說明按鈕按下;如果EINT2為低電平,則判斷EINTO電平是否與PreEINTl相同。如果相同,則說明旋鈕逆時針旋轉;反之,旋鈕順時針旋轉,判斷的流程如圖5所示。

    Windows CE流接口驅動程序模型要求驅動程序開發者編寫10個接口函數,針對光電編碼器的驅動主要應完成設備初始化和數據讀取2個函數的編寫。WindowsCE設備文件名前綴由3個大寫字母組成,操作系統使用這3個字母來識別與流接口驅動程序相對應的設備。這里定義設備文件名前綴為“OED”(Optical Encoder),其中設備初始化函數OED_Init()在Windows CE裝載驅動程序時用于創建中斷事件和中斷服務線程。在函數OED_Read()中將光電編碼器的狀態(OED_Status)返回。
3.4 封裝驅動程序并加入到WinCE中
   
根據上述方法編譯出動態鏈接庫(DLL)還不夠,因為它的接口函數還沒有導出,還需要告訴鏈接程序輸出什么樣的函數,因此必須建立一個后綴名為def的文件。在本設計中為OpticalEnccder.def。下面是此文件的內容:

   
    一個具體的流接口驅動程序和注冊表是密不可分的。向WinCE內核添加注冊表項的方法有兩種:一種是直接修改Platform Builder下的reg文件;另一種是自己編寫一個注冊表文件,通過添加組件的方法將動態鏈接庫文件添加到內核中。這里用第2種方法,將OpticalEncoder.dll添加到內核中。編寫的注冊表文件內容如下:

   
    最后編寫一個CEC文件,完成對定制內核注冊表部分的修改并將OpticalEncoder.dll添加到系統內核中去,然后在Platform Builder中就可以直接添加已經編寫好的驅動程序了。


結語
   
本文主要介紹了光電旋轉編碼器的原理及應用方法,并詳細介紹了WinCE驅動程序的結構,成功地開發出了光電編碼器在嵌入式操作系統WinCE下的驅動程序。實驗證明,該方法正確可行,程序運行穩定可靠。

      
  相關信息
 · 初學2407  2010-03-09 22:12:33
 · 基于TMS320C6701控制多片AD9852的接口電路的設計  2008-09-26 07:49:47
 · 基于MSP430的軌道電路在線測試儀設計與實現  2008-09-07 13:16:26
 · 基于TMS320DM642的圖像處理系統  2008-09-05 18:04:24
 · 靈活的MCU架構實現產品的輕松升級  2008-08-29 17:58:57
 · 基于嵌入式Linux的B超圖像打印的實現  2008-08-29 17:57:26
 · DSP在自動目標識別中的應用  2008-08-29 17:52:08
 · 中國科技大學再建Xilinx聯合實驗室!  2008-08-18 15:29:01
 · 實時內核μC/OS-II下的網絡監控系統的設計  2008-08-13 05:21:56
 · 基于FPGA的數據無阻塞交換設計  2008-08-11 17:57:55
更多   
    客戶服務電話:0551-63525828
    客戶服務 QQ:289135388
    MSN:board_00ic@hotmail.com
    傳真服務號碼:0551-63525828
    地址:合肥市政務區潛山路綠地藍海國際大廈A樓1609-1610室
關于我們 | 服務條款 | 銷售咨詢 | 售后服務 | 聯系我們 版權所有(C)合肥零零電子科技有限公司 2005-2022 備案管理系統皖ICP備17022914號-1
国产AV剧情超级爽闺蜜,国产AⅤ丝袜旗袍无码麻豆,麻豆最新国产剧情AV原创免费