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