ECU中的定点与缩放

浮点数
与科学计数法相似,任意一个 J 进制数 N ,总可以写成:
N = J^E × M
式中 M 称为 N 的尾数(mantissa),是一个纯小数。E 为 N 的阶码(exponent),是一个整数, J 称为比例因子 J^(E) 的底数。这种表示方法相当于数的小数点位置随比例因子的不同而在一定范围内可以自由浮动,所以称为浮点表示法,C语言中的以float和double就属于这种类型。


定点数

假设用一个 n 位字来表示一个定点数:
X = X0 X1 X2 … Xn-1
其中一位 X0 用来表示数的符号位,其余位数代表它的量值。为了对所有 n 位进行统一处理,符号位 X0 通常放在最左位置,并用数值0和1分别代表正号和负号。对于任意定点数,如果 x 表示的是纯小数,那么小数点位于 X0 和 X1 之间,数的表示范围为:
0 ≤ |X| ≤ (1 - 2 -n)
如果 X 表示的是纯整数,则小数点位于最低位 Xn-1 的右边,数的表示范围为:
0 ≤ |X| ≤ (2n-1 - 1)
目前计算机中大多采用定点纯整数表示,因此将定点数表示的运算简称为整数运算。
定点计算在ECU中的使用
定点数表示法的缺点在于其形式过于僵硬,固定的小数点位置决定了固定位数的整数部分和小数部分,不利于同时表达特别大或特别小的数,最终绝大多数现代的计算机系统采纳了浮点数表达方式。但在汽车ECU中却是定点整数运算占了上风,这是因为在ECU中:
(1)计算量大
对于汽车控制器ECU而言,其内部拥有大量的数值计算,里面包括着大量数学模型,相比于浮点运算,定点运算的速度要快上一个数量级。而且随着计算量增多,定点的优势会越发明显。
(2)内存与速度
通常执行定点计算需要更少的内存和更少的处理器时间。对于底盘以及传动系统中的ECU对于计算的实时性要求很高,包含着许多1ms,5ms,10ms,20ms的周期process,这就意味着需要着需要在更少的时间内,完成更多的计算任务。
(3)价格低廉
相比于浮点MCU而言,定点MCU的结构更为简单,功耗更低,造价更为低廉。在汽车零配件这种对成本锱铢必较的行业,这对于各个Tier1的诱惑就更不必多说了。
Scaling 缩放
既然ECU中依靠的是定点整型计算,那其中的小数已经是如何实现的?Scaling(缩放)。就好比,在ADC的10位采样中,5V就使用0x3FF 来表示,即1个hex代表了4.886mV(5000mV/1023),也可以说这个物理量的精度为4.886mV。
我们举个例子,下面这个图是一个简单的计算车辆加速度的数学模型,包括驱动力F,阻力f,车身质量m,以及最后期望得到的加速度a。我们用PHY()表示该变量的物理值,HEx()来表示该变量在MCU内存中的数值。

phy(F)= 0.25 hex(F)
阻力f,精度0.5N:
phy(f)= 0.5 hex(f)
质量m,精度0.1kg:
phy(m)= 0.1 hex(m)
加速度a,精度0.2m/s2:
phy(a)= 0.2 hex(a)
物理公式:
phy(a) = [phy(F) - phy(f)] / phy(m)
将其转化为定点整数运算的同时,也就是将hex值带回到上述公式的过程:
0.2 hex(a) = [0.25 hex(F) - 0.5 hex(f)] / [0.1hex(m)]
遵循着先乘后除的原则,最终在ECU中运行的代码可能是这样的:
hex(a) = [25 hex(F) - 50 hex(f)] / hex(m) / 2
使用Simulink等自动代码生成工具,还会基于此进行进一步优化,比如使用底层库函数来进行算符运算,或者把(÷2)改成右移(>>1)等等。
通过缩放方法,使得在满足MCU定点整数运算的前提下,还高效的实现了小数计算,同时自动代码生成工具又防止了数值溢出的风险,进一步增强了系统的稳定性。至于Scaling到最后标定工具的实现,依靠的是A2L文件,具体可以看之前的这一期(A2L文件介绍),这里就不再赘述了。
最新资讯
-
测迅乌镇&盐城测试场:助力智能网联汽车标
2025-02-22 12:39
-
使用示波器对三相电机驱动器进行测量
2025-02-22 12:37
-
上汽集团大乘用车重磅招聘
2025-02-22 12:25
-
GB/T 44173-2024对开门预警DOW的要求
2025-02-22 12:25
-
声音工程:像用PS一样编辑声音
2025-02-21 17:04