秦穎頎 陳雪峰
(上海蔚來汽車有限公司,上海 201800)
第二代車載診斷系統(tǒng)(On Board Diagnostics Ⅱ,OBD Ⅱ)將汽車排放和駕駛相關(guān)故障的診斷標(biāo)準(zhǔn)化,使不同制造商生產(chǎn)的車輛具有相同的故障代碼[1-7]。目前,大多數(shù)整車制造商采用OBD Ⅱ標(biāo)準(zhǔn)+ISO 14229 統(tǒng)一診斷服務(wù)(Unified Diagnostic Services,UDS)協(xié)議[8]開發(fā)車載電子控制單元(Electric Control Unit,ECU),車載診斷功能逐步擴(kuò)展為支持多種車載ECU 的診斷。但汽車診斷儀的種類繁多,體積和質(zhì)量通常較大,成本較高,且不支持二次開發(fā)或者二次開發(fā)比較困難,難以滿足整車制造商的特殊使用需求,如軟件定制化更改、研發(fā)階段大量的診斷工具需求、無網(wǎng)絡(luò)覆蓋的離線場(chǎng)景等。
為此,本文開發(fā)一種嵌入式診斷儀,通過連接整車OBD Ⅱ接口與整車診斷控制器局域網(wǎng)(Controller Area Network,CAN)總線通信,并設(shè)計(jì)3種工作模式,即與外部手機(jī)等藍(lán)牙設(shè)備通信、與外部計(jì)算機(jī)等串行接口設(shè)備通信、自行記憶上一次的指令,快速執(zhí)行各項(xiàng)診斷任務(wù),如診斷故障碼(Diagnostic Trouble Code,DTC)刪除與讀取、開關(guān)運(yùn)輸模式、執(zhí)行器標(biāo)定等。診斷儀硬件基于STM32 單片機(jī)開發(fā),并設(shè)計(jì)電源模塊、快閃存儲(chǔ)(Trans Flash,TF)卡存儲(chǔ)模塊、藍(lán)牙模塊、CAN 驅(qū)動(dòng)模塊、發(fā)光二極管(Light Emitting Diode,LED)顯示模塊、蜂鳴器發(fā)聲模塊以及通用串行總線(Universal Serial Bus,USB)接口模塊等外設(shè)擴(kuò)展模塊;診斷儀軟件基于C語(yǔ)言進(jìn)行嵌入式開發(fā)。
OBD Ⅱ接口一般采用標(biāo)準(zhǔn)尺寸的16 針梯形母接頭,診斷儀通過OBD Ⅱ接口與車輛網(wǎng)關(guān)的診斷CAN 總線 連接,進(jìn) 而接入整 車ECU 的CAN/LIN 網(wǎng)絡(luò),與整車ECU 進(jìn)行診斷通信,引腳及其定義如圖1和表1所示。本文主要使用6個(gè)引腳,即Pin1、Pin4、Pin5、Pin6、Pin14、Pin16:Pin4、Pin5、Pin16 用于獲取12 V 電源,為診斷儀供電;Pin6、Pin14 是診斷CAN總線引腳,診斷儀通過一路CAN(500 kbit/s)與網(wǎng)關(guān)通信,支持CAN 2.0A/B 數(shù)據(jù)傳輸協(xié)議和UDS 協(xié)議,支持各種中斷服務(wù),保證信息及時(shí)處理;Pin1 為點(diǎn)火信號(hào)端子KL15,用于獲取車輛點(diǎn)火/上電狀態(tài)。
表1 OBD Ⅱ接口引腳定義
圖1 OBD Ⅱ接口引腳排布
該診斷儀支持BLE 4.0協(xié)議,可通過藍(lán)牙接口與外部手機(jī)連接,也可通過USB 2.0接口與外部計(jì)算機(jī)設(shè)備連接。在線模式下,手機(jī)和計(jì)算機(jī)可以發(fā)出不同的診斷指令,同時(shí)顯示診斷結(jié)果。離線模式適用于執(zhí)行單一指令操作,如打開運(yùn)輸模式,診斷儀通過記憶之前的指令,每次上電時(shí)均執(zhí)行同一指令。
診斷儀支持TF卡存儲(chǔ),可將所有診斷過程信息存儲(chǔ)到TF卡上,用于測(cè)試結(jié)果追溯。診斷儀的系統(tǒng)原理如圖2所示。
圖2 診斷儀的系統(tǒng)框圖
主控制器選擇STM32F103 系列微控制單元(Micro Controller Unit,MCU),采用ARM Cortex-M內(nèi)核的32 位微控制器,供電電壓為2.0~3.6 V(一般選擇3.3 V),最高工作頻率為72 MHz,片上集成256 KB的閃存(Flash Memory),48 KB 的靜態(tài)隨機(jī)存取存儲(chǔ)器(Static Random-Access Memory,SRAM),可滿足中等復(fù)雜度的程序要求[9]。該MCU具有豐富的硬件接口,如CAN 2.0B 接口、安全數(shù)字輸入輸出(Secure Digital Input and Output,SDIO)接口、通用同步/異步收 發(fā) 器(Universal Synchronous/Asynchronous Receiver/Transmitter,USART)接口,非常適合作為OBD診斷儀的主控制器,最小系統(tǒng)電路如圖3所示。
圖3 主控制器最小系統(tǒng)電路
診斷儀的輸入電壓為12 V,從OBD 引腳直接取電,通過兩級(jí)降壓:一級(jí)降壓芯片選擇78M05 三端正線性穩(wěn)壓器,將電壓降至5 V,用于CAN 收發(fā)器的供電,78M05 具有芯片體積小、輸出電流大(峰值電流為700 mA)、輸出電壓噪聲低(40 μV)、工作溫度范圍大(-65~150 ℃)的優(yōu)點(diǎn)[2],無需使用散熱片;二級(jí)降壓芯片選擇AMS1117-3.3 三端正向低壓降穩(wěn)壓器,將電壓降至3.3 V,用于MCU系統(tǒng)、SD卡、藍(lán)牙、串行接口等模塊的供電,AMS1117-3.3芯片體積小、輸出電流大(峰值電流為1 A)、工作溫度范圍大(-40~125 ℃)、工作壓差低(最低為1 V),同樣無需使用散熱片[10]。電源模塊電路如圖4所示。
圖4 電源模塊電路
MCU 的CAN 接口無法直接發(fā)送和接收符合CAN 總線物理層協(xié)議的差分信號(hào),需要通過CAN 收發(fā)器進(jìn)行電平轉(zhuǎn)換,本文選擇TJA1050 作為CAN 收發(fā)器。TJA1050 的供電電壓為4.75~5.25 V(一般選擇5 V),電磁兼容性(Electromagnetic Compatibility,EMC)斜率控制較好,無源特性良好(不上電時(shí)總線引腳漏電流為0 μA),總線傳輸速率最高支持1 Mbit/s,輸入電平兼容3.3 V MCU 電平,與GB/T 41588.1—2022《道路車輛 控制器局域網(wǎng)(CAN) 第1 部分:數(shù)據(jù)鏈路層和物理信令》完全兼容,具有總線引腳短路保護(hù)功能[11],其電路如圖5所示。
圖5 CAN收發(fā)器電路
根據(jù)診斷儀的實(shí)際使用場(chǎng)景,人機(jī)交互均在近距離條件下進(jìn)行,故選擇藍(lán)牙作為無線通信方式。選用HC-05 藍(lán)牙模塊,通過MCU 的USART 串行接口驅(qū)動(dòng),可以與手機(jī)等外部藍(lán)牙設(shè)備進(jìn)行無線通信。HC-05 藍(lán)牙模塊體積較小,適合直接焊接在印刷電路板(Printed Circuit Board,PCB)上,支持主、從模式(診斷儀選擇從模式),供電電壓為3.3~3.6 V(一般選擇3.3 V,完全兼容MCU TTL 電平),指令集豐富,通信距離可達(dá)8 m,工作穩(wěn)定,其與MCU 的接口電路如圖6所示。
圖6 藍(lán)牙模塊接口電路
選擇TF 卡作為數(shù)據(jù)存儲(chǔ)模塊,TF 卡相對(duì)SD 卡體積較小,適用于PCB 空間有限的場(chǎng)景。通過MCU自帶的SD/TF 卡驅(qū)動(dòng)接口SDIO 模塊進(jìn)行控制,很容易實(shí)現(xiàn)文件分配表(File Allocation Table,F(xiàn)AT)文件系統(tǒng)的創(chuàng)建和編輯,存儲(chǔ)數(shù)據(jù)穩(wěn)定,診斷結(jié)果可以實(shí)時(shí)備份在TF卡中,存儲(chǔ)模塊電路如圖7所示。
圖7 TF卡存儲(chǔ)模塊電路
為實(shí)現(xiàn)診斷儀與計(jì)算機(jī)等設(shè)備的有線通信,選擇CH340 作為USB 轉(zhuǎn)通用異步收發(fā)器(Universal Asynchronous Receiver Transmitter,UART)芯 片。CH340 完全兼容USB 2.0,與Windows 的串行接口應(yīng)用程序也完全兼容,供電電壓支持3.3 V 和5 V,支持50 bit/s~2 Mbit/s 傳 輸 速 率[12]。選 擇MCU 的USART1 模塊接口用于串行接口通信,同時(shí)作為STM32 的程序燒寫口,串行接口電路如圖8 所示,PCB 上也同時(shí)預(yù)留了串行線調(diào)試(Serial Wire Debug,SWD)+燒寫接口。
圖8 串口模塊電路
其他的輔助電路包括:
a.聲光指示模塊電路。使用一支蜂鳴器發(fā)聲,使用RGB混色LED發(fā)光,電路如圖9所示。
圖9 聲光指示模塊電路
b. KL15 光耦隔離電路。使用EL357 光耦實(shí)現(xiàn)電氣隔離和降壓,電路如圖10所示。
圖10 KL15光耦隔離電路
c. 離線時(shí)鐘電源模塊電路。使用紐扣電池方案,在不連接實(shí)車時(shí)保持診斷儀的時(shí)鐘正常運(yùn)行,保證診斷結(jié)果可追溯,電路如圖11所示。
圖11 離線時(shí)鐘電源模塊電路
d.OBD Ⅱ接口電路。選擇標(biāo)準(zhǔn)尺寸的OBD Ⅱ公頭作為主接插件與車端對(duì)接,實(shí)現(xiàn)診斷通信,電路如圖12所示。
圖12 OBD Ⅱ接口電路
使用C 語(yǔ)言進(jìn)行嵌入式程序開發(fā),在Keil 集成開發(fā)環(huán)境(Integrated Development Environment,IDE)下進(jìn)行編譯和調(diào)試,編程的主體思路是軟件配合硬件,即先完成電路設(shè)計(jì)、PCB布線,再進(jìn)行軟件開發(fā),因?yàn)橄鄬?duì)于硬件更改,軟件調(diào)整的靈活度更高。目前,STM32編程一般分為3個(gè)層級(jí),即底層硬件抽象層(Hardware Abstraction Layer,HAL)、中間驅(qū)動(dòng)層、上層應(yīng)用層,為提高程序的可讀性和簡(jiǎn)潔性,本文未采用HAL 編程,采用中間驅(qū)動(dòng)層+上層應(yīng)用層的編程方式。
驅(qū)動(dòng)層采用STM32官方固件庫(kù)函數(shù)作為應(yīng)用程序接口(Application Programming Interface,API),取代傳統(tǒng)的直接寄存器配置方案,以提高編程效率和代碼的可讀性。具體功能包括通用輸入輸出(General Purpose Input Output,GPIO)端口初始化、CAN模塊初始化、USART模塊初始化、SDIO模塊初始化、中斷初始化等,使用的典型固件庫(kù)函數(shù)集合如表2所示[13]。
表2 主要使用的固件庫(kù)函數(shù)集
上層應(yīng)用層通過調(diào)用中間驅(qū)動(dòng)層API封裝具體功能需求。應(yīng)用層函數(shù)主要包括2 類:一是實(shí)現(xiàn)基礎(chǔ)通信功能的函數(shù),包括CAN 信號(hào)發(fā)送和接收、藍(lán)牙/串行接口消息的發(fā)送和接收、TF 卡的讀寫操作、聲光邏輯控制等;二是實(shí)現(xiàn)具體應(yīng)用,包括各種UDS診斷控制流等。
診斷儀總體的軟件工作流程如圖13所示。
圖13 診斷儀軟件流程
診斷儀不主動(dòng)向手機(jī)推送藍(lán)牙信息(除自動(dòng)發(fā)送“AT+INQC”連接信息外,直接忽略該信號(hào)即可),任何信息的調(diào)取,都需要手機(jī)APP 先發(fā)送指令,避免誤操作,主要功能如表3所示。
表3 診斷功能
針對(duì)表3 所示的功能,設(shè)計(jì)了功能測(cè)試和性能測(cè)試:功能測(cè)試主要包含藍(lán)牙通信、診斷指令執(zhí)行、診斷結(jié)果讀取、測(cè)試結(jié)果日志打?。恍阅軠y(cè)試主要包含長(zhǎng)時(shí)間開機(jī)(大于10 h)、反復(fù)上下電(5 000次)、循環(huán)執(zhí)行指令功能。測(cè)試中發(fā)現(xiàn)的一些嚴(yán)重軟件錯(cuò)誤(Bug),如數(shù)組越界導(dǎo)致異常重啟、壓力測(cè)試下程序跑飛,進(jìn)行了代碼修復(fù),可以實(shí)現(xiàn)連續(xù)開機(jī)超過10 h和上下電5 000次無異常。
本文設(shè)計(jì)了一種基于OBD II 接口的診斷儀,采用汽車行業(yè)標(biāo)準(zhǔn)的軟、硬件接口(軟件采用CAN 2.0/UDS 協(xié)議接口,硬件采用OBD II 接口),設(shè)計(jì)了電源模塊、TF 卡存儲(chǔ)模塊、藍(lán)牙模塊、CAN 驅(qū)動(dòng)模塊、LED顯示模塊、蜂鳴器發(fā)聲模塊、USB接口模塊等外設(shè)擴(kuò)展模塊,采用分層架構(gòu)進(jìn)行了嵌入式軟件開發(fā),對(duì)于UDS 的基本功能,均提前封裝為中間層API,作為原子能力供上層APP 調(diào)用,降低了軟件開發(fā)的難度,提高了功能迭代的效率。