文獻(xiàn)標(biāo)識碼: A
文章編號: 0258-7998(2013)07-0021-04
目前,CAN總線系統(tǒng)已經(jīng)成熟應(yīng)用在慣性姿態(tài)測量系統(tǒng)中,具有很好的實時性和抗干擾能力[1]。雖然CAN協(xié)議本身具有較強(qiáng)的檢錯糾錯能力,但在一些特殊應(yīng)用場合,比如高空長航的工作狀態(tài),或受惡劣天氣等環(huán)境的干擾,以及傳輸介質(zhì)損壞等都會嚴(yán)重影響CAN的可靠通信。在要求高可靠性的應(yīng)用系統(tǒng)中,解決這一問題的有效途徑是進(jìn)行CAN總線冗余設(shè)計[2-3]。本文針對浮空器慣性姿態(tài)測量系統(tǒng),基于兩片LPC11C24微控制器,設(shè)計實現(xiàn)了CAN總線冗余系統(tǒng)。
1 冗余系統(tǒng)設(shè)計
典型的CAN總線通信電路主要由微控制器、CAN總線控制器和CAN總線驅(qū)動器以及總線4部分組成[4]?;贑AN總線的冗余方法主要從3個環(huán)節(jié)進(jìn)行不同程度的冗余:有總線驅(qū)動器冗余、總線控制器冗余和全系統(tǒng)冗余3種。3種冗余方法各有優(yōu)缺點,其中全系統(tǒng)冗余方法可靠度最高[5]。全系統(tǒng)冗余方法由雙路CAN通信電路組成,需要的主要器件數(shù)為無冗余系統(tǒng)的2倍。傳統(tǒng)的慣性姿態(tài)測量系統(tǒng)由導(dǎo)航計算機(jī)作為微控制器,CAN總線節(jié)點設(shè)計需要CAN總線控制器、CAN總線驅(qū)動器以及相關(guān)電平轉(zhuǎn)換芯片。導(dǎo)航計算機(jī)屬于嵌入式產(chǎn)品,固定在載體的機(jī)械結(jié)構(gòu)上,幾何形狀和質(zhì)量都一般力求小型化。冗余設(shè)計器件數(shù)的增多不但會增加系統(tǒng)的成本和容量的開銷,而且使系統(tǒng)的構(gòu)成較復(fù)雜,也可能會引來新的錯誤。
本文選用LPC11C24微控制器來設(shè)計CAN總線冗余系統(tǒng),其基本架構(gòu)如圖1所示。LPC11C24是恩智浦(NXP)公司近年推出的一款Cortex-M0微控制器,內(nèi)嵌易用型片上CAN驅(qū)動,集成了高速CAN物理層收發(fā)器TJF1051,在低成本LQFP48封裝中實現(xiàn)了完整的CAN功能。LPC11C24的成本低、集成度高,是兼容CAN 2.0B的LPC11C00系列控制器的新成員之一,可為惡劣環(huán)境下的應(yīng)用帶來最佳性能[6]。基于LPC11C24的CAN總線冗余設(shè)計能充分利用該款芯片的優(yōu)勢,減少導(dǎo)航計算機(jī)的電氣互連,節(jié)省50%以上的電路,從而提高了整個系統(tǒng)的可靠性。
2 系統(tǒng)硬件設(shè)計
本文慣性姿態(tài)測量系統(tǒng)導(dǎo)航計算機(jī)采用DSP+FPGA架構(gòu),DSP主要實現(xiàn)導(dǎo)航姿態(tài)的實時解算和系統(tǒng)控制,F(xiàn)PGA集成系統(tǒng)所有的接口功能,包括CAN通信接口。CAN總線冗余系統(tǒng)是基于兩路LPC11C24最小系統(tǒng)來實現(xiàn)的,兩片LPC微控制器以主-從模式工作。其在導(dǎo)航計算機(jī)中的基本設(shè)計原理如圖2所示。
DSP輸出的主要是導(dǎo)航姿態(tài)信息,接收的信息主要是IMU數(shù)據(jù)、外部傳感器(GPS、磁強(qiáng)計等)數(shù)據(jù)以及相關(guān)指令信息。CAN通信模塊搭建在FPGA上,通過FPGA與DSP進(jìn)行數(shù)據(jù)交互,數(shù)據(jù)信息在FPGA內(nèi)部寄存器中緩沖。這樣的設(shè)計減少了DSP對外開銷,保證了導(dǎo)航姿態(tài)的實時解算以及與人機(jī)交互低速數(shù)據(jù)的匹配。FPGA與LPC微控制器的主要連接如下:
(1)數(shù)據(jù)線D0~D7:8根數(shù)據(jù)線,用于完成FPGA與LPC的數(shù)據(jù)交互。
(2)地址線A0~A4:5根地址線,最大數(shù)據(jù)交互的字節(jié)數(shù)不應(yīng)超過32,若超過,則需增加地址線。
(3)信號控制線:讀控制信號CAN_RE、寫控制信號CAN_RE、數(shù)據(jù)發(fā)送準(zhǔn)備完成信號CAN_RDY以及復(fù)位信號CAN_RST。
兩LPC微控制器共用數(shù)據(jù)線D0~D7和數(shù)據(jù)發(fā)送準(zhǔn)備完成信號線CAN_RDY,數(shù)據(jù)線和地址線通過GPIO口實現(xiàn)。數(shù)據(jù)發(fā)送準(zhǔn)備完成后,同時觸發(fā)兩LPC微控制器INT,INT通過定時器捕獲外部事件中斷來實現(xiàn)。復(fù)位信號由FPGA產(chǎn)生一個低電平實現(xiàn),讀寫控制信號在FPGA與CAN通信數(shù)據(jù)交互過程中分別有效。
實現(xiàn)CAN通信功能還需搭建LPC微控制器最小系統(tǒng)。LPC最小系統(tǒng)主要包括供電電源、外部時鐘和調(diào)試接口。LPC微控制器所需電壓3.3 V由導(dǎo)航計算機(jī)電源模塊提供。本文采用12 MHz外部時鐘給系統(tǒng)提供基準(zhǔn)時鐘。由于LPC1100系列Cortex-M0不再支持JTAG調(diào)試模式,所以調(diào)試接口采用SWD串行調(diào)試模式。兩總線輸出之間連接EMI濾波器,濾除總線上的高頻干擾。此外,兩LPC之間有兩交互信號,分別為EN0和EN1,EN0是發(fā)出故障切換信號,EN1是接受處理信號,或稱之使能CAN通信信號。工作過程中,使能一個CAN的同時禁用一個CAN。
3 系統(tǒng)軟件設(shè)計
CAN總線冗余系統(tǒng)采用兩條完全獨立的CAN總線,實現(xiàn)系統(tǒng)的物理層和數(shù)據(jù)鏈路層全面冗余。
系統(tǒng)上電復(fù)位后,初始化兩路 CAN 總線;一路CAN總線中斷開啟,處于正常運行狀態(tài),另一路CAN總線中斷關(guān)閉,處于備用狀態(tài);系統(tǒng)采用兼容兩種觸發(fā)方式的報文分配方式,將傳輸報文分為周期傳送報文(時間觸發(fā))與非周期傳送報文(事件觸發(fā)),其中導(dǎo)航姿態(tài)信息為20 ms周期報文,控制報文為非周期報文。慣性姿態(tài)測量系統(tǒng)平時不輸出任何報文,當(dāng)控制報文控制其啟動后才按照總線調(diào)度策略進(jìn)行輸出,完成導(dǎo)航測姿功能。CAN總線冗余系統(tǒng)設(shè)計主要實現(xiàn)兩部分功能:一為單路通信程序設(shè)計,二為雙路總線切換設(shè)計。冗余系統(tǒng)的工作流程如圖3所示。
3.1 單路CAN通信程序設(shè)計
CAN節(jié)點通信過程主要包括系統(tǒng)初始化、CAN報文接收、CAN報文發(fā)送和CAN中斷處理等。其中系統(tǒng)初始化主要包括系統(tǒng)配置初始化、管腳初始化、定時器初始化以及CAN模塊初始化等。LPC11C24微控制器中包含了C_CAN片上驅(qū)動,片上驅(qū)動程序存放在引導(dǎo)ROM中,并通過定義好的API向用戶應(yīng)用程序提供CAN初始化和通信特性[7]。下列幾個常用的函數(shù)包含在API中,其調(diào)用實現(xiàn)如下:
(1)CAN控制器的初始化是在基于寄存器的陣列值上實現(xiàn)的,這些值通過指針來進(jìn)行傳遞。CAN初始化調(diào)用范例如下:
void CAN_init()
{
ROM **rom =(ROM **)0x1fff1ff8;
uint32_t CanApiClkInitTable[2] = {
0x00000000UL, //晶振時鐘分頻數(shù)
0x00007EC3UL };//位定時寄存器配置7EC3:24;
//CAN通信速率為500 kb/s
(*rom)->pCANAPI->init_can(&CanApiCanInitTable
[0]);
}
(2)CAN發(fā)送函數(shù)允許設(shè)置報文對象,并可在總線上觸發(fā)CAN報文的傳送;報文編號隨著每一次通信而增加,而且可用于監(jiān)控引入的信息。當(dāng)超過255時,信息代碼會歸零。這使得網(wǎng)絡(luò)中的任意節(jié)點可以通過報文編號來測定報文的進(jìn)程和正確的順序,以進(jìn)行檢查。發(fā)送函數(shù)如下:
void CAN_send( )
{
msg_obj.msgobj = 2;//報文對象
msg_obj.mode_id= 0x001UL;//報文對象編號
msg_obj.mask = 0x0UL;//不屏蔽任何ID
msg_obj.dlc = 1;//數(shù)據(jù)長度
msg_obj.data[0] = 0x00;
(*rom)->pCAND->can_transmit(&msg_obj);
}
(3)CAN接收函數(shù)在調(diào)用之前,必須在結(jié)構(gòu)體中設(shè)置要被讀取的報文對象的編號,這樣指向報文對象結(jié)構(gòu)的指針會被傳遞到接收函數(shù)中。其實現(xiàn)如下:
void CAN_receive( )
{
msg_obj.msgobj = 1;
(*rom)->pCAND->can_receive(&msg_obj);
}
(4)用戶應(yīng)用程序必須為CAN中斷提供中斷處理程序才能處理CAN事件,調(diào)用回調(diào)函數(shù),并根據(jù)CAN總線上接收到的數(shù)據(jù)和檢查到的狀態(tài)采取相關(guān)的操作。CAN中斷處理程序調(diào)用如下:
(*rom)->pCAND->isr();
(5)CAN API支持各種事件的回調(diào)函數(shù),包括報文發(fā)送、報文接收和錯誤處理等?;卣{(diào)函數(shù)通過API函數(shù)來發(fā)布,CAN中斷處理程序會按照中斷級別來調(diào)用CAN回調(diào)函數(shù)。注冊回調(diào)表如下:
const CAN_CALLBACKS callbacks =
{
CAN_rx,
CAN_tx,
CAN_error,
};
3.2 雙路CAN總線切換設(shè)計
雙CAN總線冗余采用熱備方式運行。一個CAN控制器作為系統(tǒng)上電后默認(rèn)的CAN,另一個為系統(tǒng)的備用CAN。系統(tǒng)正常工作時,投入運行的CAN稱為主CAN,另一路稱為從CAN。當(dāng)主CAN發(fā)生故障時,從CAN總線投入運行。系統(tǒng)運行時,要求兩路CAN控制器處于熱備狀態(tài),經(jīng)初始化后都隨時準(zhǔn)備接收信息,但是在一個時間點上,系統(tǒng)中有且僅有一路CAN通道在工作,另一路處于監(jiān)聽狀態(tài)(正常工作時)或故障狀態(tài)(發(fā)生故障時)。實現(xiàn)CAN總線系統(tǒng)的全面冗余,主要解決總線故障的自動檢測和總線的切換問題。
CAN2.0協(xié)議中規(guī)定節(jié)點處于錯誤激活態(tài)、忽略錯誤態(tài)、脫離總線態(tài)3種狀態(tài)之一[8]。總線正常工作時處于錯誤激活狀態(tài),利用CAN總線控制器的故障界定機(jī)制可以判斷總線錯誤。硬件初始化后錯誤計數(shù)器為0,控制器檢測到錯誤后將發(fā)送/接收錯誤計數(shù)器的值遞增。當(dāng)發(fā)送或者接收錯誤計數(shù)值大于127時,總線狀態(tài)為忽略錯誤態(tài),可能的原因是CANH、CANL斷開;當(dāng)總線發(fā)送或者接收錯誤計數(shù)值大于255時,總線狀態(tài)為脫離總線態(tài),可能的原因是CANH與CANL短路,或者CANH與地短路,或者CANL與電源短路。在錯誤狀態(tài)發(fā)生時,需立即執(zhí)行總線切換操作。
系統(tǒng)運行時,如兩路CAN(CAN0和CAN1)都運行良好,則選取CAN0作為默認(rèn)主CAN,CAN1處于關(guān)閉狀態(tài),等待CAN0發(fā)出的使能信號,從CAN則隨時備用。當(dāng)主CAN發(fā)生錯誤狀態(tài)時,讀取錯誤狀態(tài)寄存器,同時觸發(fā)CAN1使能引腳,CAN1給出響應(yīng)并禁用CAN0,響應(yīng)完畢后,開啟CAN1,兩CAN主從模式切換。CAN0處于故障狀態(tài),等待修復(fù),若修復(fù)完畢,即可作為從CAN備用,在下一次出現(xiàn)故障時由CAN1給出使能信號啟動;若沒有及時修復(fù),則系統(tǒng)處于無冗余狀態(tài),若再次出現(xiàn)故障,則禁止系統(tǒng)運行。
4 測試與驗證
要驗證本文設(shè)計的CAN總線冗余系統(tǒng)的有效性,需搭建測試平臺進(jìn)行實驗。實驗軟件環(huán)境包括TKScope嵌入式智能仿真開發(fā)平臺、ZLGCANTset監(jiān)測軟件以及串口調(diào)試助手等。硬件環(huán)境包括AK100仿真器、USBCAN模塊以及基于導(dǎo)航計算機(jī)的雙LPC組成的CAN冗余電路等。實驗過程主要是對單路CAN通信功能和雙路冗余功能進(jìn)行測試。
(1)單路CAN通信功能測試。單路CAN通信的功能測試主要包括CAN的收發(fā),以及I/O口的中斷、數(shù)據(jù)交互等。為了便于調(diào)試,隔離開導(dǎo)航計算機(jī)中DSP模塊,采用上位機(jī)串口進(jìn)行模擬。首先由上位機(jī)串口模擬發(fā)送導(dǎo)航姿態(tài)信息,周期為20 ms,F(xiàn)PGA收取數(shù)據(jù)至內(nèi)部緩存器,然后由LPC讀取并發(fā)送至CAN總線上。同樣,CAN模塊可以接收總線上的報文信息,產(chǎn)生中斷讀取并轉(zhuǎn)發(fā)至上位機(jī)串口顯示。測試過程中, CANTest監(jiān)測軟件收發(fā)和串口調(diào)試助手發(fā)收數(shù)據(jù)一致,表明CAN通信正常。
(2)雙CAN冗余功能測試。冗余功能測試是在完成了單路通信測試而且雙路CAN通信都能獨立正常工作的基礎(chǔ)上進(jìn)行的。實驗過程中,需增加一個USBCAN模塊。首先,系統(tǒng)上電正常工作時,只有CAN0處于運行狀態(tài),而且其基本通信功能正常,CAN1總線處于關(guān)閉狀態(tài);手動斷開CAN0總線,CAN1總線啟動,CAN0總線關(guān)閉;接好CAN0總線,手動斷開CAN1總線,CAN1總線關(guān)閉,CAN0總線恢復(fù)。圖4給出了在CAN模塊發(fā)送數(shù)據(jù)過程中,CAN0總線發(fā)生故障時,數(shù)據(jù)切換到CAN1總線上的情況。實驗測試過程中,主CAN出現(xiàn)故障,能及時切換到從CAN運行,有較強(qiáng)的容錯性。
采用雙LPC設(shè)計實現(xiàn)的CAN總線冗余系統(tǒng)節(jié)約了導(dǎo)航計算機(jī)的成本和空間的開銷,而且開發(fā)過程中充分利用了LPC控制器片上CAN驅(qū)動模塊中的API函數(shù),縮短了開發(fā)周期。CAN總線冗余系統(tǒng)的設(shè)計增強(qiáng)了系統(tǒng)對環(huán)境的應(yīng)對能力,有效提高了浮空器慣性姿態(tài)測量系統(tǒng)可靠性。
參考文獻(xiàn)
[1] 宋凝芳,任磊,林恒,等.光纖陀螺捷聯(lián)航姿系統(tǒng)CAN總線設(shè)計[J].中國慣性技術(shù)學(xué)報,2008,16(1):16-19.
[2] 杜倩倩.雙冗余CAN總線模塊研制[D].哈爾濱:哈爾濱工業(yè)大學(xué),2011.
[3] 禹春來,許化龍,劉根旺,等.CAN總線冗余方法研究[J].測控技術(shù),2003,22(10):28-30.
[4] 莫傳孟.CAN總新冗余通信在機(jī)車控制系統(tǒng)中的應(yīng)用研究[D].成都:西南交通大學(xué),2003.
[5] 湯宜涌,王傳德.CAN總線冗余系統(tǒng)的研究及可靠性分析[J].中原工學(xué)院學(xué)報,21(5):73-75.
[6] LPC11Cx2/Cx4 Product data sheet(Rev.2-3)[M].廣州周立功單片機(jī)公司,2010.
[7] LPC11C1x系列微控制器用戶手冊(Rev.00.13)[M].廣州周立功單片機(jī)公司,2010.
[8] 汪孟寅,高明煜.基于STM32F105微控制器的雙CAN冗余設(shè)計[J].杭州電子科技大學(xué)學(xué)報,2011,31(2):9-12.