#每一次总是记混编码类型的特点,这次决定记录一下
1.intel类型
高位在高字节,低位在低字节。以3A6B为例,3A为高位,6B为低位。
2.motorola类型
高位在低字节,低位在高字节
2.1 LSB
起始位为lsb(最低位),往前边填充,即符合motorola类型要求。以3A6B为例,3A为高位,6B为低位,协议给定起始位是32bit。
2.2 MSB
起始位为msb(最高位),往边后填充,即符合motorola类型要求。以3A6B为例,3A为高位,6B为低位,协议给定起始位是55bit。
注:在写dbc文件时,有一个inverted勾选选项。如若勾选,位的排列将会倒置。例如,第一个字节从左往右将会变为0bit到7bit。
3.物理值与信号值的转换
在DBC定义中,每一个消息都能定义数据类型,factor(精度)与偏移(offset)
数据类型:signed(有符号类型,可表示正负),usigned(无符号类型,不能表示负数)
注:signed类型的负数是采用补码,也就是取反+1表示的
物理值=信号值*factor+offset
这里我理解的物理值,是这条信息物理意义上的取值。而信号值则是在can通信时候的值,也就是不经过dbc文件能在CANtest里面直接读取到的值。
举例:报文信息motor_torque,占8个bit,精度为0.1,偏移为1。这里我们可以选择自动计算范围,8个bit即2的八次方=256,由于该报文是signed有符号的,因此信号值的取值范围是-128到127。通过转换物理值的范围就是-11.8到13.7。如硬件或算法有约束,可以自己在文件中指定范围。
因此转换过程是
控制:给定电机扭矩指令 >> DBC:信号值=(物理值-offset)/factor >> CAN总线
反馈:CAN总线 >> DBC:物理值=信号值*factor+offset >> 电机反馈扭矩指令
精度与偏移是自己理解的,不确定正不正确,如有错误希望各位积极讨论