索明何,薛福霞,劉瓊瓊,馬培真
(1.江蘇電子信息職業(yè)學(xué)院,江蘇 淮安 223003;2.南京航空航天大學(xué) 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,江蘇 南京 211106;3.國(guó)網(wǎng)(北京)綜合能源規(guī)劃設(shè)計(jì)研究院有限公司,北京 100052)
CAN是由德國(guó)Bosch公司針對(duì)汽車電子領(lǐng)域開(kāi)發(fā)的符合國(guó)際標(biāo)準(zhǔn)的現(xiàn)場(chǎng)總線,具有很強(qiáng)的可靠性、安全性和實(shí)時(shí)性,被廣泛應(yīng)用于汽車電子、工業(yè)控制、農(nóng)業(yè)控制、機(jī)電產(chǎn)品等領(lǐng)域的分布式測(cè)控系統(tǒng)中。利用CAN可以很方便地實(shí)現(xiàn)多機(jī)聯(lián)網(wǎng)。為了使學(xué)習(xí)者能夠直觀地學(xué)習(xí)CAN的結(jié)構(gòu)與網(wǎng)絡(luò)測(cè)控原理,本文采用基于構(gòu)件化的嵌入式系統(tǒng)設(shè)計(jì)方法設(shè)計(jì)了基于CAN的分布式測(cè)控實(shí)驗(yàn)系統(tǒng)。
系統(tǒng)硬件設(shè)計(jì)方案如圖1所示,通過(guò)CAN總線將多個(gè)電控單元(簡(jiǎn)稱為節(jié)點(diǎn))組成局域網(wǎng),每個(gè)節(jié)點(diǎn)包括:MCU硬件最小系統(tǒng),開(kāi)關(guān)、鍵盤、A/D采樣、溫度傳感器等輸入設(shè)備,小燈、液晶顯示屏等輸出設(shè)備,CAN接口電路。通過(guò)CAN可實(shí)現(xiàn)某個(gè)節(jié)點(diǎn)(如節(jié)點(diǎn)C)對(duì)其他節(jié)點(diǎn)(如節(jié)點(diǎn)A和節(jié)點(diǎn)B)的檢測(cè)與控制功能。
圖1 系統(tǒng)硬件設(shè)計(jì)方案
根據(jù)圖1的方案,系統(tǒng)硬件設(shè)計(jì)主要包含兩部分:嵌入式核心硬件構(gòu)件(最小系統(tǒng))設(shè)計(jì)和嵌入式應(yīng)用外設(shè)硬件構(gòu)件設(shè)計(jì)?,F(xiàn)以圖2給出的開(kāi)關(guān)硬件構(gòu)件為例,說(shuō)明硬件構(gòu)件的設(shè)計(jì)及使用方法。圖2中SW為硬件構(gòu)件的接口注釋;PTC為硬件構(gòu)件的接口網(wǎng)標(biāo),具有電氣連接特性,表示硬件構(gòu)件的接口與MCU的引腳相連接。硬件構(gòu)件移植和復(fù)用在不同應(yīng)用系統(tǒng)中時(shí),僅須修改接口網(wǎng)標(biāo)。
圖2 開(kāi)關(guān)硬件構(gòu)件與MCU引腳的連接
為了實(shí)現(xiàn)嵌入式軟件的可移植和可復(fù)用,增強(qiáng)其可維護(hù)性,嵌入式軟件采用“構(gòu)件化”設(shè)計(jì)方法和軟件分層的設(shè)計(jì)思想。
在嵌入式技術(shù)基礎(chǔ)實(shí)踐中,一般以MCU控制小燈閃爍作為入門實(shí)驗(yàn),對(duì)應(yīng)的程序框架稱為“嵌入式軟件最小系統(tǒng)”。表1給出了在Keil MDK集成開(kāi)發(fā)環(huán)境下的KEA128控制小燈閃爍程序的工程組織框架。
從表1可以看出,系統(tǒng)是按照“分門別類、各有歸處”的原則將文件進(jìn)行工程組織的,其中的04_Driver(MCU底層驅(qū)動(dòng)構(gòu)件)、05_App(應(yīng)用外設(shè)構(gòu)件)、06_Soft(通用軟件構(gòu)件)、07_Source(應(yīng)用層工程源程序構(gòu)件)的文件都是由本構(gòu)件的.h文件和.c文件組成的。在此框架下可通過(guò)添加其他構(gòu)件和修改應(yīng)用層程序來(lái)完成不同功能的軟件設(shè)計(jì)。若采用其他型號(hào)的MCU芯片,只需要對(duì)02_Core、03_MCU、04_Driver中的文件進(jìn)行相應(yīng)的替換,其他文件基本不需要改動(dòng)或做非常少量的改動(dòng)即可,以此實(shí)現(xiàn)了嵌入式軟件在不同MCU芯片之間的可移植和可復(fù)用。
表1 KEA128軟件最小系統(tǒng)(工程組織)框架及說(shuō)明表
現(xiàn)以開(kāi)關(guān)軟件設(shè)計(jì)為例,說(shuō)明嵌入式軟件構(gòu)件的設(shè)計(jì)方法及使用方法。圖2所示的開(kāi)關(guān)硬件構(gòu)件對(duì)應(yīng)的開(kāi)關(guān)軟件構(gòu)件由sw.h頭文件和sw.c源文件組成,若要使用開(kāi)關(guān)軟件構(gòu)件,只須將這兩個(gè)文件添加到所建工程的05_App(應(yīng)用外設(shè)構(gòu)件)文件夾中,即可實(shí)現(xiàn)對(duì)開(kāi)關(guān)的操作。
(1)開(kāi)關(guān)軟件構(gòu)件頭文件sw.h
CAN只使用了物理層、數(shù)據(jù)鏈路層和應(yīng)用層,從而提高了通信的實(shí)時(shí)性。其中數(shù)據(jù)鏈路層和物理層的協(xié)議分別由CAN控制器和CAN收發(fā)器硬件自動(dòng)實(shí)現(xiàn)。因此,CAN應(yīng)用系統(tǒng)軟件設(shè)計(jì)的主要任務(wù)是對(duì)其應(yīng)用層程序進(jìn)行設(shè)計(jì)。
2.3.1 CAN的應(yīng)用層協(xié)議制定
現(xiàn)以3個(gè)CAN節(jié)點(diǎn)(節(jié)點(diǎn)A、節(jié)點(diǎn)B和節(jié)點(diǎn)C)進(jìn)行通信為例,介紹基于CAN的分布式測(cè)控功能的設(shè)計(jì)與實(shí)現(xiàn)方法。在此對(duì)節(jié)點(diǎn)預(yù)接收的幀ID、發(fā)送或接收數(shù)據(jù)段的含義做表2所列的約定。
表2 CAN通信約定
3個(gè)節(jié)點(diǎn)通信均傳輸標(biāo)準(zhǔn)格式的數(shù)據(jù)幀,各節(jié)點(diǎn)通過(guò)驗(yàn)收過(guò)濾機(jī)制接收對(duì)應(yīng)ID的數(shù)據(jù)包:節(jié)點(diǎn)A和節(jié)點(diǎn)B向節(jié)點(diǎn)C發(fā)送本節(jié)點(diǎn)的檢測(cè)信息(被按下鍵的鍵名、電壓值、溫度值),并根據(jù)節(jié)點(diǎn)C的開(kāi)關(guān)狀態(tài)控制本節(jié)點(diǎn)的小燈狀態(tài);節(jié)點(diǎn)C接收來(lái)自節(jié)點(diǎn)A和節(jié)點(diǎn)B的檢測(cè)信息,并向節(jié)點(diǎn)A和節(jié)點(diǎn)B發(fā)送開(kāi)關(guān)狀態(tài)。3個(gè)節(jié)點(diǎn)均通過(guò)中斷方式接收來(lái)自CAN總線上的數(shù)據(jù),接收到對(duì)應(yīng)的數(shù)據(jù)包后,解析其數(shù)據(jù)段中的數(shù)據(jù),并執(zhí)行相應(yīng)的功能程序。
2.3.2 CAN節(jié)點(diǎn)的應(yīng)用層程序設(shè)計(jì)流程
節(jié)點(diǎn)A或節(jié)點(diǎn)B的主程序流程如圖3所示。在主循環(huán)中,節(jié)點(diǎn)A或節(jié)點(diǎn)B向CAN總線上發(fā)送各自節(jié)點(diǎn)的檢測(cè)信息(被按下鍵的鍵名、A/D轉(zhuǎn)換的電壓值、溫度傳感器DS18B20的溫度值);然后通過(guò)查詢CAN接收標(biāo)志判斷是否接收到CAN數(shù)據(jù),若接收到CAN數(shù)據(jù)(對(duì)應(yīng)節(jié)點(diǎn)C的開(kāi)關(guān)狀態(tài)),則節(jié)點(diǎn)A或節(jié)點(diǎn)B解析收到的CAN數(shù)據(jù),并根據(jù)節(jié)點(diǎn)C的開(kāi)關(guān)狀態(tài)控制本節(jié)點(diǎn)的小燈狀態(tài)。
圖3 節(jié)點(diǎn)A和節(jié)點(diǎn)B的主程序流程
節(jié)點(diǎn)A或節(jié)點(diǎn)B的定時(shí)中斷服務(wù)程序和CAN接收中斷服務(wù)程序流程分別如圖4(a)和圖4(b)所示。其中,在定時(shí)(10 ms)中斷服務(wù)程序中,每隔10 ms掃描一次鍵盤,這樣做既可有效消除按鍵抖動(dòng)帶來(lái)的影響,又能有效防止按鍵連擊現(xiàn)象,即1次按鍵只進(jìn)行1次解釋執(zhí)行。在CAN接收中斷服務(wù)程序中,接收CAN數(shù)據(jù),并更新CAN接收標(biāo)志,供主程序查詢。節(jié)點(diǎn)C的主程序流程如圖5所示。在主循環(huán)中,查詢開(kāi)關(guān)的狀態(tài),并分別向節(jié)點(diǎn)A和節(jié)點(diǎn)B發(fā)送其開(kāi)關(guān)狀態(tài);然后通過(guò)查詢CAN接收標(biāo)志判斷是否接收到CAN數(shù)據(jù),若接收到CAN數(shù)據(jù)(對(duì)應(yīng)節(jié)點(diǎn)A或節(jié)點(diǎn)B的檢測(cè)信息),則節(jié)點(diǎn)C解析收到的CAN數(shù)據(jù),并控制液晶屏實(shí)時(shí)顯示節(jié)點(diǎn)A和節(jié)點(diǎn)B的檢測(cè)信息。節(jié)點(diǎn)C的CAN接收中斷服務(wù)程序流程與圖4(b)相同,此處不再重述。
圖4 節(jié)點(diǎn)A和節(jié)點(diǎn)B的中斷服務(wù)程序流程
圖5 節(jié)點(diǎn)C的主程序流程
系統(tǒng)測(cè)試時(shí),首先要將3個(gè)節(jié)點(diǎn)對(duì)應(yīng)的程序分別下載至對(duì)應(yīng)的MCU中,然后需要通過(guò)導(dǎo)線分別將3個(gè)節(jié)點(diǎn)的CAN-H和CAN-L連接,組成基于CAN的局域網(wǎng),并將節(jié)點(diǎn)A和節(jié)點(diǎn)C作為終端節(jié)點(diǎn),對(duì)其設(shè)置終端電阻,以防止反射波干擾。
如圖6所示,給3個(gè)節(jié)點(diǎn)通電后,在節(jié)點(diǎn)C的液晶屏上實(shí)時(shí)顯示節(jié)點(diǎn)A和節(jié)點(diǎn)B的A/D轉(zhuǎn)換的電壓值及DS18B20的溫度。在轉(zhuǎn)動(dòng)節(jié)點(diǎn)A或節(jié)點(diǎn)B的ADC電位器的轉(zhuǎn)柄時(shí),節(jié)點(diǎn)C的液晶屏上將實(shí)時(shí)顯示隨之變化的電壓值。在改變節(jié)點(diǎn)A或節(jié)點(diǎn)B的DS18B20的溫度時(shí),節(jié)點(diǎn)C的液晶屏上也將實(shí)時(shí)顯示隨之變化的溫度值。分別按節(jié)點(diǎn)A的鍵盤中的2號(hào)鍵和節(jié)點(diǎn)B的鍵盤中的6號(hào)鍵時(shí),節(jié)點(diǎn)C的液晶屏上將實(shí)時(shí)顯示節(jié)點(diǎn)A和節(jié)點(diǎn)B中被按下鍵的鍵名。
圖6 系統(tǒng)功能測(cè)試結(jié)果
以上結(jié)果說(shuō)明節(jié)點(diǎn)A和節(jié)點(diǎn)B的ADC和DS18B20數(shù)據(jù)采集成功,同時(shí)說(shuō)明節(jié)點(diǎn)A和節(jié)點(diǎn)B與節(jié)點(diǎn)C之間的CAN通信成功,實(shí)現(xiàn)了節(jié)點(diǎn)C對(duì)節(jié)點(diǎn)A和節(jié)點(diǎn)B的檢測(cè)功能。
由圖6可以看出,將節(jié)點(diǎn)C的開(kāi)關(guān)SW1斷開(kāi)、SW2閉合時(shí),節(jié)點(diǎn)A的小燈LIGHT1熄滅、LIGHT2點(diǎn)亮;將節(jié)點(diǎn)C的開(kāi)關(guān)SW3閉合、SW4斷開(kāi)時(shí),節(jié)點(diǎn)B的小燈LIGHT3點(diǎn)亮、LIGHT4熄滅。此結(jié)果說(shuō)明系統(tǒng)實(shí)現(xiàn)了節(jié)點(diǎn)C對(duì)節(jié)點(diǎn)A和節(jié)點(diǎn)B的控制功能。
針對(duì)CAN技術(shù)抽象、原理難懂、學(xué)習(xí)難度大的問(wèn)題,設(shè)計(jì)了基于CAN的分布式測(cè)控實(shí)驗(yàn)系統(tǒng)。通過(guò)該系統(tǒng),可以直觀地學(xué)習(xí)CAN的結(jié)構(gòu)與網(wǎng)絡(luò)測(cè)控原理。為了實(shí)現(xiàn)嵌入式系統(tǒng)設(shè)計(jì)在不同MCU和不同應(yīng)用場(chǎng)合中的可移植和可復(fù)用,嵌入式硬件和軟件均采用了“構(gòu)件化”設(shè)計(jì),同時(shí)嵌入式軟件采用了分層設(shè)計(jì),大大降低了嵌入式技術(shù)的學(xué)習(xí)難度和嵌入式系統(tǒng)的開(kāi)發(fā)難度。經(jīng)過(guò)反復(fù)的實(shí)踐證明,該系統(tǒng)運(yùn)行可靠,其關(guān)鍵技術(shù)可廣泛應(yīng)用于現(xiàn)場(chǎng)分布式測(cè)控領(lǐng)域。