本方法采用測量一個轉(zhuǎn)盤的轉(zhuǎn)速間接地測出貨車的速度,因此轉(zhuǎn)盤要與貨車的轉(zhuǎn)軸相連,轉(zhuǎn)盤的轉(zhuǎn)速與車軸的轉(zhuǎn)速成一定的關(guān)系。將轉(zhuǎn)盤等分為四等份,在每等份的分界線上安裝一塊磁鋼,如圖1所示。

圖1 測速硬件原理
霍爾開關(guān)的VCC端接5~12V直流電源,OUT端接到SPCE061A的IOB3(外部中斷2輸入口),另一端接公共地。每次磁鋼經(jīng)過霍爾開關(guān)下方時(shí),OUT端都會產(chǎn)生一個脈寬的負(fù)脈沖。
4.2.2軟件設(shè)計(jì)
軟件采用C語言程序,定時(shí)采用低頻定時(shí)器,用2Hz時(shí)基定時(shí),定時(shí)周期為1s(定時(shí)時(shí)長0.5s),同時(shí)要用外部中斷2對OUT脈計(jì)數(shù)。使用一個標(biāo)志(signal)顯示計(jì)時(shí)長度(第幾個0.5s)。當(dāng)signal為1時(shí),啟動外部中斷計(jì)數(shù);當(dāng)signal為3時(shí),關(guān)閉外部中斷,同時(shí)關(guān)閉定時(shí)中斷,完成一次計(jì)數(shù)。
(1)函數(shù)流程圖分析
測速度模塊主要由三個子函數(shù)組成:測速主函,定時(shí)中斷子函數(shù),外部中斷子函數(shù)。
數(shù)測速函數(shù)是測速模塊的主體,是主函數(shù)直接調(diào)用的子函數(shù),流程圖如圖2所示。

圖2 定時(shí)中斷子函數(shù)流程圖
為了能夠及時(shí)地計(jì)下AH44E產(chǎn)生的每個負(fù)脈沖,必須采用外部中斷計(jì)數(shù)。外部中斷子函數(shù)流程圖如圖3所示。

圖3 外部中斷子函數(shù)流程圖
定時(shí)子程序是用于給定準(zhǔn)確的時(shí)間,以便能夠計(jì)算出精準(zhǔn)的速度,定時(shí)使用2Hz低頻時(shí)基計(jì)時(shí)。定時(shí)中斷子函數(shù)流程圖如圖4所示。

圖4定時(shí)中斷子函數(shù)流程圖
(2)部分程序代碼
unsigned int signal=0; //計(jì)時(shí)標(biāo)志
unsigned int count=0; //計(jì)外部脈沖數(shù)
double speed(void)
{
unsigned int uiDelay=0xffff;
__asm("INT OFF"); //關(guān)閉中斷
*P_INT_Ctrl=C_IRQ3_EXT2 | C_IRQ5_2Hz; //設(shè)置中斷IRQ3_EXT1、IRQ5_2Hz
__asm("INT IRQ"); //開中斷
while(uiDelay--)
*P_Watchdog_Clear = C_WDTCLR; //延時(shí)等待
uiDelay=0xffff;
while(uiDelay--)
*P_Watchdog_Clear = C_WDTCLR; //延時(shí)等待
return (double)count/(signal-1)*2; //計(jì)算速度
}
//中斷服務(wù)子程序代碼如下:
void IRQ5(void)
{
if(*P_INT_Ctrl&0x0004)
{
signal++;
if(signal==1){ count=0; //signal=1時(shí)計(jì)數(shù)開始
*P_IOB_Dir=0x00; //設(shè)IOB3為上拉電阻輸入
*P_IOB_Attrib=0x00;
*P_IOB_Data=0x08;
} else if(signal==3) //signal=3時(shí)計(jì)數(shù)結(jié)束
(*P_INT_Ctrl)&=~(C_IRQ3_EXT2 | C_IRQ5_2Hz); //關(guān)IRQ3_EXT1、IRQ5_2Hz中斷
*P_INT_Clear=C_IRQ5_2Hz; //清中斷標(biāo)志位
} else
{ //IRQ5_4Hz
*P_INT_Clear=0x0008; //清中斷標(biāo)志位
}
}
void IRQ3(void)
{
if(*P_INT_Ctrl&C_IRQ3_EXT1) //外部中斷1
{ //IRQ3_Ext1
*P_INT_Clear=C_IRQ3_EXT1; //清中斷標(biāo)志位
}
else if(*P_INT_Ctrl&C_IRQ3_EXT2) //外部中斷2
{ //IRQ3_Ext2
count++; //計(jì)數(shù)加1
*P_INT_Clear=C_IRQ3_EXT2; //清中斷標(biāo)志位
}
}