BMS——SOC、SOH算法梳理
SOC
原理
基本概念介绍
mAh:电池容量的计量单位,实际就是电池中可以释放为外部使用的电子的总数.
库仑的国际标准单位为电流乘于时间的安培秒.
1mAh=0.001安培*3600秒=3.6安培秒=3.6库仑
mAh不是标准单位,但是这个单位可以很方便的用于计量和计算。eg:一颗900mAh的电池可以提供300mA恒流的持续3小时的供电能力。
1.获取电流值
通过实时获取前端AFE芯片的电流值Info.CurCadc,将电流值赋值到 gCoulomb;再将此电流值累加到 gAccCoulomb;
Info.CurCadc 单位:10mA
2. 1S更新一次
{
- 每秒电流值
AccTemp = gAccCoulomb
AccTemp = AccTemp/(SOC_S_TIME*100);将单位转化为mAh
SoftSoc.RmCapTmp = SoftSoc.RemainCap + AccTemp; - 更新SOC
SocTmp = SoftSoc.RmCapTmp/gsThrSoc.CycleCapacity;
}
3. 18S更新一次
18S进行一次计算 BmsSoc_gauging()
{
-
将 gAccCoulomb 值转化给 Coulomb ——单位:mAh
Coulomb = (gAccCoulomb*10)/SOC_SAMPLE_TIME; //提取积分值,扩大了10倍(mAh) -
充电状态
Coulomb = (Coulomb*SOC_CHG_EFF)/1000; //根据充电效率计算充电累加 -
放电状态
k = k*CalcDsgRate(AbsInt32(Coulomb))/100;
先计算温度放电系数
再计算放电倍率剩余容量累加该值
SoftSoc.RemainCap += Coulomb; -
放电容量累计:
//计算放电总循环容量,用于计算循环次数
SoftSoc.TotalDsgCap += Coulomb;
放电容量累计达到总容量的80%后,循环次数+1 -
SOC = 剩余容量 / 循环容量
}
4. 强制SOC清零置百点
- 每秒查询
若触发过压保护标志位,将会触发SOC置百
1、单体过压
2、充满自停
若触发过压保护标志位,将会触发SOC置百
1、单体欠压 - 18S查询机制
充电充满置百机制
1、单体最高电压累计18S都高于满电100%电压(三元4.15V)且 截止电流 小于 500mA;
放电清零机制
1、单体最低电压累计18S都低于单体截止电压(三元3.0V)
源码
void BmsSoc_gauging(void)
{
U32 soc_temp;//循环容量16位*100后会溢出
uint16 CellVoltage;
int32 Coulomb,k = 100,CoulombAve;
SoftSoc.AccCounter = 0;
Coulomb = (gAccCoulomb*10)/SOC_SAMPLE_TIME;//提取积分值,扩大了10倍(mAh)
CoulombAve = Coulomb/10;
gAccCoulomb = 0;
if(battery.BatSta == BatteryCharging)
{
Coulomb = (Coulomb*SOC_CHG_EFF)/1000;//根据充电效率计算充电累加
SoftSoc.CoulombK = 100;//积分器增益系数
}
else
{
k = CalcTempDsgCoff();//计算温度放电系数
SoftSoc.CoulombK = k*CalcDsgRate(AbsInt32(Coulomb))/100;//计算放电倍率
Coulomb = Coulomb*SoftSoc.CoulombK/100;
}
Coulomb = Coulomb/20; //单位换算回0.1mAh
if((-Coulomb) >= (int32)SoftSoc.RemainCap)
{
SoftSoc.RemainCap = 0;
}
else
{
SoftSoc.RemainCap += Coulomb;
//循环次数由放电容量计算
if(Coulomb < 0)
{
SoftSoc.TotalDsgCap += Coulomb;// 计算放电总循环容量,用于计算循环次数
}
if(SoftSoc.TotalDsgCap < 0)
{
if((AbsInt32(SoftSoc.TotalDsgCap)