基于CAN總線的半掛車安全預(yù)警系統(tǒng)設(shè)計
4 系統(tǒng)軟件設(shè)計
4.1 操作系統(tǒng)引導(dǎo)
本系統(tǒng)軟件設(shè)計采用目前比較流行的嵌入式實時多任務(wù)開放式操作系統(tǒng)μC-OS/II 。該操作系統(tǒng)要在S3C44B0X處理器上運行必須先對其進行移植[3],然后由Bootloader中由BOOT()、Loadfile()兩個函數(shù)來完成操作系統(tǒng)的引導(dǎo)和控制權(quán)的轉(zhuǎn)移。系統(tǒng)將LCD、音頻、CAN接口控制器等全部硬件驅(qū)動程序,圖形API,控件函數(shù),以及系統(tǒng)的基本任務(wù)生成專門的庫(在STD2.5的開發(fā)環(huán)境下生成的庫為ucos_lib.alf),使基于庫的應(yīng)用程序開發(fā)變的異常
簡單,不用考慮底層的細節(jié)。應(yīng)用程序開發(fā)后與專門庫、頭文件以及μC/OS-II操作系統(tǒng)會綁定在一起編譯,生成唯一執(zhí)行文件system.bin,存放在16M FLASH中,在系統(tǒng)啟動時由BootLoader依靠文件系統(tǒng)從FLASH 中讀到SDRAM 中,然后移植到該代碼上,完成操作系統(tǒng)的引導(dǎo)任務(wù)。
4.2設(shè)置TPMS的胎壓與溫度報警門限
汽車輪胎的壓力與溫度是密切相關(guān)的,當(dāng)輪胎氣壓低于標(biāo)準(zhǔn)值時,變形增大,受力發(fā)生變化,若胎壓長期低于正常氣壓的80%,在高速行駛時,輪胎會因急劇升溫而脫層,甚至導(dǎo)致爆胎[4]。當(dāng)輪胎氣壓高于標(biāo)準(zhǔn)值時,因輪胎與地面接觸的面積減少,單位壓力增高,使輪胎胎面的中部磨損增加。通過室內(nèi)試驗證明:氣壓提高25%,輪胎壽命將會降低15~20%;氣壓降低25%,壽命大約降低30%。此外,汽車輪胎溫度越高,輪胎的強度越低,變形越大(一般不能超過80℃,當(dāng)溫度達到95℃時,輪胎的情況非常危險),每升高1℃,輪胎磨損就增加2%,行駛速度每增加一倍,輪胎行駛里程將降低50%[5]。因此,最好不要超溫、超速行使。由于不同載重、不同型號的半掛車輪胎標(biāo)準(zhǔn)胎壓、溫度不同,系統(tǒng)設(shè)置為可由觸摸屏面板自行輸入?yún)⒖紭?biāo)準(zhǔn)胎壓和溫度值。實際胎壓值在標(biāo)準(zhǔn)胎壓值的-10到+10%之間波動認(rèn)為正常;在-25%到-10%之間或+25%到+10%之間波動視為一般性異常,發(fā)出二級預(yù)警信號,提示司機做出相應(yīng)處理;低于25%或高于25%視為嚴(yán)重異常,發(fā)出一級預(yù)警信息。在不考慮外部溫度、路面等因素影響,默認(rèn)輪胎最大溫度值為80 oC,超過80 oC視為一般異常,發(fā)出二級預(yù)警,超過100oC視為嚴(yán)重異常,發(fā)出一級預(yù)警信號。系統(tǒng)中通過觸摸屏參數(shù)選取任務(wù)TouchOption_Task()可獲得用戶指定輪胎標(biāo)準(zhǔn)壓力和最大溫度,存放于變量Press和Temp中。
4.3 胎壓顯示、聲音預(yù)警
為保證系統(tǒng)的實時性,采取中斷方式接收CAN 總線數(shù)據(jù),由Main_Task()任務(wù)完成。對于接收到的壓力、溫度采樣數(shù)據(jù),首先調(diào)用CANData_deal()函數(shù)根據(jù)ID 碼區(qū)分各個輪胎的數(shù)據(jù),由Display_Task()任務(wù)執(zhí)行在LCD 上以直方圖的形式顯示輪胎壓力信息;其次切換到任務(wù)Sound_Task()將數(shù)據(jù)與用戶設(shè)置的壓力(溫度)標(biāo)準(zhǔn)值進行比較,若上下偏離標(biāo)準(zhǔn)值在25%(20%溫度標(biāo)準(zhǔn)值)范圍內(nèi),采取一級報警策略,連續(xù)播放急促的警報聲,提請司
機立即停車;再次將數(shù)據(jù)與標(biāo)準(zhǔn)壓力(溫度)值進行比較,若偏離標(biāo)準(zhǔn)值10%,發(fā)出二級報警信息,斷斷續(xù)續(xù)的滴答聲,提請司機注意輪胎壓力不夠或過大,影響輪胎使用壽命和經(jīng)濟運行,需要對輪胎進行檢修。各任務(wù)間的信息傳遞和任務(wù)喚醒采用郵箱機制。
void Mian_Task(Void *id) //接收處理CAN 總線數(shù)據(jù)任務(wù)
{……// MCP2510 初始化,準(zhǔn)備以中斷方式接收數(shù)據(jù)
for(;;)
{rxmsg=(char)*=OSMboxPend(ISRTaskMbox,0,err);//接收郵箱消息
if(*rxmsg=’0’
{rINTMSK-(~BIT_TIME0);禁止外部中斷,但不禁止節(jié)拍中斷
rINTMSK|=BIT_EINT4567;
canRead(n, id, data, length, rxRTR, isExt);
CANData_deal(id,data);
rINTMSK=~(BIT_EINT4567);//開啟中斷
??????}}}
void CANData_deal(id,data) //CANData_deal()對數(shù)據(jù)進行處理
{??????//定義相關(guān)信息
if ydata[1]> Pressure*110%* || data[1] Pressure*90% ||data[2]> Temperature
{ isrtxmsg=‘2’;//向郵箱發(fā)送二級聲音預(yù)警信息
OSMboxPost(soundMbox,(void*)isrtxmsg)
}else
{if ydata[1]>ya*125* || data[1]ya*75% ||data[2]> Temperature*120%
{ isrtxmsg=‘1’;// 向郵箱發(fā)送一級聲音預(yù)警信息
OSMboxPost(soundMbox,(void*)isrtxmsg)}}
canid=id0x700//對id 第8―10 位進行判斷
switch(canid)
{ case 0: //結(jié)點1 數(shù)據(jù)處理和顯示
ya1=data[1]
??????
case 0x100: //結(jié)點2 數(shù)據(jù)處理和顯示
ya2=data[1];
??????}}
void Display_Task(Void *id) //預(yù)警信息顯示任務(wù)
{??????
TextOut(pdc,20,20,ch1,true,2)//輸出提示文字:“輪胎壓力信息顯示”
LineTo(pdc, 0, ya*110%/2+200);//壓力最高預(yù)警線
LineTo(pdc, 0, ya*90%/2+200);// 壓力最低預(yù)警線
DrawRectfram(pdc,40,200+ya1/2,90,200);//輪胎1 對應(yīng)的直方圖
??????
DrawRectfram(pdc,235,200+ya4/2,285,200);//輪胎n 對應(yīng)的直方圖
??????}
評論