CAN總線哪個節點在通訊?發送了什麼信息?(三)

對寶馬燃油泵測試進行CAN譯碼

作者:Steve Smith

在關注了CAN總線哪個節點在通訊?發送了什麼信息?前兩篇帖子之後,我對ID 3 35數據(Data)字節的變化非常感興趣,因此我將對此進行深入探討。

以下是前兩篇文章的摘要:

  • 當燃油泵控制器與CAN網絡斷開連接時,ID 3 35消失。
  • 如果燃油泵已**或靜止,則ID 3 35在CAN總線上傳輸。但是,當燃油泵運轉時,數據字段會連續持續更新,間隔時間爲1秒。
  • ID 3 35在燃油泵通入電流(觸發點)之前的50ms進行傳輸。

由於我們已經證明該ID與燃油泵的運行有關,因此我撰寫這篇文章主要是分享解密CAN總線與ID 3 35相關聯的數據字段的過程。

在發動機關閉的情況下,我們給掃描工具安裝了電池以進行主動測試,掃描工具提供了三種選項來運行燃油泵:60升/時,120升/時和全速運行(無負荷控制)。

在圖1中,低壓燃油泵以120升/時的輸送速率運轉。

圖1

燃油泵是正佔空比控制的,如圖1黑色波形所示,該波形應用了數學通道duty(A)。現在,我們來看一下燃油泵控制器(CAN ID 3 35)數據字段的譯碼。在燃油泵啓動期間,我勾選了「時間標尺之間」這個選項。如圖2所示,可以看到燃油泵處於活動狀態時CAN的串行譯碼設置。

圖2

在圖3中,我在譯碼錶中添加了一個過濾器,僅顯示ID 3 35(在時間標尺之間),從而可以專注於ID 3 35相關的數據包。

圖3

請注意看燃油泵處於運轉或者靜止狀態時,CAN ID 3 35在CAN總線是如何傳輸的,以及燃油泵在運行期間如何以1秒的間隔連續更新數據字段(有效負載)。我使用了旋轉標尺和旋轉分區(我自定義了它們的值,通常爲度數,這裏設置爲秒),並把它們標到圖上,以表示每個燃油泵控制器開始傳輸信號的時間(觸發後)。這有助於找到燃油泵控制器CAN消息傳輸速率與燃油泵活動之間的關係。

那麼,我們如何將數據字段轉換爲可讀的數據?

如果沒有車輛製造商的專有數據庫文件(.dbc文件),那我們在努力研究的同時可能還需要一些運氣才能解決問題。首先,我們需要了解譯碼錶中的數據字段如何表示爲人類可讀數據,通常採用的是十進制值。

比較快速的方法是將譯碼錶中的十六進制更改爲十進制。但是請記住,我們的ID號爲3 35的CAN信號變爲十進制則ID號變爲3 53(因此,您需要過濾十進制3 53,而不是十六進制3 35 ,如圖4所示)。

圖4

下一個問題是:ID3 35(十六進制)如何變成3 53(十進制),爲什麼要這麼麻煩?我們使用十六進制的主要原因是可以用更少的數字來表示巨大的數字,這使得人們更容易地去理解。雖然PicoScope解譯碼錶可以用十六進制、二進制、十進制和ASCII來表示數據,但僅使用兩位十六進制數字就可以簡化數據的顯示和分析。

例如,十進制數值12500,其二進制爲0000 1101 0100,其十六進制爲304D。

圖5是一個參考表,幫助我們將數值從十六進制轉換爲十進制,兩位十六進制數字可以表示256個不同的值(包括0)。請注意,我在圖5中突出標記了CAN ID 3 35(十六進制)到CAN ID 3 53(十進制)的轉換。

                                                                                                                                                                                              圖5

我們經常看到表示爲0x52或0x98的數值。0x表示的是顯示值爲十六進制,因爲沒有出現字母(A-F),可能不能顯而易見地辨認出來。例如,0x52(十六進制)=82(十進制),0x98(十六進制)=152(十進制)

回到十六進制的譯碼錶(圖3),我們解釋一下這兩個數字如何表示數據位、半字節和字節,以及它們如何表示256個不同的值。我希望這能使CAN數據(或有效負載)的構造、分配和解析顯得更加清晰。

我們典型的CAN消息會包含8個字節的數據。以圖3作爲例子,我們可以看到數據包1的數據長度幀DLC =8,表示該數據包一次傳輸8個字節的數據。

請注意,CAN數據包指的是整個CAN幀,包括:ID位, RTR位, FDF位, DLC位, Data位, CRC位, ACK位, CRC Valid位, Bit Stiffing Valid位, Valid位,IDE位。

數據字段包含多個兩位(十六進制)的數據,每兩位爲一組表示一個數據字節(總共8個字節)。數據包1數據字節爲:00 C8 00 00 00 7E 00 00

每個字節由8位(1位是計算機存儲的最小組成部分)二進制1或0(分別爲CAN差分電壓0V或2V)組成,這是CAN網絡控制器的語言。值得注意的是,把這8位分成兩個部分,每個部分由4位組成,每4位稱爲「半字節」。

那麼,十六進制是如何用二進制值來表示十進制單位的呢?爲什麼要這麼麻煩呢?實際上,這都是爲了使人類更容易理解二進制系統(計算機語言到人類語言)。

圖6將數據/有效載荷拆分,從字節0到字節7,一共8個字節。還包括十進制、二進制值以及按半字節分組的位編號。

圖6

我們根據圖6中的數據,以字節1數據0xC8(十進制爲200)爲例。

圖7

要計算0xC和0x8的十進制值,我們需要添加每個二進制位表示的十進制單位。如圖7所示,C=8+4+0+0=12,8=8+0+0+0=8,但12+8不等於200!那麼計算機如何知道0xC8 = 200?如何知道0xC = 12,0x8 = 8?

這一切歸結於製造商編碼,以及相關控制器如何解析CAN網絡上傳輸的數據。您可能會注意到上圖中每個字節下面的位編號。不同廠商的位編號順序有所不同,這也是.dbc文件最有價值的部分。但在本應用中,我們將假定它們的編號如上所述。

 

假設字節1數據0xC8(十進制200)表示燃油泵控制器傳輸的目標油量爲每小時200升。控制器將被編程爲以8位數據(一個字節)的形式發送該值。請注意:我們稍後將證明字節1並不是代表燃油輸送量。

車載網絡上的各個電子控制單元從ID3 35的CAN信號中採集燃油輸送量,從位編號爲48開始,長度爲8位(位48至55),請記住8位(兩個十六進制數字)可以表示256個不同的值(包括零),這稱爲8位分辨率。

現在研究一下燃油泵的燃油輸送速率。我們用8位表示0-200升/時(最大值)。燃油輸送增量(200升/時)/256=0.781升/時。儘管我們處理爲256個增量,但是事實上我們只能使用200個增量。

如果採用的是4位分辨率而不是8位,車載網絡上的各個電子控制單元從ID3 35的CAN信號中採集燃油輸送量。但是這次是從第48號位開始,順數4個位(從48到51號位),請記住4位(一個十六進制數字)可以表示16個不同的值(包括零),這是4位分辨率。此時,(200升/時)/ 16 = 12.5 升/時的燃油輸送增量,這不足以對燃油輸送量進行精確的控制。

分辨率會因爲傳輸數據變化而產生變化,用於表示數據的位數越多,測量的精度和準確度將越高:

例如:1位(1位分辨率)可以充分表示大燈的開或關狀態,1=開,0=關。

那麼發動機轉速(rpm)呢?

4位分辨率= 24 =16。4位分辨率可以將模擬輸入編碼爲16個不同級別(0-15)。6000 rpm / 16 = 375 rpm。換句話說,轉速可以精確到每級相差375 rpm。

8位分辨率= 28 =256。8位分辨率可以將模擬輸入編碼爲256個不同級別(0-255)。6000 rpm / 256 = 23.44 rpm。換句話說,轉速可以精確到每級相差23.44 rpm。

12位分辨率= 212 =4096。12位分辨率可以將模擬輸入編碼爲4096個不同級別(0-4095)。6000 rpm / 4096 = 1.465 rpm。換句話說,轉速可以精確到每級相差1.465 rpm。

16位分辨率= 216 = 65536。16位分辨率可以將模擬輸入編碼爲65,536個不同級別(0-65535)。6000 rpm / 65536 = 0.092 rpm。換句話說,轉速可以精確到每級相差0.092 rpm。

從上面的信息中可以看到,我們需要根據相關傳感器或執行器所需的分辨率來選擇適當的位分辨率。那麼這與將燃油控制器信息轉換爲人類可讀數據有什麼關係呢?

我在文章開頭提到過,如果沒有可用的.abd文件,可能需要一點運氣。通過使用掃描工具測試燃油泵,快速識別了數據字段(有效載荷)的十進制模式以及在主動測試中顯示的燃油輸送速率!

總結如下:

在泵運行期間,ID 3 35每1秒發送1次。

字節0不變,在整個泵運行期間保持固定爲0x00。

字節1通過十六進制數據C8,D9,E9、9、19等週期性打開或關閉泵(以十進制遞增16)。這些似乎是一個週期性循環滾動的時鐘,可能表示工作時間。

泵從關閉到打開,字節2由0x00變爲0x39。如圖1所示,我們使用一個數學通道來顯示燃油泵的正佔空比控制(約爲48%)。因爲0x39這個字節數據的十進制值爲57,該字節可以作爲目標正佔空比的參考!對獲取的十進制值(57)校正可能是100-57 = 43%爲目標正佔空比。

請注意,當驅動燃油泵以60升/時速率工作時,字節2十進制值變爲24,並且使用數學通道測得的正佔空比爲22%。

泵從關閉到打開,字節3由0x00變化後的值主要爲1B,1D和1C。對於這個字節,在現階段,我還未研究出這個字節的數據所表示的意義。

泵從關閉到打開,字節4數據由0x00變爲0x10,採集到8366數據包時,這個時刻泵已經停止工作,字節4依然保持爲0x10。我猜想這個字節4指的是燃油壓力。

泵從關閉到打開,字節5由0x7E變化後的值主要爲0x7D。0x7D代表的十進制值爲120,我猜這是目標燃料輸送量(升/時)。

泵從關閉到打開,字節6由0x00變化爲0x78。0x78代表十進制值120,我猜這是實際的燃油輸送量,在以120升/時速率驅動燃油泵測試中,與掃描工具的顯示值一致。請注意,以60 升/時驅動燃油泵時,該十進制值將變爲60。

泵從關閉到打開,字節7由0x00變爲0x36。關於字節7,這可能是燃油泵實際的佔空比。請注意,當以60升/時驅動燃油泵時,此十進制值變爲27。

在圖8中,您可以看到用十進制值表示按時間繪製的圖表,這有助於使每個字節數據顯示得栩栩如生。

圖8

通過結合使用CAN譯碼、過濾、繪製圖表、人爲調節泵狀態一系列操作,我們繪製了一張圖像來說明燃油泵控制器中數據字節的變化,並將它們的十進制值連接到我們可以想到的單位,例如時間,輸送速率和壓力等。

這不是一門精確的科學,也不是100%準確的,因爲可能有些猜想是不對的!沒有.dbc文件來描述CAN ID、字節順序、起始位、位長、公式和單位,那麼我們就不知道每個字節的十進制值所代表的含義,但至少我們可以嘗試解讀一下。

我希望當我們去嘗試解讀CAN數據時,上述內容能夠帶來一定的提示,並且提供給我們一些關於車輛測試的基礎知識。

繼續回到CAN,圖9的捕獲中包含一個安裝在燃油泵鎖環上的加速度計。我注意到在低輸送速率(60升/H)時,泵出現噪音且運轉費力!這可以從流經燃油泵的電流和加速計的響應中看出(見圖9)。注意在整個60升/小時速率的試驗(正佔空比爲22%)期間,佔空比保持不變,以確定燃油泵的費力現象不是由燃油泵控制器「控制」的偶然性造成的。

圖9

通過使用我們的Pico NVH套裝,可以用加速度計捕獲燃油泵的噪音數據(圖10),將其轉換爲音頻文件並收聽回放!(音頻文件請點擊這裏下載)

圖10

雖然目前這輛車沒有表現出與燃油充注或性能有關的任何問題,但燃油泵似乎已接近其使用壽命。我將密切關注燃油壓力,因爲這是我自己日常使用的車。

 

更多修車案例、教學視頻請關注官微