基于μCOSⅡ的CAN總線車身控制系統(tǒng)
摘要:給出基于μCOSⅡ操作系統(tǒng)的CAN控制器SJA1000智能節(jié)點(diǎn)在某品牌商務(wù)車車身控制系統(tǒng)中的應(yīng)用,簡(jiǎn)述其硬件電路和軟件的結(jié)構(gòu)框圖,并對(duì)設(shè)計(jì)中的難點(diǎn)及實(shí)現(xiàn)過程中應(yīng)注意的問題進(jìn)行介紹。
0 引言
由于車身系統(tǒng)線路復(fù)雜,且很多動(dòng)作都存在相互的關(guān)聯(lián)性,必須對(duì)所有關(guān)聯(lián)性作出非常周密的考慮,才能真正實(shí)現(xiàn)汽車車身的全部安全控制功能。隨著汽車工業(yè)的發(fā)展和汽車功能的增強(qiáng),這種情況將更突出,一方面給電路設(shè)計(jì)人員帶來困難,同時(shí)又增加成本和給生產(chǎn)、檢修帶來麻煩,反過來又限制汽車工業(yè)的發(fā)展。正是在這種情況下,德國(guó)Bosch公司為解決現(xiàn)代汽車中眾多的控制與檢測(cè)儀器之間的數(shù)據(jù)交換而開發(fā)了一種通訊協(xié)議即現(xiàn)場(chǎng)總線CAN。在國(guó)外,尤其在歐洲,CAN網(wǎng)絡(luò)已被廣泛地應(yīng)用在汽車上如BENZ,BMW,PORSCHE等車,而在國(guó)內(nèi)CAN在汽車上的研究才剛起步。
μCOSⅡ操作系統(tǒng)平臺(tái)一方面具有足夠的安全性與穩(wěn)定性,已得到美國(guó)聯(lián)邦航空管理局對(duì)用于商用飛機(jī)的,符合RTCA DO—178部標(biāo)準(zhǔn)的認(rèn)證;另一方面它的多任務(wù)運(yùn)行使CPU的利用率達(dá)到最高,并使應(yīng)用程序模塊化,不僅使程序開發(fā)人員可以將很復(fù)雜的應(yīng)用程序?qū)哟位自O(shè)計(jì)和維護(hù),同時(shí)很容易實(shí)現(xiàn)汽車功能的擴(kuò)展和移植到其它型號(hào)的汽車上。
1、汽車車身系統(tǒng)的介紹
某品牌商務(wù)車車身系統(tǒng)的控制對(duì)象有:4個(gè)門鎖、兩個(gè)車窗玻璃升降器、行李箱鎖、除霜加熱器、電動(dòng)后視鏡,前后大燈、小燈、轉(zhuǎn)向燈、危險(xiǎn)燈、霧燈、牌照燈、車內(nèi)閱讀燈、車廂頂燈等。在具備遙控功能的情況下,還包括對(duì)遙控信號(hào)的接收處理和防盜系統(tǒng)的控制。
1.1 節(jié)點(diǎn)分配
車身系統(tǒng)控制單元按位置可分為左門節(jié)點(diǎn),右門節(jié)點(diǎn),車身前節(jié)點(diǎn),車身后節(jié)點(diǎn),儀表節(jié)點(diǎn),主節(jié)點(diǎn)。CAN總線拓?fù)浣Y(jié)構(gòu)如圖1所示:
1.2 節(jié)點(diǎn)功能
左/右門節(jié)點(diǎn)檢測(cè)與控制對(duì)象有:集控鎖的位置檢測(cè)與控制,電動(dòng)后視鏡上/下、左/右電機(jī)的正反向驅(qū)動(dòng)控制,電動(dòng)車窗玻璃上/下電機(jī)的正反向驅(qū)動(dòng)控制,側(cè)方向燈閃爍驅(qū)動(dòng)控制,各自門鎖控制開關(guān)及玻璃升降開關(guān)位置檢測(cè),除以上左右門均有的檢測(cè)與控制對(duì)象外,左門上還有右門車窗玻璃點(diǎn)動(dòng)/自動(dòng)控制開關(guān)、左右電動(dòng)后視鏡上/下、左/右控制開關(guān)位置檢測(cè)。各個(gè)控制對(duì)象的故障檢測(cè)和處理。
前節(jié)點(diǎn)對(duì)前大燈、前小燈、前霧燈、前轉(zhuǎn)向燈、冷卻風(fēng)扇電機(jī)、前雨刮器電機(jī)等對(duì)象的控制、驅(qū)動(dòng)、故障檢測(cè)及對(duì)少量開關(guān)量的檢測(cè)和處理。
后節(jié)點(diǎn)對(duì)后小燈,后霧燈,后轉(zhuǎn)向燈,制動(dòng)燈,倒車燈,牌照燈,車廂頂各燈以及除霜加熱器等對(duì)象的控制、驅(qū)動(dòng)、故障檢測(cè)及少量開關(guān)量的檢測(cè)和處理。
主節(jié)點(diǎn)是整個(gè)車身控制系統(tǒng)的中樞,負(fù)責(zé)和其它各個(gè)節(jié)點(diǎn)進(jìn)行數(shù)據(jù)通訊并作消息處理。各子節(jié)點(diǎn)將檢測(cè)到的各種量(開關(guān)量和模擬量)處理后打包成含有各種所需信息的報(bào)文(即消息 )發(fā)送給主節(jié)點(diǎn) ,主節(jié)點(diǎn)根據(jù)報(bào)文所含的信息作相應(yīng)處理(包括邏輯關(guān)系處理)后再打包成消息發(fā)送給子節(jié)點(diǎn)執(zhí)行。CAN總線通訊采用廣播模式,即子節(jié)點(diǎn)的報(bào)文只有主節(jié)點(diǎn)接收(點(diǎn)對(duì)點(diǎn)模式),主節(jié)點(diǎn)的報(bào)文所有子節(jié)點(diǎn)均接收。主節(jié)點(diǎn)除了作為系統(tǒng)的中樞功能外,還和其他節(jié)點(diǎn)一樣負(fù)責(zé)對(duì)汽車駕駛臺(tái)前所有開關(guān)的狀態(tài)進(jìn)行檢測(cè),并對(duì)駕駛臺(tái)的所有背光燈(如開關(guān)、儀表等)進(jìn)行PWM調(diào)光驅(qū)動(dòng)。
儀表節(jié)點(diǎn):該節(jié)點(diǎn)不參與汽車車身控制但它是人與車交流的界面。儀表指示各傳感器產(chǎn)生的脈沖量(發(fā)動(dòng)機(jī)轉(zhuǎn)速傳感器、車輪轉(zhuǎn)速傳感器)和模擬量(油量傳感器、水溫傳感器)所對(duì)應(yīng)的物理量。還有液晶顯示日期、大里程和小里程、轉(zhuǎn)速、油量、倒車?yán)走_(dá)的測(cè)距等,以及語(yǔ)音提示功能。
2、節(jié)點(diǎn)電路設(shè)計(jì)
在進(jìn)行硬件電路的設(shè)計(jì)時(shí),充分考慮了汽車安全、節(jié)能、可靠性的要求。根據(jù)當(dāng)前市場(chǎng)、開發(fā)工具和課題的實(shí)際需要,系統(tǒng)全部節(jié)點(diǎn)均以PHILIP P89C668HFA單片機(jī)為核心,它含有8K的RAM,足以保證運(yùn)行μCOSⅡ操作系統(tǒng)。
2.1 硬件通訊可靠性的設(shè)計(jì)
選用SJA1000作為CAN控制器,其內(nèi)部具有64位緩沖器,對(duì)總線具有一定的緩存能力。使用CAN控制器接口芯片82C250,它最初為汽車的高速通信應(yīng)用而設(shè)計(jì)的,該芯片提供CAN總線的差動(dòng)發(fā)送和接收能力,并具有抗汽車環(huán)境下的瞬間干擾,保護(hù)總線的能力,可以通過調(diào)整CAN總線上通信脈沖的斜率來降低射頻干擾。
2.2 硬件節(jié)能的設(shè)計(jì)
在汽車中電路設(shè)計(jì)首先要考慮各器件的耗電量。驅(qū)動(dòng)芯片選用MOTOROLA系列的汽車專用芯片,它除能夠滿足汽車上各個(gè)設(shè)備的需要并具有對(duì)短路,斷路,過流,過熱等故障進(jìn)行檢測(cè)、診斷和保護(hù)的功能外,而且其芯片靜態(tài)電流很小,如MC33288靜態(tài)電流小于10μA。另一方面要充分考慮控制電路板的電源消耗,除了主節(jié)點(diǎn)運(yùn)行外,其余各節(jié)點(diǎn)在汽車停放時(shí),通過主節(jié)點(diǎn)控制各節(jié)點(diǎn)的DC-DC的使能端切斷控制電源,在汽車啟動(dòng)時(shí),再通過主節(jié)點(diǎn)控制各節(jié)點(diǎn)的DC-DC的使能端使其正常運(yùn)行。
2.3 CAN電源的設(shè)計(jì)
汽車車身比較大,CAN電源和通訊的線路都比較長(zhǎng),為防止車身震動(dòng)和電源電壓波動(dòng),影響CAN通訊,車身前節(jié)點(diǎn)和車身后節(jié)點(diǎn)上各通過DC-DC芯片把12V直流電源整流成5V,并聯(lián)作為CAN電源使用。其節(jié)點(diǎn)的硬件設(shè)計(jì)很相似,圖2是前節(jié)點(diǎn)的硬件結(jié)構(gòu)圖。
2.4 開關(guān)量檢測(cè)電路設(shè)計(jì)
汽車所有開關(guān)量,通過I2C總線用8574芯片擴(kuò)展的I/O口進(jìn)行檢測(cè),同時(shí)把一個(gè)節(jié)點(diǎn)上的所有8574芯片的INT引腳和P89C668的INT1(中斷1)線相連, CAN總線的中斷是利用CPU的INT0(即外部中斷0)。
3、系統(tǒng)軟件設(shè)計(jì)
整個(gè)系統(tǒng)的軟件可分為編譯軟件、上位機(jī)的軟件和系統(tǒng)節(jié)點(diǎn)軟件三個(gè)部分。
3.1 編譯軟件
主要是把用漢字書寫的汽車上各個(gè)器件的邏輯關(guān)系(規(guī)則式),(例如: [<變光開關(guān):近光]&[<燈光開關(guān):大燈]==[>前照燈:遠(yuǎn)光] &[Delay:5s]&[>前照燈:滅]),根據(jù)具體的CAN協(xié)議和μCOSⅡ嵌入式操作系統(tǒng)所定義消息的要求編譯成單片機(jī)能認(rèn)識(shí)的代碼,從而保證了程序的兼容性和有利于汽車功能的擴(kuò)展,同時(shí)也可以移植到其它型號(hào)的汽車上。
3.2 上位機(jī)的軟件
主要是通過USBCAN適配卡對(duì)CAN總線傳遞的報(bào)文進(jìn)行監(jiān)聽,這樣對(duì)整個(gè)CAN上的設(shè)備和裝置可以起到較好的監(jiān)控作用,以便能方便地進(jìn)行系統(tǒng)調(diào)試。
3.3 系統(tǒng)節(jié)點(diǎn)軟件軟件
主程序基于μCOSⅡ嵌入式操作系統(tǒng)實(shí)現(xiàn)多任務(wù)實(shí)時(shí)控制。各節(jié)點(diǎn)采集,檢測(cè)各自的數(shù)字量,模擬量,脈沖量,以CAN協(xié)議的格式形成報(bào)文(即消息)發(fā)送到總線上,同時(shí)根據(jù)需要對(duì)多個(gè)設(shè)備對(duì)象進(jìn)行就地實(shí)時(shí)控制和監(jiān)視。通信軟件是系統(tǒng)節(jié)點(diǎn)軟件的關(guān)鍵部分,采用CAN2.0B通訊協(xié)議。通信軟件有3部分組成:主程序,初始化程序,發(fā)送程序和接收程序(即中斷0處理程序)。以下是基于μCOSⅡ嵌入式操作系統(tǒng)的簡(jiǎn)單框架和部分程序。
3.3.1 主函數(shù)
OSInit()和OSStart()是μCOSⅡ操作系統(tǒng)提供的源代碼,OSMboxCreate() 和OSTaskCreate()是μCOSⅡ操作系統(tǒng)分別用來產(chǎn)生郵箱和任務(wù)的函數(shù)[4]。
void main(void)
{
INTInit (); // 開通CPU的中斷;
CanInit(); //SJA1000的初始化;
OSInit(); //μCOSⅡ操作系統(tǒng)的初始化;
Timer0Init (); //定時(shí)器0的初始化;
MBoxPro=OSMboxCreate((void *)0); //創(chuàng)建存放從CAN上接收到的數(shù)據(jù)(消息)的郵箱;
MBoxSend=OSMboxCreate((void *)0); //創(chuàng)建存放所要發(fā)送數(shù)據(jù)(消息)的郵箱;
OSTaskCreate(TaskCanSend, (void *)0, &TaskCanSendSTK[0],7);
//創(chuàng)建發(fā)送CAN數(shù)據(jù)的任務(wù);
OSTaskCreate(TaskMsgPro,(void*)0,&TaskProSTK[0],20);//創(chuàng)建處理消息的任務(wù);
OSStart(); //啟動(dòng)μCOSⅡ操作系統(tǒng);
}
3.3.2 初始化程序
初始化程序通過將CAN控制器的寄存器寫入控制字,確定CAN的工作方式。用P2.7作為選通信號(hào)與SJA1000的CS引腳相連,SJA1000的片內(nèi)寄存器和P89C668單片機(jī)寄存器是重疊編址的,因此SJA1000寄存器尋址時(shí)要定義成片外RAM尋址。
CanInit(void)
{ MODE = 0x09; //進(jìn)入復(fù)位模式,對(duì)SJA1000進(jìn)行初始化;
CDR =0x88; //選擇PeliCan;
CMR = 0x0C; //清除數(shù)據(jù)溢出和釋放接收緩沖器;
IER = 0x03; //開放接收中斷和發(fā)送中斷;
ACR0 = 0x66; //根據(jù)具體的協(xié)議定義;
ACR1 = 0x66; //根據(jù)具體的協(xié)議定義;
ACR2 = 0x66; //根據(jù)具體的協(xié)議定義;
ACR3 =0x66; //根據(jù)具體的協(xié)議定義;
AMR0 = 0x00; //根據(jù)具體的協(xié)議定義;
AMR1 = 0x00; //根據(jù)具體的協(xié)議定義;
AMR2 = 0x00; //根據(jù)具體的協(xié)議定義;
AMR3 = 0x07; //低三位SJA1000是保留位,設(shè)置為無關(guān);
BTR0 = 0x02; //12MHz晶振下,設(shè)置波特率為100kbps;
BTR1 =0x2F;
OCR=0XAA;
EWLR =0x60;
RBSA = 0x00; //RX緩存器起始地址寄存器設(shè)置為0;
TXERR= 0x00;
ECC =0x00;
MODE= 0x08; //單向?yàn)V波方式,進(jìn)入正常模式;
}
3.3.3 發(fā)送任務(wù)程序
要發(fā)送的報(bào)文的數(shù)據(jù)為兩個(gè)字節(jié)。
void TaskCansend(void *scddata) reentrant
{ INT8U err;
unsigned char xdata *ptbuf;//SJA1000的寄存器定義成片外RAM;
unsigned char i,status;
StrYz *MesNeedSend; //郵箱接收?qǐng)?bào)文的格式,為結(jié)構(gòu)體;
scddata=scddata;
for(;;){
//不斷等待發(fā)送郵箱MboxCanSend是否有要發(fā)送的報(bào)文,若有報(bào)文則執(zhí)行發(fā)送任務(wù)。
MesNeedSend=(StrYz *)OSMboxPend(MBoxSend,0,&err);
ptbuf=0x7f10;
status=SR;
if ((status&0x10)==0x10) return ;
if ((status&0x08)==0x0) return ;
if ((status&0x04)==0x0) return ;
for(i=0;i<=4;i++)
{
*ptbuf=SjaTran[i]; //發(fā)送1個(gè)字節(jié)的報(bào)文幀信息和4字節(jié)的報(bào)文ID碼;
ptbuf++;
}
*ptbuf=Val ; //發(fā)送的消息即報(bào)文:第一個(gè)字節(jié);
ptbuf++;
*ptbuf= ID; //發(fā)送的消息即報(bào)文:第二個(gè)字節(jié);
CMR=0x01;
return ; } }
3.3.4 接收中斷服務(wù)子程序
SJA1000報(bào)文的接收有兩種方式:中斷接收方式和查詢接收方式。鑒于對(duì)汽車通訊的實(shí)時(shí)性要求很強(qiáng),因此采用中斷接收方式.當(dāng)SJA1000接收緩存器滿時(shí),其內(nèi)部接收中斷標(biāo)志位置位,并使得CPU的外部中斷INT0為高電平,產(chǎn)生中斷。因中斷比μCOSⅡ操作系統(tǒng)的其它任務(wù)優(yōu)先級(jí)高,則μCOSⅡ操作系統(tǒng)立即響應(yīng)并進(jìn)行保護(hù)現(xiàn)場(chǎng)和任務(wù)調(diào)度,進(jìn)入下面的CAN中斷接收程序,當(dāng)執(zhí)行完后,恢復(fù)現(xiàn)場(chǎng),進(jìn)行任務(wù)切換。鑒于每次發(fā)送一個(gè)幀數(shù)據(jù)(含有消息),為了防止一個(gè)開關(guān)動(dòng)作而發(fā)送幾個(gè)消息(非連續(xù)發(fā)送),根據(jù)SJA1000的機(jī)理,每接收一次釋放一次,如果當(dāng)前的消息沒有及時(shí)地發(fā)送到要處理消息的郵箱MsgPro,從而造成當(dāng)前的消息被后來的消息覆蓋,因此在CPU開辟一段RAM空間作為緩存區(qū)即StrYz StrCanRE[10],來保存要處理的消息,這也是實(shí)現(xiàn)可靠通訊的需要。
StrYz StrCanRE[10];
INT8U IStrCanRE=0;
void TaskCanRec(void) reentrant
{ unsigned char status;
unsigned char xdata * prbuf; //定義指向SJA1000寄存器的指針;
status=SR; //讀狀態(tài)并去SJA1000的中斷標(biāo)志位;
status=status&0xC3;
if(status!=0)
{ if((status&0x80)==0x80) { MODE=0x00;return;}
if((status&0x2)==0x02) {CMR=0x0C;return; }
if((status&0x01)==0x01 )
{ if((*prbuf & 0x40)==0x40) CMR=0x04; //是否遠(yuǎn)程禎;
else { ptbuf=0x7f15; //接收后兩個(gè)字節(jié)的數(shù)據(jù)(消息);
StrCanRE[IStrCanRE].Val=*ptbuf; //接收第一個(gè)字節(jié)數(shù)據(jù);
ptbuf++;
StrCanRE[IStrCanRE].ID=*ptbuf; //接收第二個(gè)字節(jié)數(shù)據(jù);
CMR=0x04;
//把從CAN總線上接收到的消息發(fā)送到要處理消息的郵箱MsgPro;
OSQPost(MBoxPro,(void * )&StrCanRE[IStrCanRE]);
IStrCanRE++;
if( IStrCanRE >= 10 ) IStrCanRE = 0;
}} }
return;
}
4、結(jié)束語(yǔ)
總之,就像汽車電子技術(shù)在20世紀(jì)70年代引入集成電路、80年代引入微處理器一樣,90年代直到21世紀(jì)初總線技術(shù)在汽車電子技術(shù)中將是一個(gè)重要的里程碑。目前國(guó)內(nèi)還沒有自主產(chǎn)權(quán)的CAN總線技術(shù)在汽車工業(yè)中應(yīng)用,但是許多高校和科研單位都在加緊這方面的研究和開發(fā)。本文在這一領(lǐng)域做了有益的探索和大膽的嘗試,實(shí)踐證明,CAN技術(shù)是成功的。它必將以其低成本,高可靠性及靈活的通訊方式推動(dòng)我國(guó)汽車工業(yè)的發(fā)展。
文章版權(quán)歸西部工控xbgk所有,未經(jīng)許可不得轉(zhuǎn)載。