前段时间在调一个两组蓄电池并联供电的Simulink模型时,我差点被一个现象搞到失眠:下垂控制的下垂特性明明完全对称,两组电池的参数也设得一模一样,可是仿真跑久了,SOC(荷电状态)的差距就是拉不回同一水平。后来把问题拆开才发现,这正是“基于下垂控制的蓄电池SOC均衡策略”里最经典、也最容易踩进去的坑——下垂控制天然只能管功率分配比例,管不了电量命运。
这篇文章不打算给你贴一堆晦涩的数学推导。我想用自己调模型的过程,把这件事讲清楚:为什么两组蓄电池并着并着就会“贫富分化”?怎么改造下垂系数,才能让SOC自己往一处走?在MATLAB/Simulink里到底怎么搭、怎么调参数、怎么从波形里判断策略有没有生效?如果你正在做微电网储能仿真、直流微电网并联DC/DC控制或者电池储能系统PCS控制,这篇东西应该能帮你少走不少弯路。
1. 为什么并联蓄电池组的SOC会越跑越偏
1.1 下垂控制的初衷:把“接力赛”变成“拔河”
下垂控制最早是从同步发电机的调速特性里搬过来的思想。发电机并联运行时,大家不能各喊各的频率,必须有一条共同的“公共母线”。在这条母线上,所有电源的电压是同一个值,输出电流则根据各自的“下垂阻抗”自然分配。写成最简单的外特性就是:
- V_out = V_ref - R_d × I_out
其中V_out是变换器端口电压,V_ref是空载参考电压,R_d是下垂系数,I_out是输出电流。这个公式翻译成人话就是:谁出力出得多,谁的端口电压就往下掉得狠一些,于是公共母线会逼着它少出点力。
R_d越大,这台设备分摊到的电流越小;R_d越小,分摊到的电流越大。如果把两台蓄电池通过DC/DC变换器并联到同一根直流母线上,下垂控制就能让它们按R_d的反比来分电流,不需要互相通信,也不会出现环流打架的问题。这正是它在工程中一直被青睐的原因——本质上是把并联电源之间的竞争关系,变成了一场有纪律的拔河。
1.2 失衡的三个来源:初始差、线路差、特性差
但是这里有三个问题,下垂控制本身管不了。
第一,初始SOC不同。电池在安装、维修、部分更换之后,各组的剩余电量几乎不可能一样,有的90%,有的80%,一上来就差10个百分点。
第二,线路阻抗和变换器效率不同。母线到两组电池的电缆长度不同,接触电阻不同,DC/DC变换器的开关管导通压降也不同,这些都会让“真实下垂系数”出现细微差异,哪怕你在模型里把R_d设成同一个值。
第三,电池自身特性不一致。新旧电池的内阻不一样,容量衰减程度不一样,极化特性也不一样。两个“名义上同容量”的电池,在实际放电过程中,端电压随SOC下降的速率完全不同。
这些问题叠加之后,你会看到这样一个结果:SOC高的电池,出力的意愿和别人一样大;SOC低的电池,也不会因为自己“电量见底”而少出力。于是高SOC的被慢慢耗,低SOC的也在被慢慢耗,两者的差值就一直原封不动地保留着。更麻烦的是,如果R_d因为线路阻抗不一致而略有差别,差值甚至会越拉越大。
1.3 传统下垂控制对SOC失衡“无能为力”的根本原因
原因其实很直白:传统下垂控制的外特性里没有任何一个环节读取了SOC。它只关注V_out和I_out这两个电气量,而SOC是积分量、慢变量,根本进不了它的反馈环。就像一个出租车调度中心,永远只看每辆车当前位置和车速,却完全不知道每辆车还剩多少油——那当然会有车子半路抛锚。
所以“基于下垂控制的SOC均衡策略”,本质上做的事情只有一件:把SOC加进下垂系数的计算公式,让下垂系数不再是定值,而是SOC的函数。用工程点的说法,就是给传统的静态下垂,加一条“电量感知”的动态外特性。
2. 让下垂系数跟着SOC走:均衡策略的核心设计思路
2.1 从固定下垂到自适应下垂,关键就在一个函数
现在我们把下垂系数的定义改一下:
- V_out = V_ref - R_d(SOC) × I_out
原来那个固定的R_d,现在变成了一个随SOC变化的量。那么问题来了:这个函数应该长什么样?
思路并不复杂。放电模式下,我们希望SOC高的电池多出力,SOC低的电池少出力。根据下垂特性的公式,想要“多出力”,就要让R_d变小;想要“少出力”,就要让R_d变大。所以放电时R_d应该和SOC负相关:SOC越高,R_d越小;SOC越低,R_d越大。反过来,充电模式下逻辑刚好掉转:SOC低的应该多充电,所以它的R_d要小;SOC高的应该少充电,所以它的R_d要大,此时R_d和SOC正相关。
为了在模型里好实现,最经典的做法是把它写成幂函数形式:
- 放电模式:R_d = R_0 / (SOC^n)
- 充电模式:R_d = R_0 × SOC^n
这里n是一个大于1的指数,用来控制均衡强度。n越大,SOC对下垂系数的影响越剧烈,均衡速度越快,但母线电压的跌落/抬升也会更明显。R_0是基准下垂系数,相当于SOC = 1时的下垂值,决定了系统在接近满电时的基本均流能力。
2.2 线性、指数与分段策略的横向对比
有人说,那我直接用线性函数R_d = R_min + (R_max - R_min)×(1 - SOC)不也一样?确实能用,效果也不会太差,但三种常见策略各有脾气。
| 策略类型 | 典型表达式 | 收敛速度 | 母线电压偏差 | 实现难度 |
|---|---|---|---|---|
| 线性映射 | R_d = R_min + (R_max - R_min)×(1 - SOC) | 中 | 中等 | 低,一个Gain块加减法器就能完成 |
| 指数映射 | R_d = R_0 × e^(-k×SOC) | 快 | 较大 | 低,Simulink自带exp模块 |
| 幂函数映射 | R_d = R_0 / (SOC^n) | 很快 | 较大 | 低,但SOC接近0时容易爆炸 |
| 分段映射 | 不同SOC区间用不同参数 | 可调 | 可控 | 中,需要逻辑判断 |
我在实测里的感受是:线性策略最温柔,波形好预测,SOC接近一致后不会出现大幅度的参数抖动;指数策略和幂函数策略收敛快,但SOC很低的时候R_d会被推得特别大,导致这个端口的电压被压得很低,严重时甚至会触发电网侧的低压保护。
所以我的建议是:第一版模型用线性,先跑通逻辑,再换幂函数/指数策略做优化。不要一上来就上猛药。
2.3 边界保护:SOC限幅、下垂系数上下限、参考电压微调
SOC本身有几个天然的边界问题。首先是SOC不能到0或者1,不然幂函数那一路在SOC=0时直接除以0,模型报错。工程上一般在SOC进入0.1~0.9这个区间之外时,把SOC值钳位住再参与计算。其次,R_d不能无限大,否则对应电池会直接退出出力,母线电压被另外一组硬生生拉满,对系统稳定性很不利。所以需要给R_d设下限和上限:
- R_d_min:保证重载时输出能力足够,母线电压不会塌得太狠
- R_d_max:保证轻载时不会出现某台变换器几乎不出力的极端情况
另外还有一个可选的微调项,就是让V_ref也随SOC做小幅度修正。比如SOC偏低时,把V_ref略微调低一点,进一步压低它的出力;SOC偏高时,把V_ref略微抬高一点,让它多扛一些负载。不过这个操作要非常克制,因为V_ref一旦改动,公共母线电压的整体水平也会跟着动,调得不好反而会引起其他负载的电压问题。
3. Simulink模型搭建:从器件选型到控制环落地
3.1 蓄电池模型:用自带模型还是自己搭
MATLAB/Simulink里做这类仿真,我推荐直接使用Simscape Electrical里的Battery (Table-Based)模型,而不是自己用受控电压源搭一个戴维南等效。原因很现实:Table-Based模型内置了SOC计算、温度影响、内阻随SOC变化的映射关系,你只需要填一张表,它就能输出电流积分后的SOC。自己搭的话,SOC计算、安时积分、开路电压查表全都要手动做,稍微疏忽一个初值问题,结果就完全没法看。
参数设置上,如果你要仿真两组100Ah的电池,标称电压可以考虑按360V设置(大约100节3.6V电芯串联),初始SOC分别设成0.9和0.8。内阻参数可以用系统默认的,也可以在“Battery internal resistance”表格里改成随SOC变化的多维表。这里额外提醒一句:如果两组电池的容量不一样,比如一组是100Ah、另一组是120Ah,那你必须按容量归一化来看SOC,而不是直接对比SOC的绝对值,后面我会专门说这个坑。
3.2 双向DC/DC与PCS环节的搭建方式
储能单元并联到直流母线,通常经过一级双向DC/DC(Buck-Boost)变换器。仿真模型里可以用Simscape的MOSFET/IGBT开关模型,也可以用简化模型——直接用受控电压源加内阻来等效变换器的外特性。我个人的建议是:第一版用简化模型,把精力放在控制逻辑上;等均衡策略跑通了,再换开关模型看纹波和谐波。
控制架构走经典双环:
- 外环:电压环,参考值来自下垂特性计算出的V_ref - R_d×I_out,输出电流指令
- 内环:电流环,PI调节器,输出PWM占空比
请注意,均衡策略在这里并不需要推翻双环架构,它改的只是外环参考电压的生成方式。也就是说,把原本常数形式的V_ref改成一个“V_ref - R_d(SOC)×I_out”的实时运算模块。这让改造工作量大大降低,也是这个策略在工程上能被广泛接受的重要原因——不需要重新设计控制器结构。
3.3 SOC计算与下垂系数生成:一份可以直接复制的MATLAB Function
在Simulink里放一个MATLAB Function模块,输入是SOC和电流方向判断量,输出就是R_d。下面是放电/充电模式下幂函数策略的具体实现,我调通过,可以直接抄:
function Rd = droop_calc(SOC, I_out, R0, Rd_min, Rd_max, n) % 基于SOC的自适应下垂系数计算 % SOC: 电池荷电状态,范围0~1 % I_out: 变换器输出电流,正值为放电,负值为充电 % R0: 基准下垂系数,建议0.02~0.05 % Rd_min, Rd_max: 下垂系数限幅 % n: 均衡强度指数,建议1~3 % SOC钳位,防止幂函数越界 SOC_c = min(max(SOC, 0.05), 0.95); if I_out >= 0 % 放电模式:SOC越高,下垂系数越小,出力越大 Rd_raw = R0 / (SOC_c^n); else % 充电模式:SOC越低,下垂系数越小,充电越猛 Rd_raw = R0 * (SOC_c^n); end % 限幅 Rd = min(max(Rd_raw, Rd_min), Rd_max); end这段代码逻辑很简单,但有两个细节值得说明。第一,放电模式与充电模式的切换判断用的是I_out的符号,而不是SOC的变化方向,因为Simulink仿真里电流方向更容易直接从母线接口拿到。第二,SOC钳位用的是0.05和0.95,不是0和1,这是故意留出的安全裕量,防止模型在极端SOC下把R_d推到限幅值之外。
说实话我自己第一版就是没做钳位,SOC跑到0.02附近时R_d直接冲到几十欧,母线电压当场被拉崩,波形直接飞了。加了钳位和限幅之后,模型随便跑都不会出数值爆炸的问题。
3.4 电压环参考值合并:别让代数环坑了你
把R_d算出来之后,再生成外环参考电压:
- V_ref_adaptive = V_ref - R_d × I_out
然后在Simulink里用加法器和乘法器搭出来。这里最容易出问题的是代数环——R_d依赖于I_out,I_out又依赖于V_ref_adaptive,而V_ref_adaptive又反过来包含I_out,如果直接连线,Simulink会在每个仿真步长里去迭代求解这个隐式方程,速度慢且容易不收敛。
我解决的办法是加一个Memory块或者选用离散求解器,把I_out反馈回路断开一个步长。具体操作:I_out先用Demux从总线里取出来,经过一个单位延迟(Unit Delay)后再返回去参与R_d和V_ref的计算。这样牺牲了一个步长的“实时性”,但对仿真的稳定性帮助极大,尤其是SOC变化本身很慢,一个步长的滞后完全不影响均衡效果。
4. 仿真结果解读:均衡速度与母线电压的取舍
4.1 一组可以直接上手的默认参数
如果你不想从头摸索参数,可以先照这张表把仿真搭起来。
| 参数 | 推荐值 | 说明 |
|---|---|---|
| 电池容量 | 100Ah(验证逻辑时可临时改为几个Ah) | 容量越小,SOC变化越快,仿真不用跑几小时 |
| 标称电压 | 360V | 100节3.6V电芯串联 |
| 初始SOC | A组0.9,B组0.8 | 故意制造10%的初始差异 |
| 直流母线参考电压 | 400V | 留出升压裕量 |
| 基准下垂系数R_0 | 0.03 | 按母线电压和最大电流的3%~5%压降折算 |
| 下半垂系数R_d_min | 0.005 | 防止重载时电压塌陷 |
| 上限下垂系数R_d_max | 0.5 | 防止轻载时退出出力 |
| 均衡强度指数n | 2 | 起步推荐值 |
| 负载 | 恒定10kW电阻 | 用电阻负载便于观察电压跌落 |
| 仿真时间 | 100秒(小容量模式下) | 真实容量下需跑几小时才能看到SOC明显变化 |
这里有个仿真技巧我要专门讲一下。真实100Ah电池,10kW负载下两个百分点SOC的变化可能要跑几十分钟,仿真时间拉太长不现实。所以我在做算法验证时,会把电池容量临时从100Ah改成3~5Ah,这样几十秒的仿真就能看到SOC曲线明显拉开、再收敛的完整过程。等算法逻辑验证无误后,再把容量改回真实值复跑一次确认动态特性。
4.2 波形怎么看:三种策略的SOC、输出电流与母线电压
仿真跑完,重点盯三个波形:两组电池的SOC曲线、输出电流曲线、直流母线电压曲线。
- 无均衡策略时(固定下垂):SOC两条曲线近似平行,10%的差距从头保持到尾。
- 线性自适应策略:放电初期,A组电流大于B组,B组SOC下降变缓;随着SOC差距缩小,电流差值逐渐减小,两条SOC曲线慢慢靠拢。
- 幂函数/指数策略:SOC曲线收敛更快,但B组电流会一度被压得很低,母线电压会出现一个几伏的短暂跌落,如果负载比较重,这个跌落会更明显。
母线电压波形的评估标准很简单:波动范围必须落在负载允许的范围内,一般直流母线控制在±5%以内,400V母线就意味着380V~420V。如果均衡策略导致的电压跌落超出这个范围,那说明R_d_max太大或n太大,需要往回调。
4.3 SOC迟迟不收敛:最常用的几个调试方向
模型搭完跑一跑,最常见的现象是“SOC在动,但就是不往一处去”。这时候按下面顺序排查,通常能快速定位。
- 下垂系数上下限设得不对。R_d_max太小,均衡力就弱;R_d_min太大,系统本身就分流不均。
- 负载太轻。两三百瓦的负载下,均衡电流只有零点几安培,SOC变化当然慢得像蜗牛。这时候可以临时加大负载或者减小仿真容量,先把收敛逻辑验证了再说。
- 电流环饱和。内环PI限幅设置不当,导致外环的电流指令根本没执行出来。看一下电流波形有没有“顶到天花板”就知道。
- SOC信号噪声过大。安时积分法在SOC反馈中加入测量噪声时,会传递到R_d的计算里,造成下垂系数抖动。解决办法是在SOC进入MATLAB Function之前加一个低通滤波,时间常数设成1~5秒即可。
- I_out方向判断错误。充电模式下如果符号没翻过来,策略会反着干活——高SOC电池拼命充电、低SOC电池拼命放电,两边的SOC会越来越分岔而不是收敛。检查电流符号定义与模型中电流传感器的参考方向是否一致。
这几条里,最后一条是我见过最多人踩的坑。Simscape里电流方向、DC/DC变换器的端口方向、电流传感器方向,三者一旦对不上,整整一个上午都可能耗在这上面。
5. 从仿真到工程落地的几个真实教训
5.1 容量不一致才是常态,SOC绝对值不能直接比
仿真模型里,两组电池的容量参数往往一模一样,但实际工程中,经过几百次充放电循环后,电池的容量衰减程度完全不同。可能有用的概念是按SOC归一化处理,本质上是把当前剩余电量除以当前实际容量,而不是除以出厂标称容量。否则,一组衰减严重的旧电池,虽然SOC算出来是90%,但实际剩余能量可能远低于另一组标称容量更大的电池。
所以工程上判断“均衡是否完成”,标准不能是“SOC完全相等”,而应该是“SOC之差收敛到一个允许范围”,比如5%以内。追求绝对相等,会让系统频繁地大幅调节各端口出力,反而加剧电池循环寿命损耗。
5.2 通信延时与SOC刷新率:仿真是理想值,工程要面对延时
Simulink仿真里,SOC是连续实时算出来的,但工程中BMS(电池管理系统)上报SOC往往有固定的刷新周期,1秒到10秒不等。这意味着你的均衡控制器看到的SOC永远是上一拍的旧值。这个延时本身不会让系统发散,但会让R_d的变化滞后,等效于给均衡回路增加了一个大惯性环节。
我当时在一个模拟项目里做过测试:SOC刷新率从1秒降到10秒,均衡收敛时间大约增加了20%~30%。应对办法有两种:一是适当增大n值,补偿滞后带来的“迟钝”;二是用零阶保持器把刷新延时也建模进仿真里,这样控制参数才是按真实系统调出来的,而不是按理想系统调出来的。
5.3 母线电压允许波动范围决定了均衡策略的上限
这是我最想强调的一点。很多人设计SOC均衡策略时,满脑子都是“怎么收敛更快”,结果把下垂系数上限拉得过高,母线电压波动超出了负载容许范围,整个系统被电压保护动作干停。母线电压约束,才是均衡策略真正的天花板。
比如400V直流母线允许±5%波动,那意味着最坏情况下,单组电池的下垂压降不能超过20V。折算到下垂系数上,就是R_d_max × I_max ≤ 20V。你手上的负载最大电流一旦确定,R_d_max的上限就被定死了,无论SOC偏差多大,都不能突破这个值。懂得这个逻辑之后,你再回头看那些文献里的自适应下垂策略,就不会再被花哨的公式绕晕,本质上都是在“电压约束”的笼子里跳舞。
最后说句实在话。如果让我重做一次类似的项目,我第一步就会把SOC观测误差和容量不一致直接放进模型里,而不是等到算法调通之后再补。因为真正限制均衡策略上限的,往往不是什么精妙的数学公式,而是母线电压约束和SOC测量精度这两个最枯燥也最真实的边界条件。先把它们框住,剩下的工作只是在这个笼子里把曲线调好看而已,连仿真都会跑得顺畅很多。