基于开路电压+安时积分法估算锂电池SOC(一)

         SOC对于电池的寿命以及使用效率是至关重要的,对于锂电池的SOC估算,有很多种,开路电压、安时积分、卡尔曼滤波、神经网络等方法。卡尔曼滤波、神经网络训练这两种方法目前只是处于理论阶段,对于开发人员开发难度大。安时积分法、开路电压法这两种开发难度较小,是行业内普遍的两种SOC估算方法。

        但是安时积分法、开路电压法这两种方法弊端也很明显。安时积分法即采用AH累积的方法,对动态的锂电池进行实时的SOC估算,这就对系统电流采集的精度要求非常高,如果误差大,AH累积的容量那必将跟实际容量误差大,导致SOC误差大。同时该方法对SOC初始值依赖非常高,每次充放电都必须充满至100%或者放完至0%,否则随着时间的推移,SOC的偏差会越来越大。开路电压校准法需要电池完全静置的情况下去测量电池的输出电压,再根据OCV-SOC曲线进行校准。当电池的静置时间不够,同样造成SOC偏差大,并且开路电压法只能在电池处于静置的情况下才能使用,电池处于动态则无法使用,因为不同倍率的充放电,锂电池的动态电压变化都不一样,所以该方法存在一定的局限性。

        基于安时积分法、开路电压法这两种的弊端,在这里给大家介绍一种方法,即开路电压法+安时积分法两种结合使用。使用开路电压法在电池静置时计算SOC的初始值,安时积分法计算电池动态的SOC值。

1、SOC-OCV关系

        笔者在这里使用的是国轩的额定容量为52Ah、标定电压3.2v,充放电电压范围在2.0v~3.65v磷酸铁锂电池做试验。

        室温内测试,忽略温度对电池的影响。单体电池以1C的电流放电电压至2.0v,静置30min,再以1C的电流充电至电压3.65v时转恒压充电,至充电电流降为2.6A时停止充电,充电后静置30min。然后再以1C的电流放电,每放5%容量,静置1h,然后记录静置后的电压数据,重复10次。数据如下:(如果量大,可以让电池供应商提供SOC-OCV曲线)

DOD/%  0% 5% 10% 15% 20% 25% 30% 35% 40% 45% 50% 55%
电压/V
3.375
3.329
3.328
3.328
3.328
3.328
3.327
3.324 3.310 3.294
3.290
3.289
DOD/%  60% 65% 70% 75% 80% 85% 90% 95% 100%
电压/V
3.288
3.288
3.284
3.272
3.253
3.230
3.210 3.180 2.928

         在SOH为1的情况下,将DOD/%可当作SOC,SOC-OCV曲线图如下:

基于开路电压+安时积分法估算锂电池SOC(一)_第1张图片

         通过上图可以看出,锂电池的SOC-OCV的线性关系并不是很好,在SOC100%到95%之间,电池OCV跳变很大,SOC在95%~65%之间,OCV变化很小,趋于平滑,SOC65%以下电池OCV开始有明显变化,特别是5%时,跳变试变化。为此,考虑到是以5%为间隔记录数据,笔者采用分段线性法,相邻两点之间做线性关系,计算出K、B两个参数,再通过二分法查表,查出当前静置电池的OCV电压在那条线上,再代入相对应的函数,计算出当前SOC初始值。代码实现如下:

if((uMidIndex != 0) || (uMidIndex != (tCELL_OVC_TABLE_LEN - 1)))
{
    if(uOcvValue > tCELL_OVC[uMidIndex])
	{
        uMidIndex -= 1;
		ufSolpe = 500/(tCELL_OVC[uMidIndex] - tCELL_OVC[uMidIndex + 1]);
        uCellSoc = 	(10000 -(uMidIndex*500)) - (ufSolpe*(tCELL_OVC[uMidIndex] -uOcvValue));
        return uCellSoc; 
    }
    else
    {
        ufSolpe = 500/(tCELL_OVC[uMidIndex] - tCELL_OVC[uMidIndex + 1]);
        uCellSoc = 	(10000 -(uMidIndex*500)) - (ufSolpe*(tCELL_OVC[uMidIndex] -uOcvValue));
        return uCellSoc; 
    }
}

        通过上述的方法进行测试验证,发现当电池充至SOC100%,静置1h后,SOC直接跳变为75.3%,放电SOC至0%后,静置1h,发现SOC直接跳变为4.8%左右,查看锂电池资料发现,静置时,锂电池的电压在2.9~3.0v之间,电池的电接近放完,电压在3.3~3.4V之间,电池满电。结合SOC-OCV曲线,我做了几点条件,需满足这些条件才SOC可以进行开路电压的校准,否则SOC不进行校准,继续保持当前值。

1、0%

2、开路电压<3.3V

3、需静置1h

#define SOC_OCV_Adjust_TIEME 7200 		//50*12*60静置60min 等电池电压稳定
uTimes ++ ;
if((uTimes >= SOC_OCV_Adjust_TIEME) &&
 (tRealData.uCellVol < 10000)&& (tRealData.uCellVol!= 0))
  {
       if(tRealData.uCellVol <= 3324) //单体电压在3.3V之内不修正
		{
            tRealData.uCellSoc = Search_OCV_Table(tRealData.uCellVol);
        }
        else
        {
            tRealData.uCellSoc = tRealData.uCellSoc;
        }
  }
else
{
     tRealData.uCellSoc = tRealData.uCellSoc;
}      
        

下一节介绍怎么将开路电压校准结合安时积分法估算SOC。

你可能感兴趣的:(c语言,单片机,stm32)