光電旋轉(zhuǎn)編碼器的原理及應(yīng)用方法
3 光電編碼器驅(qū)動(dòng)程序的設(shè)計(jì)本文引用地址:http://www.ex-cimer.com/article/168291.htm
光電編碼器與S3C24lO的接口電路如圖4所示。光電編碼器的A、B相為集電極開路輸出,由于S3C2410的I/O口電平為3.3 V,所以將其通過電阻上拉到3.3V后再分別接到CPU的EINT0和EINT1上;將Pl直接接到3.3V,P2通過電阻下拉到GND。當(dāng)旋鈕按下時(shí),P2口輸出為高電平,否則輸出為低電平。
工作狀態(tài)下,將EINTO、EINTl配置成上升沿和下降沿均觸發(fā)的外部中斷,將EINT2配置成上升沿觸發(fā)的中斷,旋鈕按下時(shí)EINT2引腳產(chǎn)生上升沿觸發(fā)中斷。
3.2 外部中斷初始化及中斷服務(wù)程序的編寫
首先必須完成CPU的I/O口和中斷的初始化工作,然后再編寫中斷處理程序。具體分為4個(gè)步驟:
初始化I/O口。在Port_Init()函數(shù)中,將EINT0和EINTl初始化為上升沿和下降沿均觸發(fā)的中斷。將EINT2初始化為上升沿觸發(fā)的中斷。
添加中斷號(hào)。在oalint.h下添加光電編碼器中斷向量的宏定義。代碼為#define SYSINTR_OED(SYSINTR_FIRMWARE+20)
添加中斷的初始化、禁止、復(fù)位等函數(shù),分別在OEMInterruptEnable()、OEMInterruptDisable()、OEM-InterruptDone()等函數(shù)中加入相關(guān)代碼。
返同中斷標(biāo)識(shí),由OEMInterruptHandler()函數(shù)返回中斷標(biāo)識(shí)(SYSINTR_OED)。
3.3 編寫流接口驅(qū)動(dòng)程序
Windows CE.net把中斷處理分成兩個(gè)部分:中斷服務(wù)程序(ISR)和中斷服務(wù)線程(IST)。TSR通常要求越短、越快越好,它的唯一任務(wù)就是返回中斷標(biāo)識(shí)。正由于ISR很小,只能做少量的處理,因此中斷處理器就調(diào)用IST執(zhí)行大多數(shù)的中斷處理。中斷服務(wù)線程(IST)在從waitForSingleObject()函數(shù)得到中斷已經(jīng)發(fā)生的信號(hào)前一直保持空閑;當(dāng)接收到中斷信號(hào)后,它就在本機(jī)設(shè)備驅(qū)動(dòng)程序的PDD層調(diào)用子程序,這些程序反過來訪問硬件以獲得硬件的狀態(tài)。IST使用InterruptInitialize()函數(shù)來注冊(cè)自己,然后使用WaitForSingleObject()函數(shù)等待中斷信號(hào)。如果這時(shí)中斷信號(hào)到來,則應(yīng)將光電編碼器的狀態(tài)記錄下來,保存在變量OED_Status中。OED_Status=1表示旋鈕按下,OED_Status=2表示旋鈕逆時(shí)針旋轉(zhuǎn),OED_Status=3表示旋鈕順時(shí)針旋轉(zhuǎn)。
這里還有一種比較簡(jiǎn)單的鑒相規(guī)則,具體步驟是,當(dāng)創(chuàng)建線程時(shí)讀出EINTl的電平狀態(tài)并保存在變量PreEINTl中,每次中斷到來時(shí)首先判斷EINT2是否為高電平。如果為高電平,則說明按鈕按下;如果EINT2為低電平,則判斷EINTO電平是否與PreEINTl相同。如果相同,則說明旋鈕逆時(shí)針旋轉(zhuǎn);反之,旋鈕順時(shí)針旋轉(zhuǎn),判斷的流程如圖5所示。
51單片機(jī)相關(guān)文章:51單片機(jī)教程
評(píng)論