4、开路电压法(OCV):OCV-SOC曲线标定、OCV法的优缺点、OCV法在静置工况下的应用
聊到SOC估算,开路电压法(OCV法)是绕不开的基础。说白了,它就是利用电池静置时的端电压与剩余电量之间的对应关系来查表。这个方法听起来简单,但实际工程里坑不少。我最早做BMS项目时,就因为在OCV曲线上吃了亏,导致SOC跳变被客户投诉。今天咱们就把这块掰开揉碎了讲清楚。
4.1 OCV-SOC曲线标定
OCV-SOC曲线,就是电池在开路状态下,端电压与SOC的一一对应关系。这条曲线是OCV法的灵魂。曲线不准,后面所有估算都是扯淡。
标定流程,我一般这么干:
- 准备电芯:选同一批次、同一工艺的电芯,先做容量标定。确保电芯一致性没问题。
- 恒流放电至截止电压:比如3.0V,然后静置2小时以上。让电池内部电化学反应彻底平衡。
- 阶梯充电:以0.05C小电流充电,每充入5%或10%的标称容量,就停下来静置1-2小时。记录静置结束时的端电压。
- 重复步骤3:直到充满(比如4.2V)。
- 放电方向同样做一遍:从满电开始,阶梯放电,记录每个SOC点的OCV。
- 取平均:充电方向和放电方向的OCV取平均值,作为最终的OCV-SOC曲线。
关键点:静置时间一定要足够。我见过有人为了赶进度,只静置30分钟,结果曲线偏差很大。锂离子电池内部扩散过程很慢,尤其是磷酸铁锂,静置2小时都不一定够。
标定完成后,我们会得到一张类似下面的表格(以三元锂电池为例):
| SOC (%) | OCV (V) |
|---|---|
| 0 | 3.00 |
| 10 | 3.45 |
| 20 | 3.55 |
| 30 | 3.62 |
| 40 | 3.68 |
| 50 | 3.72 |
| 60 | 3.76 |
| 70 | 3.80 |
| 80 | 3.85 |
| 90 | 3.95 |
| 100 | 4.20 |
实际工程中,我们会把这条曲线拟合成一个多项式,或者直接做成查找表。代码实现大概是这样:
// OCV查找表,SOC步长10%
const float ocv_table[11] = {3.00, 3.45, 3.55, 3.62, 3.68, 3.72, 3.76, 3.80, 3.85, 3.95, 4.20};
// 线性插值函数
float ocv_to_soc(float ocv) {
if (ocv <= ocv_table[0]) return 0.0f;
if (ocv >= ocv_table[10]) return 100.0f;
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 (i + ratio) * 10.0f;
}
}
return -1.0f; // 异常值
}
我的经验:磷酸铁锂电池的OCV曲线在20%-80%区间非常平坦,电压变化只有几十毫伏。这时候用OCV法误差极大。我建议对磷酸铁锂,要么配合安时积分,要么用更复杂的模型。三元锂的曲线相对陡峭,OCV法效果就好很多。
4.2 OCV法的优缺点
任何方法都有两面性。OCV法也不例外。咱们客观分析一下。
优点:
- 原理简单,实现容易:查个表,做个插值,代码量很小。适合资源受限的MCU。
- 初始SOC准确:只要电池静置足够久,查出来的SOC就是真实值。这是安时积分法做不到的。
- 无累积误差:不像安时积分,时间长了误差会越滚越大。OCV法每次都是独立测量。
缺点:
- 需要长时间静置:这是最大的硬伤。电池刚充放电完,极化效应还在,测出来的电压不是真正的OCV。你想想看,如果车刚停下,你立刻测电压查SOC,那结果肯定偏大或偏小。
- 受温度影响大:同一块电池,25℃和-10℃下的OCV曲线完全不同。需要做温度补偿。
- 对电池老化敏感:电池用久了,内阻增大,容量衰减,OCV曲线也会漂移。我曾经遇到过一批老化电池,用新电池的曲线去查,SOC偏差超过8%。
- 不适用于动态工况:车在跑、机器在工作,电压一直在波动,OCV法根本没法用。
避坑指南:我曾经在项目里直接用OCV法做动态SOC估算,结果数据完全没法看。后来才明白,动态工况下测到的电压是端电压,不是开路电压。端电压里包含了欧姆压降和极化压降。千万别搞混了。
4.3 OCV法在静置工况下的应用
既然OCV法有这么多限制,那它到底用在哪?答案是:静置工况。说白了,就是电池不充不放、安安静静躺在那的时候。
实际工程中,OCV法最常见的应用场景有两个:
- 上电初始SOC校准:系统刚上电时,安时积分没有历史数据,这时候用OCV法查一下初始SOC,作为后续估算的起点。
- 长时间静置后的SOC修正:车辆或设备长时间停放后,用OCV法修正安时积分累积的误差。
这里有个关键判断:怎么才算「静置足够」?
我个人的判断标准是:
- 电池电流小于0.01C(比如100Ah的电芯,电流小于1mA)
- 持续时间超过2小时(三元锂)或4小时(磷酸铁锂)
- 电压变化率小于1mV/10分钟
满足这三个条件,我才认为电池进入了真正的静置状态。这时候测OCV,才有意义。
实际项目中的做法:我们会在BMS里设置一个「静置计时器」。当检测到电流小于阈值时,开始计时。计时达到设定值后,才允许使用OCV法更新SOC。同时,我们会记录静置结束时的电压和温度,查对应的OCV-SOC表。如果查出来的SOC与当前估算值偏差超过5%,就触发一次SOC修正。
嗯,这里要注意:修正的时候不能直接跳变,否则用户体验很差。我一般会用一阶低通滤波,让SOC平滑过渡到目标值。比如:
// SOC平滑修正
#define FILTER_COEFF 0.1f // 滤波系数
float smooth_soc(float current_soc, float target_soc) {
return current_soc + FILTER_COEFF * (target_soc - current_soc);
}
这样修正过程大概持续几十秒,用户几乎感觉不到跳变。
最后,我用一张流程图总结一下OCV法在静置工况下的应用逻辑:
这张图把整个逻辑串起来了。核心就是:先判断是否真正静置,再决定是否用OCV法。别一看到电压稳定就急着查表,那会出问题的。
好了,关于OCV法就聊这么多。它虽然简单,但用好了能解决大问题。尤其是作为安时积分的「校准器」,OCV法几乎是所有BMS的标配。下一节咱们聊聊安时积分法,看看它和OCV法怎么配合使用。