3、开路电压法(OCV-SOC):OCV-SOC曲线的标定实验、曲线拟合与查表法实现、温度对OCV的影响及补偿
聊到SOC估算,开路电压法绝对是个绕不开的基础方法。说白了,它利用的是电池静置时的端电压与剩余电量之间的一一对应关系。你想想看,电池放那儿不动,内部电化学反应趋于平衡,这时候测出来的电压,就能直接映射出SOC。
但这里有个坑——不是所有电池都乖乖听话。我在项目中遇到过一款三元锂电池,静置4小时后电压还在缓慢爬升。嗯,这就要说到标定实验的细节了。
3.1 OCV-SOC曲线的标定实验
标定实验的目的,就是拿到一组准确的「电压-SOC」数据对。我个人习惯用以下步骤:
- 满充校准:先以0.5C恒流充到截止电压,再转恒压充到电流小于0.05C。这一步确保SOC=100%是准的。
- 阶梯放电:以0.2C放电,每放出10%的容量就停下来。比如标称100Ah的电芯,每放10Ah停一次。
- 充分静置:这是关键。我建议静置时间至少2小时,磷酸铁锂可能需要3-4小时。为什么?因为极化电压需要时间消散。
- 记录OCV:静置结束前1分钟内,取电压平均值作为该SOC点的OCV。
- 重复至放空:一直放到截止电压,记录下所有数据点。
我的小技巧:标定实验最好做两组——充电方向和放电方向。你会发现两条曲线不完全重合,这就是迟滞效应。实际使用时,我一般取两条曲线的平均值作为最终OCV-SOC曲线。
3.2 曲线拟合与查表法实现
拿到离散数据点后,我们需要把它变成可用的数学模型。两种主流做法:曲线拟合和查表法。
曲线拟合
我常用多项式拟合,阶数选6-8阶就够了。阶数太低拟合不准,太高容易过拟合。给你看段代码:
// OCV-SOC 多项式拟合示例(6阶)
// 系数需根据实际电芯标定数据计算
float ocv_soc_poly(float soc) {
// coeff[0] + coeff[1]*soc + coeff[2]*soc^2 + ...
float coeff[7] = {3.2, 0.8, -0.5, 0.3, -0.1, 0.02, -0.001};
float result = 0.0;
float term = 1.0;
for (int i = 0; i <= 6; i++) {
result += coeff[i] * term;
term *= soc;
}
return result;
}
但说实话,多项式拟合在两端(SOC接近0%或100%)容易发散。我建议改用分段拟合,比如每10% SOC一段,用3阶多项式拟合。
查表法
查表法更直接,也更稳定。把标定数据做成表格,运行时线性插值:
// OCV-SOC 查表法实现
// 表格数据来自标定实验
const float ocv_table[11] = {3.0, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 4.0, 4.2};
const float soc_table[11] = {0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0};
float ocv_to_soc(float ocv) {
// 边界检查
if (ocv <= ocv_table[0]) return 0.0;
if (ocv >= ocv_table[10]) return 1.0;
// 查找区间
for (int i = 0; i < 10; i++) {
if (ocv >= ocv_table[i] && ocv < ocv_table[i+1]) {
// 线性插值
float ratio = (ocv - ocv_table[i]) / (ocv_table[i+1] - ocv_table[i]);
return soc_table[i] + ratio * (soc_table[i+1] - soc_table[i]);
}
}
return -1.0; // 异常情况
}
重要提醒:查表法的精度取决于表格密度。每1% SOC一个点,精度就够用了。但表格太密会占用Flash空间,需要权衡。
3.3 温度对OCV的影响及补偿
温度一变,OCV曲线就跟着跑偏。这是很多新手容易忽略的点。我曾经在冬季测试时发现,同一块电池在-10°C和25°C下测出的OCV差了将近50mV,换算成SOC误差得有5%以上。
为什么会这样?因为温度影响电池内部化学反应的平衡电位。低温下内阻增大,极化效应更明显,测出来的开路电压其实不是真正的平衡电位。
补偿方法我总结了两条路:
- 多温度标定法:在-20°C、0°C、25°C、45°C等典型温度下分别做OCV-SOC标定。运行时根据当前温度查对应的曲线。这是最准的方法,但工作量也最大。
- 电压修正法:以25°C为基准,建立温度修正系数。公式大致是:
OCV_corrected = OCV_measured + k * (T - 25)。k值需要通过实验拟合,一般在-0.3~-0.5 mV/°C之间。
避坑指南:我曾经在项目中只做了25°C的标定,结果夏天和冬天的SOC误差大到离谱。后来老老实实补做了-10°C和45°C的标定,才把误差压到2%以内。所以,温度补偿这块千万别偷懒。
最后说一句,开路电压法虽然简单,但它有个硬伤——必须静置足够长时间才能用。动态工况下,你测到的端电压是OCV加上极化电压,直接查表会出大问题。所以实际项目中,开路电压法通常作为校准手段,或者与安时积分法配合使用。
嗯,这一节就聊到这儿。下一节我们讲安时积分法,那又是另一番天地了。