秦穎頎 陳雪峰
(上海蔚來汽車有限公司,上海 201800)
第二代車載診斷系統(On Board Diagnostics Ⅱ,OBD Ⅱ)將汽車排放和駕駛相關故障的診斷標準化,使不同制造商生產的車輛具有相同的故障代碼[1-7]。目前,大多數整車制造商采用OBD Ⅱ標準+ISO 14229 統一診斷服務(Unified Diagnostic Services,UDS)協議[8]開發車載電子控制單元(Electric Control Unit,ECU),車載診斷功能逐步擴展為支持多種車載ECU 的診斷。但汽車診斷儀的種類繁多,體積和質量通常較大,成本較高,且不支持二次開發或者二次開發比較困難,難以滿足整車制造商的特殊使用需求,如軟件定制化更改、研發階段大量的診斷工具需求、無網絡覆蓋的離線場景等。
為此,本文開發一種嵌入式診斷儀,通過連接整車OBD Ⅱ接口與整車診斷控制器局域網(Controller Area Network,CAN)總線通信,并設計3種工作模式,即與外部手機等藍牙設備通信、與外部計算機等串行接口設備通信、自行記憶上一次的指令,快速執行各項診斷任務,如診斷故障碼(Diagnostic Trouble Code,DTC)刪除與讀取、開關運輸模式、執行器標定等。診斷儀硬件基于STM32 單片機開發,并設計電源模塊、快閃存儲(Trans Flash,TF)卡存儲模塊、藍牙模塊、CAN 驅動模塊、發光二極管(Light Emitting Diode,LED)顯示模塊、蜂鳴器發聲模塊以及通用串行總線(Universal Serial Bus,USB)接口模塊等外設擴展模塊;診斷儀軟件基于C語言進行嵌入式開發。
OBD Ⅱ接口一般采用標準尺寸的16 針梯形母接頭,診斷儀通過OBD Ⅱ接口與車輛網關的診斷CAN 總線 連接,進 而接入整 車ECU 的CAN/LIN 網絡,與整車ECU 進行診斷通信,引腳及其定義如圖1和表1所示。本文主要使用6個引腳,即Pin1、Pin4、Pin5、Pin6、Pin14、Pin16:Pin4、Pin5、Pin16 用于獲取12 V 電源,為診斷儀供電;Pin6、Pin14 是診斷CAN總線引腳,診斷儀通過一路CAN(500 kbit/s)與網關通信,支持CAN 2.0A/B 數據傳輸協議和UDS 協議,支持各種中斷服務,保證信息及時處理;Pin1 為點火信號端子KL15,用于獲取車輛點火/上電狀態。

表1 OBD Ⅱ接口引腳定義

圖1 OBD Ⅱ接口引腳排布
該診斷儀支持BLE 4.0協議,可通過藍牙接口與外部手機連接,也可通過USB 2.0接口與外部計算機設備連接。在線模式下,手機和計算機可以發出不同的診斷指令,同時顯示診斷結果。離線模式適用于執行單一指令操作,如打開運輸模式,診斷儀通過記憶之前的指令,每次上電時均執行同一指令。
診斷儀支持TF卡存儲,可將所有診斷過程信息存儲到TF卡上,用于測試結果追溯。診斷儀的系統原理如圖2所示。

圖2 診斷儀的系統框圖
主控制器選擇STM32F103 系列微控制單元(Micro Controller Unit,MCU),采用ARM Cortex-M內核的32 位微控制器,供電電壓為2.0~3.6 V(一般選擇3.3 V),最高工作頻率為72 MHz,片上集成256 KB的閃存(Flash Memory),48 KB 的靜態隨機存取存儲器(Static Random-Access Memory,SRAM),可滿足中等復雜度的程序要求[9]。該MCU具有豐富的硬件接口,如CAN 2.0B 接口、安全數字輸入輸出(Secure Digital Input and Output,SDIO)接口、通用同步/異步收 發 器(Universal Synchronous/Asynchronous Receiver/Transmitter,USART)接口,非常適合作為OBD診斷儀的主控制器,最小系統電路如圖3所示。

圖3 主控制器最小系統電路
診斷儀的輸入電壓為12 V,從OBD 引腳直接取電,通過兩級降壓:一級降壓芯片選擇78M05 三端正線性穩壓器,將電壓降至5 V,用于CAN 收發器的供電,78M05 具有芯片體積小、輸出電流大(峰值電流為700 mA)、輸出電壓噪聲低(40 μV)、工作溫度范圍大(-65~150 ℃)的優點[2],無需使用散熱片;二級降壓芯片選擇AMS1117-3.3 三端正向低壓降穩壓器,將電壓降至3.3 V,用于MCU系統、SD卡、藍牙、串行接口等模塊的供電,AMS1117-3.3芯片體積小、輸出電流大(峰值電流為1 A)、工作溫度范圍大(-40~125 ℃)、工作壓差低(最低為1 V),同樣無需使用散熱片[10]。電源模塊電路如圖4所示。

圖4 電源模塊電路
MCU 的CAN 接口無法直接發送和接收符合CAN 總線物理層協議的差分信號,需要通過CAN 收發器進行電平轉換,本文選擇TJA1050 作為CAN 收發器。TJA1050 的供電電壓為4.75~5.25 V(一般選擇5 V),電磁兼容性(Electromagnetic Compatibility,EMC)斜率控制較好,無源特性良好(不上電時總線引腳漏電流為0 μA),總線傳輸速率最高支持1 Mbit/s,輸入電平兼容3.3 V MCU 電平,與GB/T 41588.1—2022《道路車輛 控制器局域網(CAN) 第1 部分:數據鏈路層和物理信令》完全兼容,具有總線引腳短路保護功能[11],其電路如圖5所示。

圖5 CAN收發器電路
根據診斷儀的實際使用場景,人機交互均在近距離條件下進行,故選擇藍牙作為無線通信方式。選用HC-05 藍牙模塊,通過MCU 的USART 串行接口驅動,可以與手機等外部藍牙設備進行無線通信。HC-05 藍牙模塊體積較小,適合直接焊接在印刷電路板(Printed Circuit Board,PCB)上,支持主、從模式(診斷儀選擇從模式),供電電壓為3.3~3.6 V(一般選擇3.3 V,完全兼容MCU TTL 電平),指令集豐富,通信距離可達8 m,工作穩定,其與MCU 的接口電路如圖6所示。

圖6 藍牙模塊接口電路
選擇TF 卡作為數據存儲模塊,TF 卡相對SD 卡體積較小,適用于PCB 空間有限的場景。通過MCU自帶的SD/TF 卡驅動接口SDIO 模塊進行控制,很容易實現文件分配表(File Allocation Table,FAT)文件系統的創建和編輯,存儲數據穩定,診斷結果可以實時備份在TF卡中,存儲模塊電路如圖7所示。

圖7 TF卡存儲模塊電路
為實現診斷儀與計算機等設備的有線通信,選擇CH340 作為USB 轉通用異步收發器(Universal Asynchronous Receiver Transmitter,UART)芯 片。CH340 完全兼容USB 2.0,與Windows 的串行接口應用程序也完全兼容,供電電壓支持3.3 V 和5 V,支持50 bit/s~2 Mbit/s 傳 輸 速 率[12]。選 擇MCU 的USART1 模塊接口用于串行接口通信,同時作為STM32 的程序燒寫口,串行接口電路如圖8 所示,PCB 上也同時預留了串行線調試(Serial Wire Debug,SWD)+燒寫接口。

圖8 串口模塊電路
其他的輔助電路包括:
a.聲光指示模塊電路。使用一支蜂鳴器發聲,使用RGB混色LED發光,電路如圖9所示。

圖9 聲光指示模塊電路
b. KL15 光耦隔離電路。使用EL357 光耦實現電氣隔離和降壓,電路如圖10所示。

圖10 KL15光耦隔離電路
c. 離線時鐘電源模塊電路。使用紐扣電池方案,在不連接實車時保持診斷儀的時鐘正常運行,保證診斷結果可追溯,電路如圖11所示。

圖11 離線時鐘電源模塊電路
d.OBD Ⅱ接口電路。選擇標準尺寸的OBD Ⅱ公頭作為主接插件與車端對接,實現診斷通信,電路如圖12所示。

圖12 OBD Ⅱ接口電路
使用C 語言進行嵌入式程序開發,在Keil 集成開發環境(Integrated Development Environment,IDE)下進行編譯和調試,編程的主體思路是軟件配合硬件,即先完成電路設計、PCB布線,再進行軟件開發,因為相對于硬件更改,軟件調整的靈活度更高。目前,STM32編程一般分為3個層級,即底層硬件抽象層(Hardware Abstraction Layer,HAL)、中間驅動層、上層應用層,為提高程序的可讀性和簡潔性,本文未采用HAL 編程,采用中間驅動層+上層應用層的編程方式。
驅動層采用STM32官方固件庫函數作為應用程序接口(Application Programming Interface,API),取代傳統的直接寄存器配置方案,以提高編程效率和代碼的可讀性。具體功能包括通用輸入輸出(General Purpose Input Output,GPIO)端口初始化、CAN模塊初始化、USART模塊初始化、SDIO模塊初始化、中斷初始化等,使用的典型固件庫函數集合如表2所示[13]。

表2 主要使用的固件庫函數集
上層應用層通過調用中間驅動層API封裝具體功能需求。應用層函數主要包括2 類:一是實現基礎通信功能的函數,包括CAN 信號發送和接收、藍牙/串行接口消息的發送和接收、TF 卡的讀寫操作、聲光邏輯控制等;二是實現具體應用,包括各種UDS診斷控制流等。
診斷儀總體的軟件工作流程如圖13所示。

圖13 診斷儀軟件流程
診斷儀不主動向手機推送藍牙信息(除自動發送“AT+INQC”連接信息外,直接忽略該信號即可),任何信息的調取,都需要手機APP 先發送指令,避免誤操作,主要功能如表3所示。

表3 診斷功能
針對表3 所示的功能,設計了功能測試和性能測試:功能測試主要包含藍牙通信、診斷指令執行、診斷結果讀取、測試結果日志打印;性能測試主要包含長時間開機(大于10 h)、反復上下電(5 000次)、循環執行指令功能。測試中發現的一些嚴重軟件錯誤(Bug),如數組越界導致異常重啟、壓力測試下程序跑飛,進行了代碼修復,可以實現連續開機超過10 h和上下電5 000次無異常。
本文設計了一種基于OBD II 接口的診斷儀,采用汽車行業標準的軟、硬件接口(軟件采用CAN 2.0/UDS 協議接口,硬件采用OBD II 接口),設計了電源模塊、TF 卡存儲模塊、藍牙模塊、CAN 驅動模塊、LED顯示模塊、蜂鳴器發聲模塊、USB接口模塊等外設擴展模塊,采用分層架構進行了嵌入式軟件開發,對于UDS 的基本功能,均提前封裝為中間層API,作為原子能力供上層APP 調用,降低了軟件開發的難度,提高了功能迭代的效率。