丁一明,李文魁,張煦光
(海軍工程大學電氣工程學院,湖北 武漢,430000)
自主式水下潛航器(autonomous underwater vehicle,AUV)因機動性好、安全、智能化等優點,成為完成各種水下任務的重要工具。在復雜的水下工作環境中,執行任務的實時性和可靠性顯得格外重要。傳統的前后臺程序實現比較直觀,但在實時處理能力方面有很大的局限性。由于其再次響應任務的時間是整個循環執行的時間,導致可靠性和實時性較差[1-2]。為了提高AUV 的可靠性和實時性,加入實時多線程(real time thread,RT-Thread)操作系統對AUV進行設計和管理,利用RT-Thread優秀的同步機制和任務調度管理機制,在規定時間內完成任務。控制器局域網絡(controller area network,CAN)作為應用較為廣泛的現場總線之一,具有高性能、高可靠性及糾錯性能好等優點[3]。本文采用CAN總線實現與導航模塊等外設間的數據通信。
RT-Thread操作系統架構如圖1所示。

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

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

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

表1 CAN接口協議
在Applications目錄下新建ctrboard_can.c文件,創建CAN接收事件和CAN通信線程,使用事件來實現線程間的同步,并通過串口助手將接收到的數據按照一定格式打印出來。
通信程序流程如圖3所示。

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

表2 AUV運動控制器接收報文
經檢驗,控制器接收的報文指令信息與模擬器發送的指令一致,表明AUV運動模擬器和AUV運動控制器之間能準確地通信。
RT-Thread具有的豐富中間組件及硬實時性,可以很好地滿足AUV各種功能模塊開發的需要。本文針對AUV運動控制器的開發需要,結合STM32CubeMX和Env圖形化配置工具,基于RT-Thread操作系統,在SMT32F4硬件平臺上成功地實現了CAN通信模塊的開發。該設計方法可推廣應用于RT-Thread各類硬件平臺的工程配置和外設驅動添加。