新聞中心

EEPW首頁 > 光電顯示 > 設(shè)計應(yīng)用 > 光電旋轉(zhuǎn)編碼器的原理及應(yīng)用方法

光電旋轉(zhuǎn)編碼器的原理及應(yīng)用方法

作者: 時間:2012-03-13 來源:網(wǎng)絡(luò) 收藏


3 驅(qū)動程序的設(shè)計

本文引用地址:http://butianyuan.cn/article/168291.htm

  3.1 與S3C2410的硬件接口

  與S3C24lO的接口電路如圖4所示。光電編碼器的A、B相為集電極開路輸出,由于S3C2410的I/O口電平為3.3 V,所以將其通過電阻上拉到3.3V后再分別接到CPU的EINT0和EINT1上;將Pl直接接到3.3V,P2通過電阻下拉到GND。當旋鈕按下時,P2口輸出為高電平,否則輸出為低電平。

  

光電編碼器與S3C24lO的接口電路

  工作狀態(tài)下,將EINTO、EINTl配置成上升沿和下降沿均觸發(fā)的外部中斷,將EINT2配置成上升沿觸發(fā)的中斷,旋鈕按下時EINT2引腳產(chǎn)生上升沿觸發(fā)中斷。

  3.2 外部中斷初始化及中斷服務(wù)程序的編寫

  首先必須完成CPU的I/O口和中斷的初始化工作,然后再編寫中斷處理程序。具體分為4個步驟:

  初始化I/O口。在Port_Init()函數(shù)中,將EINT0和EINTl初始化為上升沿和下降沿均觸發(fā)的中斷。將EINT2初始化為上升沿觸發(fā)的中斷。

  添加中斷號。在oalint.h下添加光電編碼器中斷向量的宏定義。代碼為#define SYSINTR_OED(SYSINTR_FIRMWARE+20)

  添加中斷的初始化、禁止、復(fù)位等函數(shù),分別在OEMInterruptEnable()、OEMInterruptDisable()、OEM-InterruptDone()等函數(shù)中加入相關(guān)代碼。

  返同中斷標識,由OEMInterruptHandler()函數(shù)返回中斷標識(SYSINTR_OED)。

  3.3 編寫流接口驅(qū)動程序

  Windows CE.net把中斷處理分成兩個部分:中斷服務(wù)程序(ISR)和中斷服務(wù)線程(IST)。TSR通常要求越短、越快越好,它的唯一任務(wù)就是返回中斷標識。正由于ISR很小,只能做少量的處理,因此中斷處理器就調(diào)用IST執(zhí)行大多數(shù)的中斷處理。中斷服務(wù)線程(IST)在從waitForSingleObject()函數(shù)得到中斷已經(jīng)發(fā)生的信號前一直保持空閑;當接收到中斷信號后,它就在本機設(shè)備驅(qū)動程序的PDD層調(diào)用子程序,這些程序反過來訪問硬件以獲得硬件的狀態(tài)。IST使用InterruptInitialize()函數(shù)來注冊自己,然后使用WaitForSingleObject()函數(shù)等待中斷信號。如果這時中斷信號到來,則應(yīng)將光電編碼器的狀態(tài)記錄下來,保存在變量OED_Status中。OED_Status=1表示旋鈕按下,OED_Status=2表示旋鈕逆時針,OED_Status=3表示旋鈕順時針。

  這里還有一種比較簡單的鑒相規(guī)則,具體步驟是,當創(chuàng)建線程時讀出EINTl的電平狀態(tài)并保存在變量PreEINTl中,每次中斷到來時首先判斷EINT2是否為高電平。如果為高電平,則說明按鈕按下;如果EINT2為低電平,則判斷EINTO電平是否與PreEINTl相同。如果相同,則說明旋鈕逆時針;反之,旋鈕順時針旋轉(zhuǎn),判斷的流程如圖5所示。

  

判斷的流程

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




評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉