4、SOC标定基础:SOC定义与难点、开路电压法(OCV-SOC曲线标定)、安时积分法标定与误差补偿
各位工程师朋友,咱们今天聊聊SOC标定。SOC,全称State of Charge,说白了就是电池还剩多少电。你想想看,手机显示电量从100%掉到1%,那个百分比就是SOC。但在BMS里,这事远没那么简单。
我入行那会儿,第一个被分配的任务就是做SOC标定。当时觉得,不就是算个电量吗?结果一上手才发现,这里面的坑比想象中多得多。今天我就把这些年积累的经验,尤其是SOC标定里最基础也最核心的三个部分,跟你好好捋一捋。
4.1 SOC的定义与标定难点
先说说定义。SOC的数学表达式很简单:
SOC = (剩余容量 / 额定容量) × 100%
但实际工程中,这个「剩余容量」怎么定义?是当前温度下能放出的电量,还是25℃标准温度下的电量?是1C倍率放电,还是0.05C小电流放电?不同的定义,标出来的SOC曲线能差出5%到10%。
我个人习惯,在项目初期就跟客户确认清楚:SOC到底对应哪个工况下的容量。否则后期扯皮,吃亏的是咱们标定工程师。
标定SOC的难点,我总结为三个「不确定」:
- 初始状态不确定:电池装车时,你不知道它出厂后放了多久,自放电了多少。
- 老化状态不确定:用了两年的电池,容量已经衰减了,但BMS不知道衰减了多少。
- 工况不确定:急加速、急减速、高温、低温,电流波动大,SOC估算很容易飘。
核心观点:SOC标定没有「万能公式」。你只能根据电池的特性和应用场景,选择最合适的估算方法,然后通过标定把误差压到最小。
4.2 开路电压法(OCV-SOC曲线标定)
开路电压法,原理很简单:电池静置足够久之后,端电压和SOC之间存在一一对应的关系。你测出电压,查表就知道SOC了。
但这里有个关键问题——OCV-SOC曲线怎么来?
我在项目中遇到过,有些供应商直接给一个理论曲线,说「这是电芯厂提供的」。结果上车一测,偏差3%以上。为什么?因为电芯厂的测试条件和你的BMS硬件不完全匹配。
我的建议是:自己动手标定OCV曲线。流程如下:
- 将电池充满至100% SOC,静置2小时以上。
- 以0.05C小电流放电,每放出5%容量,静置1小时,记录端电压。
- 重复步骤2,直到放电至0% SOC。
- 将数据点拟合,得到完整的OCV-SOC曲线。
这里有个小技巧:静置时间不能太短。我曾经为了赶进度,把静置时间从1小时压缩到20分钟,结果标出来的曲线在低SOC区域偏差特别大。后来发现,电池内部电化学平衡需要时间,尤其是磷酸铁锂电池,电压平台平缓,静置不够根本看不出真实电压。
标定技巧:对于三元锂电池,OCV曲线在20%-80%区间比较陡峭,查表精度高。但对于磷酸铁锂电池,中间段几乎是一条平线,开路电压法基本失效。这时候就要靠安时积分法来补了。
OCV-SOC曲线标定完成后,一般会存成一张二维查找表。代码实现大致如下:
// OCV-SOC查找表示例
const float OCV_Table[21] = {3.00, 3.10, 3.20, ..., 4.20}; // 对应0%,5%,10%,...,100% SOC
const float SOC_Step = 5.0; // 每步5%
float GetSOC_FromOCV(float OCV) {
// 线性插值查找
for (int i = 0; i < 20; 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) * SOC_Step;
}
}
// 边界处理
if (OCV <= OCV_Table[0]) return 0.0;
if (OCV >= OCV_Table[20]) return 100.0;
return -1; // 异常
}
嗯,这里要注意:实际工程中,OCV查表还要考虑温度补偿。同一个SOC,25℃和-10℃下的开路电压能差0.2V以上。所以一般会标定多组温度下的OCV曲线,比如-20℃、0℃、25℃、45℃各一组。
4.3 安时积分法标定与误差补偿
安时积分法,也叫库仑计数法。原理就是:SOC的变化量等于电流对时间的积分。公式很简单:
SOC(t) = SOC(0) + (1/额定容量) × ∫I(t)dt
但实际做起来,问题就来了。电流传感器有零漂,有增益误差,采样还有噪声。这些误差会随着时间累积,越积越大。
我记得有一次,客户反馈说车子跑了200公里,SOC从100%掉到了5%,但实际充电只充进去了80%的电量。一查原因,电流传感器的零漂偏了5mA,一天下来累积误差就超过了3%。
所以,安时积分法的标定,核心就是误差补偿。我一般从三个方面入手:
| 误差来源 | 典型值 | 补偿方法 |
|---|---|---|
| 电流传感器零漂 | ±5mA ~ ±20mA | 上电自检时采集零电流值,软件扣除 |
| 电流传感器增益误差 | ±0.5% ~ ±2% | 使用高精度电流源标定,修正增益系数 |
| 采样噪声 | ±10mA ~ ±50mA | 软件滤波,滑动平均或卡尔曼滤波 |
| 容量衰减 | 每年约2%~5% | 定期进行容量修正,或使用SOH估算结果 |
具体到标定流程,我建议这样做:
- 零漂标定:BMS上电后,在电池无电流流过时,采集100组电流值取平均,作为零漂补偿值。
- 增益标定:用精密电流源通入1A、10A、50A、100A等标准电流,记录传感器输出,拟合出增益修正系数。
- 积分周期选择:积分周期太短,计算量大;太长,误差累积快。我个人习惯用100ms作为积分周期。
- 容量修正:每次充满电时,记录实际充入的电量,与额定容量对比,更新容量修正因子。
避坑指南:我曾经在一个项目中,忽略了电流传感器的温度漂移。常温下标定得好好的,到了夏天车内温度60℃,零漂直接翻了三倍。从那以后,我每次标定都会做高低温循环测试,确保全温度范围内误差可控。
最后,说说安时积分法和开路电压法的配合。实际BMS中,很少只用一种方法。我的做法是:
- 车辆静置超过2小时,用开路电压法修正SOC初始值。
- 车辆运行时,用安时积分法跟踪SOC变化。
- 每次充满电时,强制将SOC修正为100%,同时更新容量参数。
这样既保证了动态响应,又避免了误差累积。说白了,就是让两种方法互相兜底。
好了,SOC标定的基础就聊到这儿。下一节咱们会深入讲讲SOC的在线校准和自适应算法,到时候再接着聊。