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清零置百点

  1. 每秒查询
    若触发过压保护标志位,将会触发SOC置百
    1、单体过压
    2、充满自停
    若触发过压保护标志位,将会触发SOC置百
    1、单体欠压
  2. 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)/
  • 8
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jeni成长小栈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值