信松嶺 XIN Song-ling 張召 ZHANG Zhao






摘要:汽車各個電子控制單元之間的通訊通過CAN,在汽車研發過程中,存在軟件不同步以致CAN通訊異常,無法交互信號,車輛功能異常。為滿足研發需求,采用Arduino UNO+MCP2515進行CAN信號解析、轉換并發送,試驗數據顯示,轉發物理量的正確性及實時性較好,表明該方案有效,為其他類似場景需求提供解決方案。
Abstract: The communication between various electronic control units of the vehicle is through CAN. In the process of vehicle development, software asynchronization leads to abnormal CAN communication, unable to exchange signals, and abnormal vehicle functions. In order to meet the research and development requirements, Arduino Uno +MCP2515 was used to analyze, convert and send CAN signals. The test data showed that the correctness and real-time performance of the forwarding physical quantity were good, which indicated that the scheme was effective and provided a solution for other similar scene requirements.
關鍵詞:控制器局域網;Arduino開發板;信號解析
Key words: controller area network;Arduino development board;signal parsing
中圖分類號:U463.1? ? ? ? ? ? ? ? ? ? ?文獻標識碼:A? ? ? ? ? ? ? ? ? ? ? 文章編號:1674-957X(2021)22-0006-03
0? 引言
當今階段的汽車電氣化程度日益發展,每臺配備數十個ECU(電子控制單元)[1],而它們之間并非是完全獨立的,完成某項整車功能可能需要來自幾個不同ECU的信號,例如非常熟悉的儀表顯示,它需要獲取ABS(防抱死制動系統)的車速信號,獲取ECM(發動機控制模塊)的發動機轉速和水溫信號,獲取TCM(變速箱控制模塊)的擋位信號。而TCM在執行換擋功能時,也同樣需要獲取發動機轉速和車速等其他控制器的信號。為了解決汽車控制器之間的通訊問題,德國Bosch公司開發了一種現場總線——CAN(Controller Area Network),并最終成為國際標準(ISO11519),是應用最廣泛的現場總線之一[2]。它通過兩條雙絞的線纜,以差分信號的形式進行通訊。CAN通訊具備以下特點:
①多主總線,每個節點機均可成為主機,且節點機之間也可進行通訊;
②通訊速率快,最高可達1Mb/s;
③采用CRC校驗并提供相應的錯誤處理功能,保證通訊的可靠性;
④最大的特點是沒有采用傳統的站地址編碼,取而代之對通訊數據塊編碼,這種方式可使節點機的個數在理論上不受限制,也可以使不同的節點機同時接收相同的數據,還可以作為發送仲裁的依據。
1? 原理與設計
1.1 研究背景
在汽車研發初期,會定義出車輛的配置及零部件方案,并以某款成熟汽車作為基礎進行改制,列舉如下場景:
場景一:改制車有控制器A,其外發的CAN信號中有個信號a,會被控制器B接收并執行其相應功能,而基礎車沒有控制器A,導致控制器B無法正常執行功能;
場景二:改制車將基礎車的控制器C更換為控制器D,那么控制器D與基礎車的其他控制器無法正常通訊,因為控制器D與控制器C對信號的定義不同;
場景三:預研新增控制器做原型開發,與已有的控制器通過CAN進行通訊(該控制器的應用層軟件非自主,不能直接在該控制器中開發,僅開放CAN接口),并通過其響應驗證新開發邏輯的可行性。
這三個場景有個共同點是都涉及到了CAN通訊,按照正常的開發流程需要各自的控制器更改軟件以適配CAN信號的變更,但不同的供應商會有不同的開發周期,舉例某供應商在僅更改CAN信號定義的軟件升級需要3至4個月,對于整車公司而言,這個周期是很長的,難以滿足開發需求。
1.2 問題分析
分析各個場景的問題核心,有如下解決方案:
場景一:可以通過設備模擬缺失的信號a;
場景二:可以將設備串接在控制器D前,并將交互的信號按照兩側的定義進行轉發,具體而言(為簡化描述,兩側分為左側和右側),設備按照左側的信號定義接收,解析后獲得表征的物理值,然后按照右側的信號定義發送,同理從右側接收,向左側發送;
場景三:可以通過設備運行新策略,并將最終結果通過CAN外發。
接下來對設備進行選型,筆記本電腦安裝BusMaster,可以通過USB口連ES581接入CAN總線,但此方案要占用一臺電腦資源,而且占用空間大,不易放置。
通過調研,MCP2515作為一款獨立的CAN控制器并集成了收發器[3],可以直接接入CAN總線,而與主控芯片通過SPI通信,主控芯片則選用Arduino UNO[4]。三個場景的網絡拓撲如圖1所示。
1.3 硬件連接
以場景二為例,僅儀表控制器更換供應商,其他控制器不變,開發設備的硬件包括:Arduino UNO一臺(含線,集成數據傳輸及供電功能),MCP2515兩塊,杜邦線若干。Arduino UNO與MCP2515引腳連接關系如表1所示。
將儀表控制器原有的CAN總線剪斷,儀表這一側的線頭與MCP2515(ABS)的CAN總線連接,另一側的線頭與MCP2515(總線)的CAN總線連接,注意雙絞線的兩條線不能接反,如果CAN信號中轉功能異常,這是一個排查點。Arduino UNO的線是USB口,可以通過車上的USB供電。
1.4 軟件設計
軟件是控制系統的靈魂,Arduino在軟件設計的優勢在這里就明顯的體現出來了。由于開源的緣故,很多專業的高水平的研究人員或電子愛好者,會將開發的驅動封裝為庫函數,在應用時就會極為方便,只需要調用幾個函數,就能輕松完成對外設的控制,讓我們更加專注于應用層軟件的設計,專注于功能的實現。
Arduino的軟件開發環境是Arduino IDE,與其他主控芯片有多個工具軟件的開發方式不同的是,這是一個集成開發環境,包含代碼編寫、編譯、下載等功能,界面簡潔友好[5]。
對于MCP2515的支持有許多庫函數,本次應用研究使用sutowp開發的arduino-mcp2515-master。該庫函數封裝了幾個重要且常用的函數:
①MCP2515 mcp2515(9),定義一個名為mcp2515的MCP2515對象,參數9代表mcp2515的片選引腳;
②mcp2515.setBitrate(CAN_500KBPS),定義mcp2515的總線速率為500kbps;
③mcp2515.readMessage(&canMsg),定義mcp2515的接收函數,并將報文信息保存至canMsg,包含3個主要內容,canMsg.can_id表示報文ID、canMsg.can_dlc 表示報文DLC(1~8)、canMsg.data[0]~ canMsg.data[7]表示1~8字節長度的數據場;
④mcp2515. sendMessage(&canMsg),定義mcp2515的發送函數,將canMsg保存的報文信息發送至總線;
為了滿足場景二的需求,需要提取特定CAN信號并轉發出去,其中有兩個關鍵點:ID匹配和數值轉換。通過canMsg.can_id可以直接獲得接收報文或定義發送報文的ID,接下來對數值轉換進行說明。數值轉換指的是報文的數據場數據(Raw Value)與信號的物理數據值(Physical Value)相互轉換的過程。在汽車CAN研發過程中,對數值轉換一般采用Excel管理,稱之為CAN Matrix進行描述,而每家汽車公司都有自己的模板,但大同小異,vector公司也制定了一種統一的DBC格式的文件來進行描述。主要包含以下主要內容:
①Byte Order,有Motorola和Intel兩種;
②Factor,數據場數據的“1”代表物理數據的值;
③Offset,偏移量,與Factor合用,Physical Value = Raw Value * Factor + Offset;
④Startbit,信號的Raw Value在數據場中的起始位置;
⑤Length,信號的Raw Value在數據場中的長度,影響其最大值。
借用BusMaster軟件界面,以發動機轉速為例進行說明,如圖2所示,Byte Order為Motorola,Factor為0.125,Offset為0,Startbit為16,Length為16。如圖2解析,數據場數據(Raw Value)的第1和第2字節代表的十六進制數值為4B00,對應十進制數值為19200,計算Physical Value為2400。圖中的Raw Value和Physical Value欄的數值框是可以輸入數據的,改變其中一個,另一個會自動改變為其對應的值。反之,已知Physical Value,先計算對應的Raw Value(十進制),轉為二進制,依據Length高位補0,再依據Startbit放置相應位置,即可得數據場數據。
將代碼輸入Arduino IDE,如圖3所示,通過點擊工具欄中“項目”下拉菜單的“驗證/編譯”,可以檢查語法等其他錯誤,會在最下方的消息框中以紅色字體提示,如沒有錯誤,編譯完成時則顯示如圖的白色字體信息。最后可以通過工具欄中“項目”下拉菜單的“上傳”來將程序燒錄至Arduino UNO。
2? 實驗
最后進入實車驗證階段,改制一臺領克03汽車,將儀表更換為另一家供應商的產品以模擬場景二,改制完成后發現發動機轉速、水溫、車速均沒有示數。
按1.3硬件連接中的方案將芯片接入汽車,如圖4所示,發現儀表發動機轉速、水溫、車速有示數。
主觀轉發正常,接下來進行數據采集,駕駛工況為自由駕駛,其中147s后為原地駐車踩油門,為了直觀所以以發動機轉速和車速為例進行說明,結果如圖5所示,圖中共顯示4個信號,ECM_EngSpd,ECM_VehSpd,CAN_EngineSpeed,CAN_VehicleSpeed,分別為ECM外發的發動機轉速,發動機接收的車速(ABS發出),ABS側CAN總線解析出的發動機轉速和車速,從圖中只看到兩條曲線,這是因為CAN_EngineSpeed和ECM_EngSpd基本重合,ECM_VehSpd和CAN_VehicleSpeed基本重合,這表明經過Arduino UNO+MCP2515的轉發,各個物理量可以保持原有值,而且轉發未出現明顯延時。
3? 結論
通過實車驗證Arduino UNO+MCP2515轉發CAN信號方案的可行性,為研發過程中由于CAN信號定義不同步帶來的通訊異常提供解決方案,研究結果表明,該方案切實有效。
參考文獻:
[1]方友勇.基于CAN總線的多ECU通信系統設計[D].南昌大學,2020.
[2]黃菊花,顧曉輝,曹銘.基于Arduino的CAN通信模塊的設計[J].南昌大學學報(工科版),2020,42(04):404-408.
[3]丁雪靜,許永輝.基于MCP2515的CAN總線通信單元設計[J].現代電子技術,2015,38(21):60-63.
[4]孫龍,劉暉虎.基于MCP2515的CAN總線控制軟件的設計與實現[J].現代信息科技,2018,2(07):1-4,8.
[5]趙琨.基于Arduino的云平臺智能家居控制系統設計與實現[D].華中師范大學,2020.