常见的锂电池的算法–基础概念
1、锂电池的一些特性
(1)锂电池的各种静态和动态参数,都有个体差异,批次差异,型号差异。
(2)锂电池的剩余电量和电压有关。参考充放电曲线。
(3)锂电池的满电/空电状态对应的电量和电压参数,会随着充放电循环增多而老化衰减。
(4)锂电池的各种参数都随温度变化,一般额定参数是在某个特定温度下测量得到的。
(5)电池不同电压/剩余容量时的充放电电流极限值可能会不同,也可能老化,温度漂移。
2、常用SOX
(1)SOC:State of Charge,剩余电量百分比,剩余电量/实际容量
(2)SOH:State of Health,电池健康度,电池使用一段时间后老化衰减度,实际容量/额定容量
(3)SOE:Stete of Energy,剩余能量,与续航里程相关,需考虑续航相关的额外因素
(4)SOP:State Of Power,锂电池的允许充放电电流值在不同SOC,不同温度下是不同的。(例如:电动车在刚充满电时和快没电量时,所表现的性能是不一样的)
(5)DOD:Depth of discharge,放电深度,电池放电量与电池额定容量的百分比(例如:电池并不是完全放空电量,还是留有一定的电量保存在电池中)
3、总结说明
(1)SOX是从不同角度对锂电池特性的建模和参数表达
(2)物理上电池有个体差异,各种静态和动态参数在不同温度下也会变化甚至不成线性变化
(3)产品和项目中实现哪些SOX由产品和项目自身决定,没有统一标准
(4)SOX的实现可以有多种算法,可用1种或同时几种叠加使用以增强准确度
(5)SOX实现的关键点:算法选择、参数标定、验证试验体系和环境搭建
4、本课程中的实现
(1)本课程中只实现了SOC,未实现其余SOX,主要使用SOC计算剩余电量百分比
(2)本课程中SOC的实现采用了2种算法叠加:开路电压法、安时积分法
5、SOC代码解析
(1)电池状态的分析主要包括简单分析数据、实时校准容量、计算SOC值等主要部分。简单分析主要用于计算最大电压差、平均电压等简单参数;实时校准,主要是对采集的温度信息进行校准,SOC值计算主要包括开路电压法和安时积分法。
> // 电池状态分析任务线程入口 static void BMS_AnalysisTaskEntry(void *paramter) {
> BMS_AnalysisCapAndSocInit(); while(1) {
> BMS_AnalysisEasy();//简单分析,计算最大电压差、平均电压等简单参数
> BMS_AnalysisCalCap();//实时校准容量涉及因素:温度
> BMS_AnalysisSocCheck();//计算SOC值
> rt_thread_mdelay(ANALYSISI_TASK_PERIOD); } }
(2)简单分析,通过数据直接进行计算就能得到的
static void BMS_AnalysisEasy(void)
{
uint8_t index;
// 最大电压差
BMS_AnalysisData.MaxVoltageDifference = BMS_MonitorData.CellData[BMS_GlobalParam.Cell_Real_Number - 1].CellVoltage - BMS_MonitorData.CellData[0].CellVoltage;
// 平均电压
for (index = 0, BMS_AnalysisData.AverageVoltage = 0; index < BMS_GlobalParam.Cell_Real_Number; index++)
{
BMS_AnalysisData.AverageVoltage += BMS_MonitorData.CellVoltage[index];
}
BMS_AnalysisData.AverageVoltage /= BMS_GlobalParam.Cell_Real_Number;
// 实时功率
BMS_AnalysisData.PowerReal = BMS_MonitorData.BatteryVoltage * BMS_MonitorData.BatteryCurrent;
// 最大和最小电压
BMS_AnalysisData.CellVoltMax = BMS_MonitorData.CellData[BMS_GlobalParam.Cell_Real_Number - 1].CellVoltage;
BMS_AnalysisData.CellVoltMin = BMS_MonitorData.CellData[0].CellVoltage;
}
(3)
static void BMS_AnalysisTempCal(void)
{
static int16_t LastTemp = 0;
uint8_t Ratio; // 校准比率
uint16_t RateTemp;
int16_t MinTemp = BMS_MonitorData.CellTemp[0] * 10;
if (BMS_MonitorData.CellTempEffectiveNumber == 0)
{
return;
}
// 判断温度变化是否超过1度
if( MinTemp > LastTemp)
{
if (MinTemp - LastTemp >= 10)
{
LastTemp = MinTemp;
}
else
{
return;
}
}
else
{
if (LastTemp - MinTemp >= 10)
{
LastTemp = MinTemp;
}
else
{
return;
}
}
// 确定校准比率
if (MinTemp >= 250)
{
Ratio = 1;
}
else if (MinTemp >= 100 && MinTemp < 250)
{
Ratio = 2;
}
else if (MinTemp >= 0 && MinTemp < 100)
{
Ratio = 3;
}
else if (MinTemp >= -200 && MinTemp < -10)
{
Ratio = 4;
}
else if (MinTemp >= -300 && MinTemp < -200)
{
Ratio = 5;
}
else
{
Ratio = 6;
}
RateTemp = 1000 + Ratio * (MinTemp - 250) / 10;
if(RateTemp > TEMP_CAP_RATE_LIMITH_HIGH )
{
RateTemp = TEMP_CAP_RATE_LIMITH_HIGH;
}
else if(RateTemp < TEMP_CAP_RATE_LIMITL_LOW)
{
RateTemp = TEMP_CAP_RATE_LIMITL_LOW;
}
// 实时容量
BMS_AnalysisData.CapacityReal = BMS_AnalysisData.CapacityRated * RateTemp / 1000;
// 剩余容量
BMS_AnalysisData.CapacityRemain = BMS_AnalysisData.CapacityReal * BMS_AnalysisData.SOC;
}