索明何,薛福霞,劉瓊瓊,馬培真
(1.江蘇電子信息職業學院,江蘇 淮安 223003;2.南京航空航天大學 計算機科學與技術學院,江蘇 南京 211106;3.國網(北京)綜合能源規劃設計研究院有限公司,北京 100052)
CAN是由德國Bosch公司針對汽車電子領域開發的符合國際標準的現場總線,具有很強的可靠性、安全性和實時性,被廣泛應用于汽車電子、工業控制、農業控制、機電產品等領域的分布式測控系統中。利用CAN可以很方便地實現多機聯網。為了使學習者能夠直觀地學習CAN的結構與網絡測控原理,本文采用基于構件化的嵌入式系統設計方法設計了基于CAN的分布式測控實驗系統。
系統硬件設計方案如圖1所示,通過CAN總線將多個電控單元(簡稱為節點)組成局域網,每個節點包括:MCU硬件最小系統,開關、鍵盤、A/D采樣、溫度傳感器等輸入設備,小燈、液晶顯示屏等輸出設備,CAN接口電路。通過CAN可實現某個節點(如節點C)對其他節點(如節點A和節點B)的檢測與控制功能。

圖1 系統硬件設計方案
根據圖1的方案,系統硬件設計主要包含兩部分:嵌入式核心硬件構件(最小系統)設計和嵌入式應用外設硬件構件設計?,F以圖2給出的開關硬件構件為例,說明硬件構件的設計及使用方法。圖2中SW為硬件構件的接口注釋;PTC為硬件構件的接口網標,具有電氣連接特性,表示硬件構件的接口與MCU的引腳相連接。硬件構件移植和復用在不同應用系統中時,僅須修改接口網標。

圖2 開關硬件構件與MCU引腳的連接
為了實現嵌入式軟件的可移植和可復用,增強其可維護性,嵌入式軟件采用“構件化”設計方法和軟件分層的設計思想。
在嵌入式技術基礎實踐中,一般以MCU控制小燈閃爍作為入門實驗,對應的程序框架稱為“嵌入式軟件最小系統”。表1給出了在Keil MDK集成開發環境下的KEA128控制小燈閃爍程序的工程組織框架。
從表1可以看出,系統是按照“分門別類、各有歸處”的原則將文件進行工程組織的,其中的04_Driver(MCU底層驅動構件)、05_App(應用外設構件)、06_Soft(通用軟件構件)、07_Source(應用層工程源程序構件)的文件都是由本構件的.h文件和.c文件組成的。在此框架下可通過添加其他構件和修改應用層程序來完成不同功能的軟件設計。若采用其他型號的MCU芯片,只需要對02_Core、03_MCU、04_Driver中的文件進行相應的替換,其他文件基本不需要改動或做非常少量的改動即可,以此實現了嵌入式軟件在不同MCU芯片之間的可移植和可復用。

表1 KEA128軟件最小系統(工程組織)框架及說明表
現以開關軟件設計為例,說明嵌入式軟件構件的設計方法及使用方法。圖2所示的開關硬件構件對應的開關軟件構件由sw.h頭文件和sw.c源文件組成,若要使用開關軟件構件,只須將這兩個文件添加到所建工程的05_App(應用外設構件)文件夾中,即可實現對開關的操作。
(1)開關軟件構件頭文件sw.h



CAN只使用了物理層、數據鏈路層和應用層,從而提高了通信的實時性。其中數據鏈路層和物理層的協議分別由CAN控制器和CAN收發器硬件自動實現。因此,CAN應用系統軟件設計的主要任務是對其應用層程序進行設計。
2.3.1 CAN的應用層協議制定
現以3個CAN節點(節點A、節點B和節點C)進行通信為例,介紹基于CAN的分布式測控功能的設計與實現方法。在此對節點預接收的幀ID、發送或接收數據段的含義做表2所列的約定。

表2 CAN通信約定
3個節點通信均傳輸標準格式的數據幀,各節點通過驗收過濾機制接收對應ID的數據包:節點A和節點B向節點C發送本節點的檢測信息(被按下鍵的鍵名、電壓值、溫度值),并根據節點C的開關狀態控制本節點的小燈狀態;節點C接收來自節點A和節點B的檢測信息,并向節點A和節點B發送開關狀態。3個節點均通過中斷方式接收來自CAN總線上的數據,接收到對應的數據包后,解析其數據段中的數據,并執行相應的功能程序。
2.3.2 CAN節點的應用層程序設計流程
節點A或節點B的主程序流程如圖3所示。在主循環中,節點A或節點B向CAN總線上發送各自節點的檢測信息(被按下鍵的鍵名、A/D轉換的電壓值、溫度傳感器DS18B20的溫度值);然后通過查詢CAN接收標志判斷是否接收到CAN數據,若接收到CAN數據(對應節點C的開關狀態),則節點A或節點B解析收到的CAN數據,并根據節點C的開關狀態控制本節點的小燈狀態。

圖3 節點A和節點B的主程序流程
節點A或節點B的定時中斷服務程序和CAN接收中斷服務程序流程分別如圖4(a)和圖4(b)所示。其中,在定時(10 ms)中斷服務程序中,每隔10 ms掃描一次鍵盤,這樣做既可有效消除按鍵抖動帶來的影響,又能有效防止按鍵連擊現象,即1次按鍵只進行1次解釋執行。在CAN接收中斷服務程序中,接收CAN數據,并更新CAN接收標志,供主程序查詢。節點C的主程序流程如圖5所示。在主循環中,查詢開關的狀態,并分別向節點A和節點B發送其開關狀態;然后通過查詢CAN接收標志判斷是否接收到CAN數據,若接收到CAN數據(對應節點A或節點B的檢測信息),則節點C解析收到的CAN數據,并控制液晶屏實時顯示節點A和節點B的檢測信息。節點C的CAN接收中斷服務程序流程與圖4(b)相同,此處不再重述。

圖4 節點A和節點B的中斷服務程序流程

圖5 節點C的主程序流程
系統測試時,首先要將3個節點對應的程序分別下載至對應的MCU中,然后需要通過導線分別將3個節點的CAN-H和CAN-L連接,組成基于CAN的局域網,并將節點A和節點C作為終端節點,對其設置終端電阻,以防止反射波干擾。
如圖6所示,給3個節點通電后,在節點C的液晶屏上實時顯示節點A和節點B的A/D轉換的電壓值及DS18B20的溫度。在轉動節點A或節點B的ADC電位器的轉柄時,節點C的液晶屏上將實時顯示隨之變化的電壓值。在改變節點A或節點B的DS18B20的溫度時,節點C的液晶屏上也將實時顯示隨之變化的溫度值。分別按節點A的鍵盤中的2號鍵和節點B的鍵盤中的6號鍵時,節點C的液晶屏上將實時顯示節點A和節點B中被按下鍵的鍵名。

圖6 系統功能測試結果
以上結果說明節點A和節點B的ADC和DS18B20數據采集成功,同時說明節點A和節點B與節點C之間的CAN通信成功,實現了節點C對節點A和節點B的檢測功能。
由圖6可以看出,將節點C的開關SW1斷開、SW2閉合時,節點A的小燈LIGHT1熄滅、LIGHT2點亮;將節點C的開關SW3閉合、SW4斷開時,節點B的小燈LIGHT3點亮、LIGHT4熄滅。此結果說明系統實現了節點C對節點A和節點B的控制功能。
針對CAN技術抽象、原理難懂、學習難度大的問題,設計了基于CAN的分布式測控實驗系統。通過該系統,可以直觀地學習CAN的結構與網絡測控原理。為了實現嵌入式系統設計在不同MCU和不同應用場合中的可移植和可復用,嵌入式硬件和軟件均采用了“構件化”設計,同時嵌入式軟件采用了分層設計,大大降低了嵌入式技術的學習難度和嵌入式系統的開發難度。經過反復的實踐證明,該系統運行可靠,其關鍵技術可廣泛應用于現場分布式測控領域。