对宝马燃油泵测试进行CAN译码
作者:Steve Smith
在关注了CAN总线哪个节点在通讯?发送了什么信息?前两篇帖子之后,我对ID 3 35数据(Data)字节的变化非常感兴趣,因此我将对此进行深入探讨。
以下是前两篇文章的摘要:
-
当燃油泵控制器与CAN网络断开连接时,ID 3 35消失。
-
如果燃油泵已激活或静止,则ID 3 35在CAN总线上传输。但是,当燃油泵运转时,数据字段会连续持续更新,间隔时间为1秒。
-
ID 3 35在燃油泵通入电流(触发点)之前的50ms进行传输。
回顾:
车用总线技术 | CAN总线哪个节点在通讯?发送了什么信息?(一)
车用总线技术 | CAN总线哪个节点在通讯?发送了什么信息?(二)
由于我们已经证明该ID与燃油泵的运行有关,因此我撰写这篇文章主要是分享解密CAN总线与ID 3 35相关联的数据字段的过程。
在发动机关闭的情况下,我们给扫描工具安装了电池以进行主动测试,扫描工具提供了三种选项来运行燃油泵:60升/时,120升/时和全速运行(无负荷控制)。
在图1中,低压燃油泵以120升/时的输送速率运转。
燃油泵是正占空比控制的,如图1黑色波形所示,该波形应用了数学通道duty(A)。现在,我们来看一下燃油泵控制器(CAN ID 3 35)数据字段的译码。在燃油泵启动期间,我勾选了“时间标尺之间”这个选项。如图2所示,可以看到燃油泵处于活动状态时CAN的串行译码设置。
在图3中,我在译码表中添加了一个过滤器,仅显示ID 3 35(在时间标尺之间),从而可以专注于ID 3 35相关的数据包。
请注意看燃油泵处于运转或者静止状态时,CAN ID 3 35在CAN总线是如何传输的,以及燃油泵在运行期间如何以1秒的间隔连续更新数据字段(有效负载)。我使用了旋转标尺和旋转分区(我自定义了它们的值,通常为度数,这里设置为秒),并把它们标到图上,以表示每个燃油泵控制器开始传输信号的时间(触发后)。这有助于找到燃油泵控制器CAN消息传输速率与燃油泵活动之间的关系。
那么,我们如何将数据字段转换为可读的数据?
如果没有车辆制造商的专有数据库文件(.dbc文件),那我们在努力研究的同时可能还需要一些运气才能解决问题。首先,我们需要了解译码表中的数据字段如何表示为人类可读数据,通常采用的是十进制值。
比较快速的方法是将译码表中的十六进制更改为十进制。但是请记住,我们的ID号为3 35的CAN信号变为十进制则ID号变为3 53(因此,您需要过滤十进制3 53,而不是十六进制3 35 ,如图4所示)。
下一个问题是:ID3 35(十六进制)如何变成3 53(十进制),为什么要这么麻烦?我们使用十六进制的主要原因是可以用更少的数字来表示巨大的数字,这使得人们更容易地去理解。虽然PicoScope解译码表可以用十六进制、二进制、十进制和ASCII来表示数据,但仅使用两位十六进制数字就可以简化数据的显示和分析。
例如,十进制数值12500,其二进制为0000 1101 0100,其十六进制为304D。
图5是一个参考表,帮助我们将数值从十六进制转换为十进制,两位十六进制数字可以表示256个不同的值(包括0)。请注意,我在图5中突出标记了CAN ID 3 35(十六进制)到CAN ID 3 53(十进制)的转换。
我们经常看到表示为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中的数据,以字节1数据0xC8(十进制为200)为例。
C 8
8 4 2 1 8 4 2 1(位十进制值)
1 1 0 0 1 0 0 0二进制(1或0),由8位(1个字节)组成,分为2个半字节(4位)。
要计算0xC和0x8的十进制值,我们需要添加每个二进制位表示的十进制单位。因此,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。
在图7中,您可以看到用十进制值表示按时间绘制的图表,这有助于使每个字节数据显示得栩栩如生。
通过结合使用CAN译码、过滤、绘制图表、人为调节泵状态一系列操作,我们绘制了一张图像来说明燃油泵控制器中数据字节的变化,并将它们的十进制值连接到我们可以想到的单位,例如时间,输送速率和压力等。
这不是一门精确的科学,也不是100%准确的,因为可能有些猜想是不对的!没有.dbc文件来描述CAN ID、字节顺序、起始位、位长、公式和单位,那么我们就不知道每个字节的十进制值所代表的含义,但至少我们可以尝试解读一下。
我希望当我们去尝试解读CAN数据时,上述内容能够带来一定的提示,并且提供给我们一些关于车辆测试的基础知识。
继续回到CAN,图8的捕获中包含一个安装在燃油泵锁环上的加速度计。我注意到在低输送速率(60升/H)时,泵出现噪音且运转费力!这可以从流经燃油泵的电流和加速计的响应中看出(见图8)。注意在整个60升/小时速率的试验(正占空比为22%)期间,占空比保持不变,以确定燃油泵的费力现象不是由燃油泵控制器“控制”的偶然性造成的。
通过使用我们的Pico NVH套装,可以用加速度计捕获燃油泵的噪音数据(图9),将其转换为音频文件并收听回放!
虽然目前这辆车没有表现出与燃油充注或性能有关的任何问题,但燃油泵似乎已接近其使用寿命。我将密切关注燃油压力,因为这是我自己日常使用的车。
本文用到的检测设备是虹科Pico汽车示波器4425A