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