当前位置:   article > 正文

BMS——SOC、SOH算法梳理_bms soc

bms soc

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)/
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/864626
推荐阅读
相关标签
  

闽ICP备14008679号