基于CAN總線的半掛車安全預(yù)警系統(tǒng)設(shè)計(jì)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
1 引言
半掛車指“其設(shè)計(jì)和技術(shù)特性需汽車牽引,才能正常使用的一種無(wú)動(dòng)力的道路車輛,用于載運(yùn)人員和貨物”(GB/T3730.1-2001標(biāo)準(zhǔn))。 半掛車的種類很多,包括廂式半掛車、罐式半掛車、平板半掛車、集裝箱半掛車、車輛運(yùn)輸半掛車等等。隨著我國(guó)公路物流運(yùn)輸業(yè)的發(fā)展,半掛車以其運(yùn)輸效率高、運(yùn)載量大、燃油經(jīng)濟(jì)性好、運(yùn)輸成本低等優(yōu)勢(shì)使用越來(lái)越廣泛。隨之而來(lái)的是半掛車的安全問(wèn)題。據(jù)2006年公安交通部門統(tǒng)計(jì),全國(guó)半掛車的數(shù)量約占整個(gè)機(jī)動(dòng)車保有量的5%左右,重大交通事故中,涉及到半掛車等大型貨運(yùn)機(jī)動(dòng)車輛的事故占到約47%,造成的人員死亡率占總數(shù)的約30%。半掛車的安全隱患主要來(lái)自兩個(gè)方面:一是超載現(xiàn)象。超載現(xiàn)象不僅對(duì)高速公路等交通設(shè)施造成破壞,而且使得汽車輪胎處在極大的負(fù)荷下,易引發(fā)爆胎事故;貨車超載也使得貨物更容易變得不平衡,導(dǎo)致車輛發(fā)生側(cè)翻傾覆的事故。二是輪胎安全,缺乏輪胎壓力溫度監(jiān)測(cè)系統(tǒng);因此建立半掛車的安全預(yù)警系統(tǒng)非常必要。
2 總體設(shè)計(jì)
半掛車車身長(zhǎng)度一般在 6—14 米,車身長(zhǎng),電磁干擾大,汽車電子單元多而復(fù)雜,采用傳統(tǒng)的四輪轎車獨(dú)立的TPMS 方案信號(hào)傳輸易受干擾屏蔽,而且與其它汽車電子單元無(wú)法進(jìn)行信息交換,系統(tǒng)的可靠性和擴(kuò)展性不好。因此設(shè)計(jì)采用基于CAN 總線的方式,將各輪胎氣壓、溫度監(jiān)測(cè)裝置和其它諸如ABS、發(fā)動(dòng)機(jī)、儀表盤的汽車電子單元都作為一個(gè)個(gè)CAN 總線上的結(jié)點(diǎn), 由一個(gè)中心預(yù)警模塊統(tǒng)一監(jiān)測(cè)控制,可提高系統(tǒng)可靠性和監(jiān)測(cè)效率,節(jié)省各模塊重復(fù)開(kāi)發(fā)費(fèi)用。如圖1 所示。
500)this.style.width=500;" border="0" />
3 系統(tǒng)硬件設(shè)計(jì)
3.1 CAN 總線的特點(diǎn)
CAN 全稱為Controller Area Network,即控制器局域網(wǎng),是國(guó)際上應(yīng)用最廣泛的現(xiàn)場(chǎng)總線之一。
CAN與其它總線結(jié)構(gòu)相比有較優(yōu)越的特點(diǎn)[1]:(1)CAN總線為多主站總線,各結(jié)點(diǎn)均可在任意時(shí)刻主動(dòng)向網(wǎng)絡(luò)上的其他結(jié)點(diǎn)發(fā)送信息,不分主從,通信靈活;(2)CAN總線上每幀有效字節(jié)數(shù)最多為8個(gè),傳輸時(shí)間短,受干擾概率低,并有CRC及其他校驗(yàn)措施,具有極好的檢錯(cuò)效果,數(shù)據(jù)出錯(cuò)率極低。(3)CAN總線只有兩根導(dǎo)線,系統(tǒng)擴(kuò)充時(shí),不需要應(yīng)用層以及任何結(jié)點(diǎn)軟件和硬件的任何改變,可直接將新結(jié)點(diǎn)掛在總線上即可,因此走線少,系統(tǒng)擴(kuò)充容易,改型靈活;網(wǎng)絡(luò)構(gòu)建成本低,總線利用率極高;(4)數(shù)據(jù)傳輸距離可滿足5-15米的汽車系統(tǒng),數(shù)據(jù)傳輸速率高達(dá)1Mbit/s,也可滿足長(zhǎng)達(dá)10km工業(yè)應(yīng)用。
3.2 CAN 總線地址分配
如何來(lái)區(qū)分總線上的各個(gè)結(jié)點(diǎn)呢?在 CAN 總線上發(fā)送的每一條報(bào)文都具有唯一的一個(gè)11 位(標(biāo)準(zhǔn)幀)或29 位(擴(kuò)展幀)數(shù)字的ID,可采用靜態(tài)分配地址的方法,將ID 的前3—4 位定義為結(jié)點(diǎn)地址,其余各位自行定義,寫入各結(jié)點(diǎn)發(fā)送的幀消息中。中央結(jié)點(diǎn)接收到一個(gè)CAN 數(shù)據(jù)幀后通過(guò)檢查前3—4 為確定數(shù)據(jù)是從哪個(gè)結(jié)點(diǎn)發(fā)出的,從而做出響應(yīng)的處理。CAN 總線狀態(tài)取決于二進(jìn)制數(shù)“0”而不是“1”,所以ID 號(hào)越小,則該報(bào)文擁有越高的優(yōu)先權(quán)。一般后輪輪胎的負(fù)荷大于前輪,因經(jīng)常靠右行駛,右側(cè)的輪胎負(fù)荷可能大于左側(cè)[2],因此在輪胎結(jié)點(diǎn)地址分配時(shí),可以將負(fù)荷較大的輪胎分配為小地址,優(yōu)先發(fā)送該結(jié)點(diǎn)數(shù)據(jù)。
3.3 中央預(yù)警模塊
中央控制模塊的硬件設(shè)計(jì)如圖 2 所示,分五個(gè)部分:一是處理器的選取和使用。處理器要求選取性能高,體積小,價(jià)格比較低,功耗小,安裝方便,安全可靠的產(chǎn)品。目前嵌入式系統(tǒng)中比較常用的32 位基于ARM7 框架的S3C44B0X 處理器比較符合要求。二是存儲(chǔ)部件的擴(kuò)展,主要用于程序燒制和運(yùn)行。三是要有輸入輸出部件,使用觸摸屏作為輸入設(shè)備,LCD和音頻播放器作為輸出設(shè)備,實(shí)現(xiàn)胎壓和溫度門限值的輸入和實(shí)際監(jiān)測(cè)數(shù)據(jù)輸出預(yù)警。四是CAN 接口電路設(shè)計(jì),如果選取的處理器自帶CAN 接口電路當(dāng)然更好,如果選取的處理器本身不帶CAN 接口功能,可通過(guò)外接CAN 控制器的方式實(shí)現(xiàn)數(shù)據(jù)收發(fā)(圖2 采用S3C44B0X 處理器SPI 同步串行接口與MCP2510 控制器、TJA1050 收發(fā)器相連實(shí)現(xiàn)CAN 接口功能)。五是要有模塊調(diào)試電路,主要是串行口和JTAG 接口的設(shè)計(jì)。
500)this.style.width=500;" border="0" />
4 系統(tǒng)軟件設(shè)計(jì)
4.1 操作系統(tǒng)引導(dǎo)
本系統(tǒng)軟件設(shè)計(jì)采用目前比較流行的嵌入式實(shí)時(shí)多任務(wù)開(kāi)放式操作系統(tǒng)μC-OS/II 。該操作系統(tǒng)要在S3C44B0X處理器上運(yùn)行必須先對(duì)其進(jìn)行移植[3],然后由Bootloader中由BOOT()、Loadfile()兩個(gè)函數(shù)來(lái)完成操作系統(tǒng)的引導(dǎo)和控制權(quán)的轉(zhuǎn)移。系統(tǒng)將LCD、音頻、CAN接口控制器等全部硬件驅(qū)動(dòng)程序,圖形API,控件函數(shù),以及系統(tǒng)的基本任務(wù)生成專門的庫(kù)(在STD2.5的開(kāi)發(fā)環(huán)境下生成的庫(kù)為ucos_lib.alf),使基于庫(kù)的應(yīng)用程序開(kāi)發(fā)變的異常
簡(jiǎn)單,不用考慮底層的細(xì)節(jié)。應(yīng)用程序開(kāi)發(fā)后與專門庫(kù)、頭文件以及μC/OS-II操作系統(tǒng)會(huì)綁定在一起編譯,生成唯一執(zhí)行文件system.bin,存放在16M FLASH中,在系統(tǒng)啟動(dòng)時(shí)由BootLoader依靠文件系統(tǒng)從FLASH 中讀到SDRAM 中,然后移植到該代碼上,完成操作系統(tǒng)的引導(dǎo)任務(wù)。
4.2設(shè)置TPMS的胎壓與溫度報(bào)警門限
汽車輪胎的壓力與溫度是密切相關(guān)的,當(dāng)輪胎氣壓低于標(biāo)準(zhǔn)值時(shí),變形增大,受力發(fā)生變化,若胎壓長(zhǎng)期低于正常氣壓的80%,在高速行駛時(shí),輪胎會(huì)因急劇升溫而脫層,甚至導(dǎo)致爆胎[4]。當(dāng)輪胎氣壓高于標(biāo)準(zhǔn)值時(shí),因輪胎與地面接觸的面積減少,單位壓力增高,使輪胎胎面的中部磨損增加。通過(guò)室內(nèi)試驗(yàn)證明:氣壓提高25%,輪胎壽命將會(huì)降低15~20%;氣壓降低25%,壽命大約降低30%。此外,汽車輪胎溫度越高,輪胎的強(qiáng)度越低,變形越大(一般不能超過(guò)80℃,當(dāng)溫度達(dá)到95℃時(shí),輪胎的情況非常危險(xiǎn)),每升高1℃,輪胎磨損就增加2%,行駛速度每增加一倍,輪胎行駛里程將降低50%[5]。因此,最好不要超溫、超速行使。由于不同載重、不同型號(hào)的半掛車輪胎標(biāo)準(zhǔn)胎壓、溫度不同,系統(tǒng)設(shè)置為可由觸摸屏面板自行輸入?yún)⒖紭?biāo)準(zhǔn)胎壓和溫度值。實(shí)際胎壓值在標(biāo)準(zhǔn)胎壓值的-10到+10%之間波動(dòng)認(rèn)為正常;在-25%到-10%之間或+25%到+10%之間波動(dòng)視為一般性異常,發(fā)出二級(jí)預(yù)警信號(hào),提示司機(jī)做出相應(yīng)處理;低于25%或高于25%視為嚴(yán)重異常,發(fā)出一級(jí)預(yù)警信息。在不考慮外部溫度、路面等因素影響,默認(rèn)輪胎最大溫度值為80 oC,超過(guò)80 oC視為一般異常,發(fā)出二級(jí)預(yù)警,超過(guò)100oC視為嚴(yán)重異常,發(fā)出一級(jí)預(yù)警信號(hào)。系統(tǒng)中通過(guò)觸摸屏參數(shù)選取任務(wù)TouchOption_Task()可獲得用戶指定輪胎標(biāo)準(zhǔn)壓力和最大溫度,存放于變量Press和Temp中。
4.3 胎壓顯示、聲音預(yù)警
為保證系統(tǒng)的實(shí)時(shí)性,采取中斷方式接收CAN 總線數(shù)據(jù),由Main_Task()任務(wù)完成。對(duì)于接收到的壓力、溫度采樣數(shù)據(jù),首先調(diào)用CANData_deal()函數(shù)根據(jù)ID 碼區(qū)分各個(gè)輪胎的數(shù)據(jù),由Display_Task()任務(wù)執(zhí)行在LCD 上以直方圖的形式顯示輪胎壓力信息;其次切換到任務(wù)Sound_Task()將數(shù)據(jù)與用戶設(shè)置的壓力(溫度)標(biāo)準(zhǔn)值進(jìn)行比較,若上下偏離標(biāo)準(zhǔn)值在25%(20%溫度標(biāo)準(zhǔn)值)范圍內(nèi),采取一級(jí)報(bào)警策略,連續(xù)播放急促的警報(bào)聲,提請(qǐng)司
機(jī)立即停車;再次將數(shù)據(jù)與標(biāo)準(zhǔn)壓力(溫度)值進(jìn)行比較,若偏離標(biāo)準(zhǔn)值10%,發(fā)出二級(jí)報(bào)警信息,斷斷續(xù)續(xù)的滴答聲,提請(qǐng)司機(jī)注意輪胎壓力不夠或過(guò)大,影響輪胎使用壽命和經(jīng)濟(jì)運(yùn)行,需要對(duì)輪胎進(jìn)行檢修。各任務(wù)間的信息傳遞和任務(wù)喚醒采用郵箱機(jī)制。
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);//開(kāi)啟中斷
······}}}
void CANData_deal(id,data) //CANData_deal()對(duì)數(shù)據(jù)進(jìn)行處理
{······//定義相關(guān)信息
if ydata[1]> Pressure*110%* || data[1]< Pressure*90% ||data[2]> Temperature
{ isrtxmsg=‘2’;//向郵箱發(fā)送二級(jí)聲音預(yù)警信息
OSMboxPost(soundMbox,(void*)&isrtxmsg)
}else
{if ydata[1]>ya*125* || data[1]<ya*75% ||data[2]> Temperature*120%
{ isrtxmsg=‘1’;// 向郵箱發(fā)送一級(jí)聲音預(yù)警信息
OSMboxPost(soundMbox,(void*)&isrtxmsg)}}
canid=id&0x700//對(duì)id 第8—10 位進(jìn)行判斷
switch(canid)
{ case 0: //結(jié)點(diǎn)1 數(shù)據(jù)處理和顯示
ya1=data[1]
······
case 0x100: //結(jié)點(diǎn)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 對(duì)應(yīng)的直方圖
······
DrawRectfram(pdc,235,200+ya4/2,285,200);//輪胎n 對(duì)應(yīng)的直方圖
······}