项目场景:
延锋仪表项目ODO总计里程功能
问题描述:
总计里程计算精度不达标
原因分析:
总
里
程
S
=
∫
0
t
V
(
t
)
d
t
总里程S = \int_0^t {V(t)} \,{\rm d}t
总里程S=∫0tV(t)dt
函数周期为20ms,也就是积分时间 t 整车速度单位为KM/h 导致要把时间单位统一
ms换算为h需要除以180 000 这样就引入了除法,导致精度丢失严重;
解决方案:
核心思想:把除法转换为减法:在while循环里面减去除数,每减去一次商就++
代码如下:
v1 = v1 + spd.vehspd1; /*20210628 yc add */
while(v1 >= 180)
{
v1 = v1-180;
l_l_odo_count_u32++;
}
if(l_l_odo_count_u32 > l_l_odo_count_backup_u32)
{
odo_delet_u16 = (uint16)(l_l_odo_count_u32 - l_l_odo_count_backup_u32);
}
else
{
odo_delet_u16 = (uint16)(0xFFFFFFFF-l_l_odo_count_backup_u32 +l_l_odo_count_u32 +(UINT32)1);
}
l_odo_count_u16 = l_odo_count_u16 + odo_delet_u16;
if(l_odo_count_u16 > 65535)
{
l_odo_count_u16 = 0;
}
l_l_odo_count_backup_u32 = l_l_odo_count_u32;
Rte_Write_ppSR_TIOdoLogicMdl2OdoMdl_NewRollingOdo(l_odo_count_u16);