丁一明,李文魁,張煦光
(海軍工程大學(xué)電氣工程學(xué)院,湖北 武漢,430000)
自主式水下潛航器(autonomous underwater vehicle,AUV)因機(jī)動(dòng)性好、安全、智能化等優(yōu)點(diǎn),成為完成各種水下任務(wù)的重要工具。在復(fù)雜的水下工作環(huán)境中,執(zhí)行任務(wù)的實(shí)時(shí)性和可靠性顯得格外重要。傳統(tǒng)的前后臺(tái)程序?qū)崿F(xiàn)比較直觀,但在實(shí)時(shí)處理能力方面有很大的局限性。由于其再次響應(yīng)任務(wù)的時(shí)間是整個(gè)循環(huán)執(zhí)行的時(shí)間,導(dǎo)致可靠性和實(shí)時(shí)性較差[1-2]。為了提高AUV 的可靠性和實(shí)時(shí)性,加入實(shí)時(shí)多線程(real time thread,RT-Thread)操作系統(tǒng)對(duì)AUV進(jìn)行設(shè)計(jì)和管理,利用RT-Thread優(yōu)秀的同步機(jī)制和任務(wù)調(diào)度管理機(jī)制,在規(guī)定時(shí)間內(nèi)完成任務(wù)??刂破骶钟蚓W(wǎng)絡(luò)(controller area network,CAN)作為應(yīng)用較為廣泛的現(xiàn)場(chǎng)總線之一,具有高性能、高可靠性及糾錯(cuò)性能好等優(yōu)點(diǎn)[3]。本文采用CAN總線實(shí)現(xiàn)與導(dǎo)航模塊等外設(shè)間的數(shù)據(jù)通信。
RT-Thread操作系統(tǒng)架構(gòu)如圖1所示。

圖1 RT-Thread操作系統(tǒng)架構(gòu)
RT-Thread為搶占式實(shí)時(shí)多任務(wù)操作系統(tǒng),采用面向?qū)ο蟮脑O(shè)計(jì)方法,架構(gòu)清晰,裁剪、移植方便[4-5]。RT-Thread既有一個(gè)實(shí)時(shí)內(nèi)核,又有豐富的中間層組件。系統(tǒng)采用分層式結(jié)構(gòu),由下至上分別為:CPU架構(gòu)、內(nèi)核層(kernel)、組件和服務(wù)層(components )、軟件包(packages)。實(shí)時(shí)內(nèi)核是系統(tǒng)核心,包括線程管理、時(shí)鐘管理、內(nèi)存管理、信號(hào)量、事件、消息隊(duì)列等。任務(wù)線程調(diào)度靈活,具有多種內(nèi)存管理算法,支持多種同步和通信機(jī)制。組件和服務(wù)層提供了文件系統(tǒng)、圖形庫(kù)等較完整的中間件組件。軟件包內(nèi)容豐富,包括物聯(lián)網(wǎng)、系統(tǒng)、外設(shè)庫(kù)與驅(qū)動(dòng)類(lèi)等60多個(gè)軟件包。
Env工具是RT-Thread的輔助開(kāi)發(fā)工具,為操作系統(tǒng)的項(xiàng)目工程提供編譯環(huán)境構(gòu)建、圖形化系統(tǒng)配置及軟件包管理等功能,可對(duì)內(nèi)核、組件和軟件包進(jìn)行自由裁剪。
FinSH 是RT-Thread操作系統(tǒng)的命令行組件??刂平K端接收的用戶命令通過(guò)串口傳給FinSH;FinSH讀取命令,解析并自動(dòng)掃描內(nèi)部函數(shù)表,尋找對(duì)應(yīng)函數(shù)名,執(zhí)行函數(shù)后輸出回應(yīng),將結(jié)果顯示在控制終端上。
AUV半物理仿真系統(tǒng)如圖2所示。

圖2 AUV半物理仿真系統(tǒng)
為滿足實(shí)驗(yàn)室環(huán)境下運(yùn)動(dòng)控制器開(kāi)發(fā)的需要,將AUV運(yùn)動(dòng)控制器與前期開(kāi)發(fā)的AUV運(yùn)動(dòng)模擬器對(duì)接,構(gòu)建AUV半物理仿真系統(tǒng)。AUV運(yùn)動(dòng)控制器與AUV運(yùn)動(dòng)模擬器間通信的信號(hào)流為:控制器接收來(lái)自控制終端的指令航向、指令深度等控制指令,并接收來(lái)自模擬器的航向、航速、縱傾、橫傾、深度等實(shí)際運(yùn)動(dòng)參數(shù),形成指令舵角,發(fā)送給運(yùn)動(dòng)模擬器。模擬器接收控制器發(fā)送的指令舵角,進(jìn)行舵機(jī)模擬和AUV運(yùn)動(dòng)模擬計(jì)算,并將實(shí)際舵角和運(yùn)動(dòng)參數(shù)發(fā)送給控制器。
控制器硬件平臺(tái)采用STM32F4開(kāi)發(fā)板,微控制芯片為STM32F407,基于ARM Cortex-M4內(nèi)核,最高主頻為168 MHz,具有192 KB SRAM、1 024 KB FLASH、USART、CAN控制器等豐富的資源[6],可通過(guò)USART連接通信模塊,與上位機(jī)進(jìn)行數(shù)據(jù)交換[7-8]。CAN外設(shè)支持2.0 A及2.0 B,波特率最高為1 Mbit/s。TJA1050收發(fā)器與MCU內(nèi)置的CAN控制器可實(shí)現(xiàn)CAN總線通信。
AUV運(yùn)動(dòng)模擬器通過(guò)USB CAN Ⅱ分析儀與AUV運(yùn)動(dòng)控制器連接。USB CAN Ⅱ分析儀帶有USB2.0接口和2路CAN接口,具備CAN總線協(xié)議分析功能。
開(kāi)發(fā)環(huán)境采用Keil MDK5軟件。RT-Thread源碼使用版本rt-thread-v4.0.2,其源碼可從RT-Thread官網(wǎng)下載[9]。板級(jí)支持包bsp文件夾提供了多種開(kāi)發(fā)平臺(tái)的配置文件。本文選取stm32文件夾中的stm32f407-atk-explorer文件。
在Env工具命令行中輸入menuconfig命令。打開(kāi)圖形化配置工具,將RT-Thread Kernel相關(guān)參數(shù)設(shè)為默認(rèn)值。在RT-Thread Components /Device Drivers目錄下,選中Using CAN device drivers選項(xiàng)。輸入命令scons-target=mdk5生成Keil MDK5工程,輸入命令scons -dist生成dist文件夾。其子文件夾stm32f407-atk-explorer包含了RT-Thread內(nèi)核源碼和BSP相關(guān)工程。
使用STM32CubeMX配置芯片引腳。在Connectivity目錄下使能CAN1,芯片圖上CAN1_TX和CAN1_RX對(duì)應(yīng)的引腳PA12和PA11顯示為綠色,說(shuō)明配置成功。檢查時(shí)鐘樹(shù)配置是否正確(如最高時(shí)鐘頻率是否為168 MHz等),然后生成代碼。將生成的文件夾Inc和Src中的stm32f4xx_hal_conf.h和stm32f4xx_hal_msp.c文件拷貝到libraries/STM32F4xx_HAL/ STM32F4xx_HAL_Driver中對(duì)應(yīng)的Inc和Src文件夾,替換原來(lái)的文件。
打開(kāi)Env工具,在命令行輸入scons-target=mdk5生成mdk5工程。打開(kāi)生成的mdk5工程應(yīng)用程序,完成編譯。
3.4.1 波特率配置

3.4.2 CAN驅(qū)動(dòng)移植
①CAN驅(qū)動(dòng)添加。
在stm32f4xx_hal_conf.h文件里使能HAL庫(kù)CAN驅(qū)動(dòng)宏定義:
#define HAL_CAN_MODULE_ENABLED
在rtconfig.h里加入相應(yīng)的宏定義:
#define RT_USING_CAN
//使能CAN設(shè)備框架
#define BSP_USING_CAN
//使能CAN設(shè)備驅(qū)動(dòng)
#define BSP_USING_CAN1
//使能CAN1設(shè)備驅(qū)動(dòng)
②CAN設(shè)備初始化。
CAN設(shè)備初始化涉及l(fā)ibraries文件夾里的drv_common.c、drv_can.c和drv_can.h等文件。在drv_common.c文件中,加入頭文件調(diào)用:#include "drv_can.h",并將drv_can.c文件中CAN設(shè)備初始化函數(shù)rt_hw_can_init()添加到板載外設(shè)初始化函數(shù)void rt_hw_board_init()中。
3.4.3 下載驗(yàn)證
通過(guò)FinSH組件進(jìn)行交互操作,控制終端運(yùn)行的串口助手上顯示出RT-Thread版本信息,在串口助手中輸入list_device,則設(shè)備(device)欄中列出配置的CAN1設(shè)備,表明CAN1設(shè)備已經(jīng)成功掛載到RT-Thread系統(tǒng)上。
CAN報(bào)文設(shè)置幀格式為擴(kuò)展幀,幀類(lèi)型為數(shù)據(jù)幀,波特率為125 kbit/s。
CAN接口協(xié)議如表1所示。無(wú)實(shí)際意義的字節(jié)用FFFF填充。

表1 CAN接口協(xié)議
在Applications目錄下新建ctrboard_can.c文件,創(chuàng)建CAN接收事件和CAN通信線程,使用事件來(lái)實(shí)現(xiàn)線程間的同步,并通過(guò)串口助手將接收到的數(shù)據(jù)按照一定格式打印出來(lái)。
通信程序流程如圖3所示。

圖3 通信程序流程圖
將AUV運(yùn)動(dòng)控制器通過(guò)USB CANII分析儀與AUV運(yùn)動(dòng)模擬器連接。為便于參數(shù)比較,控制器發(fā)送固定的指令舵角,即方向舵8°和艉升降舵2°。模擬器接收?qǐng)?bào)文并解碼,顯示方向舵為7.998°、艉升降舵為1.999 5°。該結(jié)果表明,模擬器接收到的指令信息與控制器發(fā)送的指令信息基本一致。
AUV運(yùn)動(dòng)模擬器發(fā)送航速航姿和深度舵角兩組報(bào)文,STM32F4開(kāi)發(fā)板外設(shè)CAN接收解碼并通過(guò)串口助手在控制終端上顯示。AUV運(yùn)動(dòng)控制器接收?qǐng)?bào)文如表2所示。

表2 AUV運(yùn)動(dòng)控制器接收?qǐng)?bào)文
經(jīng)檢驗(yàn),控制器接收的報(bào)文指令信息與模擬器發(fā)送的指令一致,表明AUV運(yùn)動(dòng)模擬器和AUV運(yùn)動(dòng)控制器之間能準(zhǔn)確地通信。
RT-Thread具有的豐富中間組件及硬實(shí)時(shí)性,可以很好地滿足AUV各種功能模塊開(kāi)發(fā)的需要。本文針對(duì)AUV運(yùn)動(dòng)控制器的開(kāi)發(fā)需要,結(jié)合STM32CubeMX和Env圖形化配置工具,基于RT-Thread操作系統(tǒng),在SMT32F4硬件平臺(tái)上成功地實(shí)現(xiàn)了CAN通信模塊的開(kāi)發(fā)。該設(shè)計(jì)方法可推廣應(yīng)用于RT-Thread各類(lèi)硬件平臺(tái)的工程配置和外設(shè)驅(qū)動(dòng)添加。