BMS中的SOC的计算其实可以分为三大部分:1、电芯层级的SOC计算(软件中最真实的SOC计算,不涉及任何滤波处理);2、模组或者电池包层级的SOC计算(电芯到电池包级别的SOC映射,即电池包的SOC是更接近于电芯的SOCmin还是SOCmax);3、最终呈现给客户的显示SOC的计算(客户端显示永远在0%-100%,具有放电不增加、充电不减小、不跳变等特性;将电芯的使用区间(20%-90%)映射至0%-100%,还是涉及到滤波算法等)。
1、电芯层级的SOC的计算:
式1:SOC的安时积分计算公式
式1中给出了安时积分的SOC计算公式,这是大家所熟悉的,可是式中的分母Q如何选取,目前有两种常见的选取方式:(1)Q为最大容量;(2)Q为额定容量。(以1C从4.25V放电至2.8V,至于温度我们后面详细讨论)。
Q为最大容量,比较好理解,但是电芯的最大容量是在整个电芯处于化学性能最活跃时能放出的容量,所以只能化学公式进行推动(电化学的同事告诉我的),工程中,可以用55℃的容量近似作为最大容量(三元电芯在60℃禁止使用,实际试验数据可以说明55℃的容量与最大容量差值一定在1Ah以内,且三元的电芯随着温度的升高,容量是变大的)。
Q为额定容量(25℃的容量),这是大部分人会使用的,但是有个问题,对于HEV的电芯,电芯额定容量小,比如37Ah,在55℃时电芯的容量会达到41Ah,那么在55℃满充时的SOC就会达到110%以上,这样的SOC数值,是肯定不可以显示在客户端的;一般在这样情况下,会通过一些算法进行处理,保证客户端的显示SOC是100%。
其实本人还是建议使用最大容量作为分母,因为这样方便处理,毕竟电芯层级的SOC需要最真实的计算值;PS,纠正一个误区:电芯本身的SOC与温度是没有关系的;大家一直觉得低温时,电芯不耐用,其原因是因为电芯的内阻变大,可用容量变小了;打个形象的比喻:一杯水,温度越低,结冰的部分越多,倒出的液体越少,等温度回升后,冰还是可以化成水的;
因此SOC的计算与温度是没有关系的(当然了,电芯的老化与内阻是关系,只是老化是个长时间尺度的过程),客户端的SOC处理方式是会涉及到温度的,毕竟用户并不是那么专业的;
除了式1中的安时积分,大家常见的还有OCV-SOC查表修正,还有卡尔曼滤波等算法,对于卡尔曼滤波,https://blog.csdn.net/qq_18163961/article/details/52505591,这个是我见过最好的卡尔曼滤波介绍;最近一直在弄卡尔曼滤波,难点其实就是过程噪声方差Q以及测量噪声方差R如何选取(之后的文章可以跟大家一起分享);先给个结果,目前卡尔曼滤波可以将开路电压的预测误差控制在-5mV-10mV(计算值与测量值的差值)以内,SOC的误差可以控制在4%以内(与安时积分相比),而且是在芯片里实时跑的代码;
图1:EKF估算的SOC与OCV电压
对于SOC的计算我想说的有以下几点:1、SOC的误差一定针对某种参考计算方法而言,比如相对于安时积分而言的误差,SOC的误差是个相对误差,不是绝对的,因为所有的参考方法本身也不是100%正确;2、对于端电压或者OCV的预测也是计算值与测量值的误差,因为电压采样芯片本身会在行车或者充电过程中吗,因为EMC干扰或者PCB的layout布置导致电压采样有3-5mV的偏差。
2、电池包层级的SOC计算
其实电池包层级的SOC的意义更多的是用于限制电池包的使用,用于象征,比如整个电池包是1并96串的,也就是1P96S,因为容量不一致性导致,93个单体的SOC是90%,3个单体是80%,那么如何去定义PackSOC呢?分充电工况和放电工况两种情况,放电的时候让PackSOC更靠近SOCmin,充电的时候让PackSOC更靠近SOCmax,方法有归一法等;
3、客户端的显示SOC(DispSOC)
客户端的显示SOC一般会包含以下几个特性:(1)放电时,SOC不能增加;(2)充电时,SOC不能减小;(3)SOC不发生跳变(当电芯的SOC计算值被修正时,电芯的SOC是会跳变的);(4)在车不能行驶时,DispSOC要在0%-1%,车辆满充时,DispSOC要为100%;(5)将电池包使用的DOD区间mapping到[0%,100%];
为了满足以上4个特性,需要设计一个良好的跟随策略,当然该策略有效的前提是,真实的SOC计算是OK的;
比如:保证DispSOC(t+1)/PackSOC(t+1)=PackSOC(t)/DispSOC(t)=DispSOC(0)/PackSOC(0),如下图2所示: