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