简介电量计ES32L0910开发的过程中发现有些数据突发异常问题这里做一个数据勘误的记录以及提供一些建议更好的规避掉这些问题。一、电量计温度采集温度是主控采集电量计的温度数据原始数据是开尔文单位0.1K寄存器如下图主控采集到原始数据之后会做一个转换把开尔文转换成温度值。代码处理过程如下图这里做一下代码解读最上面一行是IIC采集电量计温度寄存器数据获取到读数据放在u8BatTemp数组里面因为数组是8为数据需要把数组中的数据合并成16位的数据合并之后就可以通过公式把开尔文转换成温度数据了。转换公式如下图所示二、电量计温度突发异常正常的室温下测试没出现过温度突发异常的现象当温度到达120℃时偶发会突发异常温度数据比如突然出现一个6280℃的异常虽然只出现一次这会导致上报异常温度出现问题用户可能会直观的感受到体验很不好。通过抓取温度数据突发温度异常数据如下图这类的问题主控这边软件可以增加滤波处理比如当温度超过500℃就丢掉或者连续采集3次温度值一样了再取这个值都可以解决这个问题。但是电量计为什么会在高温下突发异常温度值呢这也是一个潜在的隐患问题只是当时恰巧测出来了可以去规避一下那其他没有暴漏出来的问题就没办法了。三、电量计电压采集电池电压是从电量计采集的原始数据精度是mA主控获取之后没有处理直接对该值判断或者上报。如下图所示代码中u8BatCellVol是一个数组数组的大小是2这里连续采集两个8位数据合并成16位后就是电池电压精度还是很高的mA级别的。四、电压突发异常值新国标要求电芯电压异常也要做记录上报那我们模拟异常电压测试的时候发现会偶发电压突发异常的问题这个电压值是主控采集的电量计的数据当用模拟电池把电池电压调到过压4.26V的时候长时间保持会偶发32.51V异常数据很难复现经过大量的测试发现只模拟过压一会恢复正常电压不会出现只有长时间保持过压的时候才会出现。这种问题软件同样可以滤波处理电池充电上限电压是4.3V这里滤波可以做一些预留当电池电压大于4.6V时就丢掉。也可以采集一组数据采用中位值平均法滤波但是这样开始的数据慢一些显示出来。五、数据容错优化建议基于上面遇到的问题我们进一步分析了一下因为当前应用的环境相对复杂IIC属于板件通信数据有可能会出错。5.1 DC-DC 高频干扰I²C 时序毛刺、应答丢失、读写偶发错误DC-DC 满载 / 快充时故障变多。键干扰点SW 节点、功率电感、功率走线和 I²C 线近距离耦合、共地串扰是主因。5.2 蓝牙射频干扰蓝牙广播 / 连接 / 收发数据时I²C 瞬间出错蓝牙休眠时通信恢复正常。5.3 软件优化建议可以采用Smbus的方式对应答的数据进行校验这样容错率大大提升主机端采集数据时同样校验当检验值一样的时候再取数据。这种方式已经得到验证数据比较稳定可靠。六、总结所以软件设计到最后功夫都在防御性设计上面谁的软件越稳定数据不出错那就是优秀的软件设计。对于功能需求实现来说都是基本的要求如果功能都有问题更别谈容错性设计了。一个好的软件设计者就好比一个老司机能预判前路的风险提前规避安全到达目的地。希望你早日成为一个“老司机”。