陳 飛 謝 建
(中國(guó)人民解放軍第二炮兵工程大學(xué),西安 710025)
某大型機(jī)電設(shè)備信息檢測(cè)仍采用傳統(tǒng)的檢測(cè)系統(tǒng)體制,即各檢測(cè)點(diǎn)位傳感器信息單獨(dú)傳輸至上位機(jī)進(jìn)行處理,一臺(tái)設(shè)備包含幾百個(gè)傳感器,匯總至上位機(jī)的信號(hào)線就有幾百甚至上千根,使得整個(gè)信息檢測(cè)系統(tǒng)復(fù)雜臃腫、可靠性差、故障排除困難。而控制器局域網(wǎng)CAN(Controller Area Net)作為一種全數(shù)字化、全分散、全透明、標(biāo)準(zhǔn)化、規(guī)格化的串行現(xiàn)場(chǎng)總線技術(shù),具有可靠性高、實(shí)時(shí)性好、靈活及價(jià)格低廉等優(yōu)點(diǎn)[1]。利用其對(duì)該大型機(jī)電設(shè)備的信息檢測(cè)系統(tǒng)進(jìn)行改制,硬件上僅需對(duì)原有的各類傳感器加裝CAN通信接口。但是,對(duì)于多個(gè)節(jié)點(diǎn)同時(shí)上傳報(bào)文的情況,CAN采用的是帶優(yōu)先權(quán)的非破壞性逐位仲裁機(jī)制來(lái)解決總線沖突,當(dāng)總線上的節(jié)點(diǎn)數(shù)較多時(shí),若繼續(xù)采用一般的固定優(yōu)先級(jí)方式進(jìn)行報(bào)文的定時(shí)自動(dòng)上傳,將導(dǎo)致節(jié)點(diǎn)沖突頻繁,低優(yōu)先級(jí)報(bào)文傳輸延時(shí)大為延長(zhǎng),特別是在某節(jié)點(diǎn)檢測(cè)到異常信號(hào)或發(fā)生故障時(shí),很難在第一時(shí)間被發(fā)現(xiàn)和定位。為解決此類問(wèn)題,筆者提出循環(huán)問(wèn)答和重要信息優(yōu)先權(quán)搶占相結(jié)合的信息調(diào)度機(jī)制。并依據(jù)實(shí)際設(shè)備的工作特點(diǎn),設(shè)計(jì)基于CAN總線的狀態(tài)信息檢測(cè)系統(tǒng),制定了應(yīng)用于系統(tǒng)的CAN應(yīng)用層協(xié)議。
基于CAN總線的狀態(tài)信息檢測(cè)系統(tǒng)組成如圖1所示,包括監(jiān)控主機(jī)、CAN通信接口和狀態(tài)信息采集節(jié)點(diǎn)3部分。系統(tǒng)采用自帶CAN總線接口的STM32F103C8T6微控制器作為下位機(jī)控制單元,完成采集數(shù)據(jù)的實(shí)時(shí)處理和應(yīng)用層、數(shù)據(jù)鏈路層的工作,各節(jié)點(diǎn)采用CAN總線通信。監(jiān)控計(jì)算機(jī)通過(guò)CAN網(wǎng)絡(luò)適配器對(duì)各節(jié)點(diǎn)進(jìn)行管理,接收并處理各點(diǎn)位傳感器采集的數(shù)據(jù)[2]。
圖1 狀態(tài)信息檢測(cè)系統(tǒng)組成
選擇STM32F103C8T6作為下位機(jī)節(jié)點(diǎn)主控制器。STM32F103C8T6是中等容量的STM32產(chǎn)品,具有體積小、功耗低及性價(jià)比高的特點(diǎn),它基于ARM的Cortex-M3內(nèi)核,工作頻率72MHz,具有64KByte的系統(tǒng)內(nèi)可編程Flash、20KByte的SRAM、37個(gè)可獨(dú)立編程的I/O、2個(gè)16通道12位轉(zhuǎn)換精度的ADC、1個(gè)CAN接口、2個(gè)DMA控制器(DMA1有7個(gè)通道,DMA2有5個(gè)通道)和3個(gè)16位通用定時(shí)器,完全可滿足本設(shè)計(jì)需要和后續(xù)擴(kuò)展的要求。其本身集成的bxCAN控制器,支持CAN2.0A和2.0B協(xié)議,位通信波特率可達(dá)1Mbit/s,支持11位標(biāo)準(zhǔn)幀格式和29位擴(kuò)展幀格式的接收與發(fā)送,具備3個(gè)發(fā)送郵箱和2個(gè)接收FIFO,此外還有14個(gè)可編程的過(guò)濾器組,完全符合J1939規(guī)范[3]。
常用的變送器輸出量都是標(biāo)準(zhǔn)電流(4~20mA)或標(biāo)準(zhǔn)電壓信號(hào)(0~10V)。設(shè)計(jì)中為簡(jiǎn)化電路,采用STM32F103C8T6的片內(nèi)ADC進(jìn)行模數(shù)轉(zhuǎn)換,而其參考電壓為3.3V,因此要先把變送器的輸出信號(hào)轉(zhuǎn)換為0.0~3.3V范圍內(nèi)的電壓信號(hào),再進(jìn)行模數(shù)轉(zhuǎn)換。
Linear公司的LT1793放大器輸入阻抗大(1013Ω),輸入偏置電流很低,一般為3pA,最大為10pA,具體電路如圖2、3所示,其I/V轉(zhuǎn)換電路和電壓衰減電路精度高、線性程度好、結(jié)構(gòu)簡(jiǎn)單。
上位機(jī)節(jié)點(diǎn)由PC機(jī)進(jìn)行監(jiān)控,涉及CAN協(xié)議和USB協(xié)議,設(shè)計(jì)中直接利用ZLG的USBCAN-2A接口卡作為網(wǎng)絡(luò)適配器實(shí)現(xiàn)上位機(jī)與CAN總線的數(shù)據(jù)交換,因此這里僅需要對(duì)下位機(jī)節(jié)點(diǎn)的接口電路進(jìn)行設(shè)計(jì)。圖4為STM32的CAN控制器與物理總線之間的接口電路。
圖2 I/V轉(zhuǎn)換電路
圖3 電壓衰減電路
圖4 CAN控制器與物理總線接口電路
在接口的CAN_H和CAN_L之間連接一個(gè)120Ω的電阻R4進(jìn)行總線上的阻抗匹配,減小了因長(zhǎng)距離傳輸所產(chǎn)生的反射波干擾強(qiáng)度。在CAN_H和CAN_L上各自串聯(lián)一個(gè)5Ω的限流電阻,可保護(hù)收發(fā)器免受過(guò)流沖擊,并通過(guò)一組上拉電阻R2、R7進(jìn)行阻抗匹配,從而有效抑制反射波的干擾,保持總線穩(wěn)定在較高阻抗時(shí)接收端收到的始終是隱性電平。另外,在CAN_H和CAN_L與地之間并聯(lián)兩個(gè)瞬態(tài)二極管D1、D2,可以提高接口抗瞬變干擾的能力。設(shè)計(jì)中選用雙通道數(shù)字隔離器ADuM1201芯片來(lái)隔離SN65HVD與STM32F103C8T6的電源線和地線,采用兩組電源模塊負(fù)責(zé)供電,很好地避免了CAN收發(fā)器和控制器之間的互相干擾,相較于傳統(tǒng)的光電隔離器,采用ADuM1201簡(jiǎn)化了電路設(shè)計(jì),提高了傳輸性能,降低了系統(tǒng)功耗[4]。
CAN網(wǎng)絡(luò)通信協(xié)議僅解決了數(shù)據(jù)發(fā)送、接收及錯(cuò)誤處理等底層硬件數(shù)據(jù)傳輸問(wèn)題,對(duì)于應(yīng)用層數(shù)據(jù)并沒(méi)有規(guī)定相應(yīng)的解析協(xié)議,應(yīng)用層協(xié)議需要使用者自定。主要需確定幀格式、總線資源的分配及報(bào)文各位域功能定義等問(wèn)題。
考慮到系統(tǒng)的擴(kuò)展性,協(xié)議采用擴(kuò)展幀格式進(jìn)行報(bào)文傳輸。總線資源的分配是指總線上各節(jié)點(diǎn)和各傳感器地址的分配。而位域的功能定義涉及異常報(bào)警指示、異常類型的確定及應(yīng)答信息的標(biāo)識(shí)等。根據(jù)系統(tǒng)要實(shí)現(xiàn)正常運(yùn)行時(shí)網(wǎng)絡(luò)負(fù)載的穩(wěn)定性和節(jié)點(diǎn)檢測(cè)的可控性、有序性,當(dāng)有檢測(cè)量超限、突變或掉線發(fā)生時(shí),此類重要信息能夠?qū)崟r(shí)通知監(jiān)控節(jié)點(diǎn),筆者提出了循環(huán)問(wèn)答和重要信息優(yōu)先權(quán)搶占相結(jié)合的調(diào)度機(jī)制,并在此基礎(chǔ)上制定了適合本系統(tǒng)的應(yīng)用層協(xié)議。
根據(jù)圖5所示的報(bào)文標(biāo)識(shí)符分配規(guī)則,劃分出3種類型的系統(tǒng)應(yīng)用幀,包括上位機(jī)向檢測(cè)節(jié)點(diǎn)發(fā)送的數(shù)據(jù)請(qǐng)求幀、檢測(cè)節(jié)點(diǎn)向上位機(jī)發(fā)送的數(shù)據(jù)響應(yīng)幀、檢測(cè)節(jié)點(diǎn)向上位機(jī)發(fā)送的異常報(bào)警幀,異常位為0(顯性)是異常報(bào)警幀,應(yīng)答位為1(隱性)是數(shù)據(jù)響應(yīng)幀,異常位為1、應(yīng)答位為0是數(shù)據(jù)請(qǐng)求幀。3類報(bào)文的優(yōu)先級(jí)為:異常報(bào)警幀最高,數(shù)據(jù)響應(yīng)幀次之,數(shù)據(jù)請(qǐng)求幀最低。當(dāng)存在總線競(jìng)爭(zhēng)時(shí),優(yōu)先級(jí)高的報(bào)文獲得總線使用權(quán)。
圖5 報(bào)文標(biāo)識(shí)符分配規(guī)則
下位機(jī)軟件設(shè)計(jì)和調(diào)試采用針對(duì)各種嵌入式處理器的軟件開發(fā)工具Keil MDK。它集成了μUision集成開發(fā)環(huán)境和RealView編譯器,同時(shí)包含了眾多的案例模板和固件實(shí)例,支持多種調(diào)試接口(如UART、JTAG及JLINK等)[5]。ST公司提供了一個(gè)完整的STM32設(shè)備固件庫(kù),該固件庫(kù)包含了STM32設(shè)備所有外設(shè)的底層驅(qū)動(dòng)函數(shù),設(shè)計(jì)中直接利用這些底層函數(shù)進(jìn)行應(yīng)用程序的編寫,可大為減小開發(fā)難度,縮短開發(fā)周期。
下位機(jī)節(jié)點(diǎn)的主程序流程如圖6所示,配置ADC工作于DMA(存儲(chǔ)器直接存取)模式,在該模式下ADC在每次轉(zhuǎn)換結(jié)束后申請(qǐng)一次DMA傳輸,DMA隨后將該轉(zhuǎn)換結(jié)果傳輸?shù)街付繕?biāo)地址。這樣就避免了普通轉(zhuǎn)換模式下,由ADC不斷向CPU請(qǐng)求中斷以通知CPU轉(zhuǎn)換完成,從而ADC可以不受影響地進(jìn)行連續(xù)的轉(zhuǎn)換工作,同時(shí)也釋放了CPU的工作空間。
圖6 主程序流程
各檢測(cè)節(jié)點(diǎn)都設(shè)置了CAN接收中斷和異常報(bào)警中斷,如圖7、8所示。驗(yàn)收過(guò)濾器的配置在CAN控制器初始化時(shí)完成。當(dāng)上位機(jī)向CAN總線發(fā)送遠(yuǎn)程幀請(qǐng)求數(shù)據(jù)服務(wù)時(shí),CAN控制器只接收標(biāo)識(shí)符與驗(yàn)收濾波器相匹配的數(shù)據(jù)請(qǐng)求幀,存入接收緩沖區(qū),同時(shí)觸發(fā)CAN接收中斷服務(wù)程序,將ADC轉(zhuǎn)換結(jié)果打包成響應(yīng)請(qǐng)求的數(shù)據(jù)幀,上傳至CAN總線,而在主程序中設(shè)置節(jié)點(diǎn)故障檢測(cè)函數(shù),當(dāng)檢測(cè)到某傳感器采樣結(jié)果超限或?yàn)榱銜r(shí),觸發(fā)異常報(bào)警中斷服務(wù)程序,再次對(duì)異常進(jìn)行判定,而后上傳超限或者掉線異常報(bào)警幀。
圖7 CAN接收中斷服務(wù)
圖8 異常報(bào)警中斷服務(wù)
為測(cè)試各節(jié)點(diǎn)的通信能力并進(jìn)行后續(xù)的開發(fā),采用VC++6.0設(shè)計(jì)上位機(jī)監(jiān)控軟件。由于利用了USBCAN-2A作為總線接口卡,程序中僅需包含設(shè)備的動(dòng)態(tài)鏈接庫(kù)就能實(shí)現(xiàn)接口庫(kù)函數(shù)的直接調(diào)用。監(jiān)控軟件實(shí)現(xiàn)的功能主要有通信參數(shù)的設(shè)置、遠(yuǎn)程請(qǐng)求的發(fā)送及數(shù)據(jù)的處理和顯示等。
軟件有定點(diǎn)手動(dòng)測(cè)試和輪詢自動(dòng)測(cè)試兩種模式[6]。圖9為上位機(jī)軟件運(yùn)行界面。
圖9 上位機(jī)軟件運(yùn)行界面
闡述了基于CAN總線的某大型機(jī)電設(shè)備狀態(tài)信息檢測(cè)系統(tǒng)的設(shè)計(jì)過(guò)程。以集成CAN控制器的STM32F103C8T6芯片為核心,配合SN65HVD高性能CAN收發(fā)器和ADuM1201隔離器簡(jiǎn)化了電路的設(shè)計(jì),提高了接口的穩(wěn)定性,適用于各類典型傳感器的CAN接口改制。按監(jiān)控機(jī)輪詢檢測(cè)和節(jié)點(diǎn)異常搶占優(yōu)先權(quán)報(bào)警的思路設(shè)計(jì)適用于系統(tǒng)的應(yīng)用層協(xié)議,配合監(jiān)控軟件,實(shí)現(xiàn)了多傳感器的在線監(jiān)測(cè)和異常的遠(yuǎn)程實(shí)時(shí)定位。
[1] 饒運(yùn)濤.現(xiàn)場(chǎng)總線CAN原理與應(yīng)用技術(shù)[M].北京:北京航空航天大學(xué)出版社,2007.
[2] 趙永剛,劉曉霏,張國(guó)義,等.基于CAN總線的分布式測(cè)量系統(tǒng)設(shè)計(jì)[J].航天制造技術(shù),2013,(2):62~66.
[3] 李寧.基于MDK的STM32處理器開發(fā)應(yīng)用[M].北京:北京航空航天大學(xué)出版社,2008.
[4] 臧春華.綜合電子系統(tǒng)設(shè)計(jì)與研究[M].北京:北京航空航天大學(xué)出版社,2009.
[5] 張河新,王曉輝,黃曉東.基于STM32和CAN總線的智能數(shù)據(jù)采集節(jié)點(diǎn)設(shè)計(jì)[J].化工自動(dòng)化及儀表,2012,39(1):78~80.
[6] 劉銳寧.Visual C++編程寶典[M].北京:人民郵電出版社,2011.