做过微电网逆变器并联的仿真朋友应该都有同感:单机带载、恒压恒频控制做得好好的,一接到双机并联,环流就冒出来了。轻则三相电流不平衡、功率分配不均,重则直接触发过流保护甚至仿真发散。我最初摸索这个方向时也是反复改参数,后来把“自适应虚拟阻抗下垂控制”这套方案在MATLAB/Simulink里完整搭起来,才真正把并联均流问题想透。这篇内容就以“双机并联自适应虚拟阻抗下垂控制MATLAB仿真模型”为主线,把电压电流双环控制、锁相环(PLL)技术、虚拟阻抗自适应策略这三块东西怎么协同,参数怎么定、模型怎么搭、调试怎么调,完整梳理一遍。
这篇内容的适用对象比较明确:正在做微电网/逆变器并联控制仿真研究的硕博生,刚接触下垂控制但需要快速搭建可复现模型的工程师,以及想把“虚拟阻抗为什么有用但为什么又不能固定”这件事彻底搞清楚的仿真爱好者。全文不绕理论、不堆公式,重点放在工程实现和仿真实操上。
1. 为什么双机并联必须引入自适应虚拟阻抗:从均流失败说起
1.1 下垂控制在理想情况下的均流逻辑
先简单回顾一下下垂控制为什么会成为孤岛微电网并联控制的主流方案。它的思想很直白:模仿同步发电机的频率-有功和电压-无功外部特性,让每台逆变器通过检测自身输出功率来调整输出电压的频率和幅值,从而实现无通信线情况下的功率自动分配。
经典表达式就两行:
f_i = f* - m_i * P_i U_i = U* - n_i * Q_im_i 和 n_i 是有功-频率、无功-电压下垂系数,P_i 和 Q_i 是第 i 台逆变器输出的有功、无功功率。只要两台逆变器的下垂系数按照额定容量成反比设计,理论上负载功率就能按比例分配。
这个逻辑在“理想条件”下是成立的,也就是两台机器参数完全一致、输出阻抗和线路阻抗也完全一致。此时不管是满载还是半载,P1:P2、Q1:Q2都能稳定在容量比上。仿真正是在这个理想前提下起步。
1.2 线路阻抗不一致导致环流失控
但实际工程里没有“理想条件”。两台逆变器到公共母线的线缆长度不一样、线径不一样,导致线路阻抗天然存在差异。这个差异一旦存在,上面的理想均流就立刻失效,而且无功均流对阻抗差异尤其敏感。
原因可以从等效电路的角度理解:每台逆变器可以看作一个带内阻(输出阻抗+线路阻抗)的电压源,负载是公共点,两个电压源并联后,端电压必然被钳制在同一个点上。如果两机内阻不相等,那么即使下垂控制给出的电压指令一致,实际流过各机的电流也不会按比例分配,差值就是环流。
我仿真时候设置了一个最普通的不对称工况:1号机线路阻抗取0.5Ω,2号机取0.8Ω,额定容量相同。结果Q1基本在3.8kVar附近,Q2只有2.1kVar,环流峰值接近额定电流的15%。更麻烦的是,环流并不流向负载,而是在两台逆变器之间来回流动,白白增加铜损和器件应力。此时如果想让Q1、Q2重新接近,单一靠增加下垂系数 n 会导致母线电压偏差更大,治标不治本。
1.3 固定虚拟阻抗的局限性与自适应动机
虚拟阻抗的思路就是在控制环路中人为“插入”一个阻抗,改变逆变器的等效输出阻抗特性。比如低压微电网线路阻抗偏阻性,有功和无功存在强耦合,传统下垂控制效果差,于是通过虚拟感抗让等效输出阻抗呈感性,实现有功/无功解耦。同时,只要把两台机的虚拟阻抗设计得接近,就可以掩盖线路阻抗的差异,达到均流目的。
问题是:固定虚拟阻抗取值非常尴尬。
取小了,线路阻抗差异仍然占主导,均流改善有限;取大了,等效压降明显,负载侧电压跌落过多。仿真中我试过把虚拟感抗加到2.5mH,均流效果很好,但满载时电压从311V跌到297V左右,这已经超出很多负荷允许范围。
更重要的一点:负载功率不是一成不变的。轻载时线路压降小,虚拟阻抗压降也小,固定参数问题不大;重载时虚拟阻抗压降成比例增大,电压跌落持续累积。如果为了重载均流选择一个较大的固定值,轻载时又白白损失电压指标。这就是自适应虚拟阻抗登场的原因——根据实时运行状态动态调节虚拟阻抗,让它在“均流效果”和“电压质量”之间找到一个动态平衡点。
2. 自适应虚拟阻抗的设计:参数估算、调节策略与MATLAB实现
2.1 虚拟阻抗取值的数量级估算
虚拟阻抗不是拍脑袋设一个电感量就完事。第一步要先估算合理的取值范围,核心约束是虚拟压降不能超过额定相电压的2%~5%。
以一套10kVA、线电压380V/50Hz的单机系统为例,相电压幅值约311V,额定输出电流幅值约21.2A。如果允许虚拟压降占3%,也就是9V左右,对应的虚拟阻抗模值大约是:
|Z_v| ≈ 9V / 21.2A ≈ 0.42Ω如果采用阻感虚拟阻抗,取 R_v=0.1Ω,L_v=1.2mH,感抗约为 2π×50×0.0012≈0.377Ω,复合阻抗模值约0.39Ω,正好在合理区间。这是初始值,后面的自适应调节在这附近波动,但不管怎么调都不能偏离这个量级太多,否则电压跌落必超限。
值得注意的是,虚拟电抗在dq旋转坐标系下的压降表达式会带有交叉耦合项,形式如下:
V_vd = R_v * i_od - ω * L_v * i_oq V_vq = R_v * i_oq + ω * L_v * i_od其中 i_od、i_oq 是输出电流的dq分量。在Simulink里面实现虚拟阻抗时,直接对瞬时电流做微分 d i_o/dt 会放大噪声,而且容易产生代数环。更稳妥的做法就是在dq坐标下用上面这种耦合表达,既绕开了纯微分,物理意义也更清晰。
2.2 自适应策略:按无功偏差动态调整虚拟感抗
自适应虚拟阻抗的调节目标可以有很多种:抑制环流、改善均流、提高阻尼。我在这个双机模型里采用的最核心策略,是基于无功功率偏差调整虚拟感抗。
为什么用无功而不用有功?因为在这个阻感虚拟阻抗方案下,无功分配偏差主要反映在电压幅值差异上,虚拟感抗对无功-电压特性的整形作用最直接。有功分配主要由频率-下垂保证,只要频率一致基本不会太差。
自适应公式就设计成一个带限幅的PI调节器:
L_v,i = L_v0 + k_p * (Q_i - Q_avg) + k_i * ∫(Q_i - Q_avg) dt其中 Q_avg 是两机无功的平均值,L_v0 是初始虚拟感抗,k_p、k_i 是自适应PI参数。逻辑上也很直观:某台机器输出无功偏大,说明它当前等效输出阻抗偏小,分担了更多无功,此时就增大它的虚拟感抗,把它分担的无功“顶回去”;反之则减小,让两端慢慢趋近。
这里有一个非常关键的细节:自适应PI的积分项必须加限幅,而且要配合虚拟感抗整体的上下限一起做。我在第一版模型里没有加积分限幅,启动瞬间两机功率偏差较大,积分项一路冲上去,L_v 直接顶到上限,然后无功分配发生了大幅度振荡,频率大约几赫兹,很难看。加上限幅、把PI带宽压低后,整个调节过程变得平缓,大概在0.3~0.5秒内完成稳态收敛。
2.3 自适应环节的MATLAB实现方式
在Simulink里实现这个自适应环节,我建议用MATLAB Function块或者直接搭离散PI控制器,不建议用连续积分器。因为整个控制系统里PWM、采样都是离散的,连续积分器在变步长仿真中容易出现步长不稳定。
核心代码如下,便于直接参考:
function Lv = adaptive_virtual_impedance(Q, Q_avg, params, Ts) % params: Lv0, kp, ki, Lv_min, Lv_max, int_sat persistent integrator if isempty(integrator) integrator = 0; end err = Q - Q_avg; % 积分限幅 int_sat = params.int_sat; if integrator > int_sat integrator = int_sat; elseif integrator < -int_sat integrator = -int_sat; end integrator = integrator + err * Ts; % 计算虚拟感抗并限幅 Lv = params.Lv0 + params.kp * err + params.ki * integrator; if Lv > params.Lv_max Lv = params.Lv_max; elseif Lv < params.Lv_min Lv = params.Lv_min; end end需要注意,进入自适应环节的Q一定要经过低通滤波。瞬时无功功率在50Hz下本身就是波动的,如果直接拿瞬时值做PI调节,高频纹波会被放大。我是在功率计算后再串一个20Hz左右的一阶低通,反馈量平滑很多,自适应过程也不会抖。
还要提前说明一点:自适应虚拟阻抗本质上是改变等效输出阻抗,属于慢速调节环,它的带宽必须远低于电压电流双环和下垂控制环,否则多个慢环之间会发生交互振荡。一般自适应积分时间常数取0.1~0.2秒量级比较合适。
3. 电压电流双环和锁相环:整个控制链路怎么串起来
3.1 电压外环与电流内环的带宽设计原则
自适应虚拟阻抗最终是要嵌入到逆变器控制链路中的,而这条链路的主干就是经典的电压电流双环。
双环设计的第一原则是:电流内环要快,电压外环要慢。内环负责快速跟踪电流指令并限制电流冲击,外环负责维持输出电压波形和幅值稳定。如果两者带宽设计反了,或者靠得太近,系统动态会变成一团乱麻。
在本文这套10kVA模型里,LC滤波器取 L=1.5mH、C=50μF,LC谐振频率大约是581Hz。设计时我把电流内环穿越频率放在1.5kHz左右,电压外环穿越频率放在300Hz左右,内外环拉开大约5倍带宽,不用看复杂理论也能稳定。
电流内环在dq坐标下要实现解耦控制,需要引入前馈解耦项。具体到电流环PI输出,要补偿掉滤波电感上的交叉耦合电压:
V_d_ref = (K_ip + K_ii/s) * (i_d_ref - i_d) - ω*L*i_q + V_od V_q_ref = (K_ip + K_ii/s) * (i_q_ref - i_q) + ω*L*i_d + V_oq这个式子里的 ω*L 交叉项很多人会漏掉。如果不做补偿,d轴和q轴电流控制会互相干扰,表现为动态时电流波形有明显振荡,甚至出现单相过流。
3.2 锁相环的作用:频率、相位与下垂控制的衔接
双机并联系统中,锁相环扮演的角色远比单机系统重要。两台逆变器需要知道彼此之间的相位偏移,才能实现预同步和稳定并联。而PLL的核心任务就是在任何时刻准确锁定公共母线电压的相位和频率。
我采用的是同步旋转坐标系下的SRF-PLL:三相电压经Clark变换到静止坐标系,再经Park变换到同步旋转坐标系,然后让q轴电压趋于零。q轴电压经过PI调节输出频率校正量,再积分得到相位角。
SRF-PLL的参数整定也有讲究。PLL带宽设置过高,电网谐波会渗透进相位输出,造成三相调制波畸变;设置过低,动态跟踪变慢,并联瞬间或者负载突变时容易失锁。在50Hz系统里,PLL带宽取20~50Hz是比较稳妥的区间。我仿真时带宽取30Hz左右,对应的PI参数大致是Kp_pll=0.12、Ki_pll=4.5,在负载突变工况下相位跟踪误差能控制在1度以内。
还要强调一个初始相位问题。两机并联启动前,如果各自下垂控制给出的相位角与公共母线相位不一致,合闸瞬间会产生很大的冲击电流。所以模型里需要设计预同步环节:在并机前用PLL检测母线相位,通过一个缓慢的相位调节环把自己的参考相位逐步拉近,等到相位差小于一个阈值再闭合并联开关。这个环节我在调试中发现非常必要,否则无论虚拟阻抗怎么设计,合闸瞬间都可能直接过流。
3.3 Simulink中的控制链路模块布置
从模型搭建的角度,控制信号流向大致是这样,也是我这份模型里各模块的先后关系:
- 测量模块:采逆变器侧三相电流 i_abc,滤波电容电压 u_cabc,输出电流 i_oabc。
- PLL模块:取电容电压或母线电压做Park变换,输出θ和角频率ω。
- 功率计算与下垂控制:在dq下计算有功P和无功Q,通过下垂公式生成电压幅值指令E和角频率指令ω_droop,再积分出相位θ_droop。
- 虚拟阻抗:通过输出电流dq分量计算出虚拟压降,从E的d、q参考值中减去,得到新的电压指令。
- 电压电流双环:电压外环接收电压指令和实际电容电压的误差,输出电流内环参考值;电流内环接收电流参考和实际电感电流误差,输出电压调制参考。
- PWM生成:对d、q轴调制电压做反Park变换,得到三相调制波,送入PWM模块生成开关信号。
这个链路中,最容易出问题的衔接点在第4步和第5步之间:虚拟阻抗的输出是修正后的电压参考,它会直接输入电压外环。如果虚拟阻抗计算回路出现了代数环,Simulink会报Warning,仿真速度明显变慢。我的解决办法是让控制整体离散化,把虚拟阻抗计算和双环控制都放在离散控制步长下,等于自然切断了代数环,仿真速度和稳定性都提升了一个量级。
4. 仿真模型参数与工况设计:给出一套可复现的配置
4.1 主电路与控制参数参考值
下面这套参数是从我反复调试后的模型里整理的,可以作为初版配置直接填入Simulink,然后在此基础上微调。
| 参数项 | 1号机 | 2号机 |
|---|---|---|
| 额定容量 | 10kVA | 10kVA |
| 直流母线电压 | 800V | 800V |
| 额定线电压 | 380V/50Hz | 380V/50Hz |
| LC滤波电感 | 1.5mH | 1.5mH |
| LC滤波电容 | 50μF | 50μF |
| 开关频率 | 10kHz | 10kHz |
| 线路阻抗 | 0.5Ω+0.8mH | 0.8Ω+1.2mH |
| 下垂系数m | 1e-4 | 1e-4 |
| 下垂系数n | 0.002 | 0.002 |
| 控制环节 | 参数值 |
|---|---|
| 电流内环 Kp/Ki | 0.6 / 20 |
| 电压外环 Kp/Ki | 0.2 / 50 |
| PLL Kp/Ki | 0.12 / 4.5 |
| 初始虚拟电阻 R_v | 0.1Ω |
| 初始虚拟感抗 L_v0 | 1.2mH |
| 自适应 Kp/Ki | 0.0002 / 0.02 |
| 虚拟感抗限幅 | 0.6mH ~ 3.0mH |
线路阻抗故意不对称设置,就是为了验证自适应虚拟阻抗能否弥补这个差异。如果两机线路阻抗一致,这套方案的优势反而显现不出来。
4.2 四种典型仿真工况
我建议按下述顺序依次仿真,每加一种工况都能看到不同环节的作用:
- 工况一:空载并联启动。两机都空载,先各自建立电压,再通过预同步控制让相位跟随母线,最后并机。这个工况主要验证PLL和预同步环节是否正确,如果没有冲击就是成功的一半。
- 工况二:并机稳定后突加20kW阻性负载。在0.5秒左右投入负载,观察动态响应和功率分配。这一工况对双环参数和下垂系数最敏感,能暴露出内环带宽不足和外环过冲的问题。
- 工况三:相同负载条件下,分别跑固定虚拟阻抗和自适应虚拟阻抗,记录稳态功率分配和电压跌落,这对后续波形对比是核心工况。
- 工况四:切除负载。从满载状态突然切到空载,重点观察电压是否会过冲、自适应虚拟阻抗是否能平滑收回到初始值。
四个工况跑下来,基本就能把从启动到动态到稳态的完整表现覆盖到。
4.3 求解器与仿真步长设置
这个模型我强烈建议主电路用连续模型、控制系统用离散模型,并采用变步长ode23tb求解器。
原因有两点:第一,主电路里的IGBT开关动作和LC谐振都是连续快速过程,固定大步长容易丢失细节;第二,控制环节在离散步长下更符合数字控制器的实际情况。仿真最大步长要设置得足够小,建议小于等于1e-4,否则PWM边沿不可见,波形会显得很“毛糙”。
控制采样时间统一设为Ts=1e-5,也就是10kHz的控制频率,与开关频率对齐。如果仿真跑得实在太慢,可以折中把开关频率降到5kHz,控制步长跟着改成2e-5,波形精度会略有下降,但整体规律仍然有效。
5. 波形解读与对比实验:自适应虚拟阻抗的效果怎么看
5.1 并机瞬间的冲击电流表现
先看工况一的波形。在预同步完成之前,1号机和2号机输出电压存在相位差,如果强行合闸,A相电流会出现一个接近80A的尖峰,约是额定电流的4倍,这个级别已经足够让保护误动作。
接入预同步后,相位差在0.2秒内被拉小到0.5度以内,合闸冲击电流降到10A以下,基本可以忽略。这里需要特别说明,预同步的质量直接决定后续所有波形是否有意义。如果连并机冲击都压不下去,所谓自适应虚拟阻抗效果也就无从谈起。
5.2 突加负载时的功率分配动态响应
工况二下,突加20kW阻性负载后,有功功率响应速度主要取决于下垂控制中的频率积分环节,无功功率响应则取决于电压环和虚拟阻抗环。在初始虚拟阻抗一致的前提下,两机有功基本能同步爬升,稳态后P1和P2的偏差可以控制在2%以内。
无功的情况比有功复杂。由于线路阻抗不对称,在固定虚拟阻抗模式下,Q1约为9.6kVar,Q2约为7.8kVar,偏差约1.8kVar,无功分配误差接近输出无功的10%。切换到自适应模式后,自适应PI检测到1号机无功偏高,逐步把L_v1从1.2mH上调到约1.9mH,L_v2略微下调至1.0mH,稳态时Q1和Q2收敛到8.5kVar和8.7kVar左右,误差从1.8kVar缩小到0.2kVar,均流效果提升非常明显。
动态时间方面,自适应调节毕竟是一个慢环,无功均流误差收敛到5%以内大概需要0.4秒左右。这个响应速度对于并离网切换、功率调度这类应用是完全可接受的。
5.3 固定与自适应虚拟阻抗对比:用数据说话
| 工况(满载) | 固定虚拟阻抗 | 自适应虚拟阻抗 |
|---|---|---|
| 稳态无功偏差 | 1.8kVar | 0.2kVar |
| 稳态有功偏差 | 0.3kW | 0.25kW |
| 满载相电压幅值 | 298V | 304V |
| 环流峰值 | 6.2A | 1.5A |
| 收敛时间 | 瞬时 | 约0.4s |
从这组数据能明显看出,自适应虚拟阻抗的本质是用一点调节时间来换取均流精度和电压质量的平衡。固定虚拟阻抗为了均流把电压压到了298V,而自适应模式通过“部分时间调节”的方式,在保证均流的条件下只让电压跌落到304V,这个电压指标差距在真实系统里对应的是负载能否正常运行。
另外还有一个容易忽略的好处:因为虚拟阻抗只在需要时才增大,两台逆变器的等效输出阻抗不会长期处于过大的状态,系统的整体动态阻尼特性更好。具体表现就是负载切换时电压和电流的振荡次数明显减少,这个在波形图上可以看到第二至第三个振荡周期就被有效抑制了。
6. 调试中容易踩的坑与处理经验
6.1 锁相环在负载突变时的失锁问题
我第一次在工况四里切除满载负载时,PLL输出频率短时间出现了一个约3Hz的过冲,相位角跳变超过10度,导致电压外环参考也跟着抖动,波形上出现了一个明显的电压坑。
原因排查下来是PLL的PI限幅和带宽没做好。PLL输出频率校正量理论上应该在±1Hz以内,但我当时没有对PI输出限幅,频率校正量在瞬态时冲到很大,相位积分自然就飞了。解决办法是在PLL输出端加 ±1.5Hz 的限幅,同时把PI参数从Kp=0.12、Ki=4.5下调一档,牺牲一点点动态响应换稳定。改完后负载切换时相位最大偏移控制在2度以内,波形恢复正常。
6.2 电压外环和电流内环相互牵制的问题
双环参数整定最常见的错误是一上来就同时调两组PI。内环和外环不是独立变量,外环的穿越频率一旦靠近内环,系统就会发生谐振,波形呈现一种“低频包络高频振荡”的奇怪形态。
我的经验是严格按照两步走:先只让电流内环闭环,给一个固定的电流指令并观察跟踪速度,调到阶跃响应不超调、稳态纹波小为止;然后再闭合电压外环,此时电流环对电压环来说几乎是一个理想电流源,电压环的调节会轻松很多。如果闭合外环后出现振荡,先不要动外环PI,回头把电流环带宽再拉高一档,通常问题就解决了。
6.3 虚拟阻抗增大导致的电压跌落不可忽视
自适应虚拟阻抗在均流的同时会带来电压跌落,这一点很多初学者容易忽略,等看到电压掉太多才开始怀疑参数。
在调试工况三时,自适应PI把L_v1调到了2.5mH以上,1号机输出电压相比空载跌落了接近10%,负载端的电压已经低于合理范围。后来我在设计里加了一条隐含约束:当输出电压幅值低于设定下限时,自适应调节暂停增幅,只维持当前值。同时把虚拟感抗上限从3mH收紧到2.8mH,并且在自适应公式中加入电压偏差的微弱比例反馈作为补偿,让虚拟阻抗“涨得慢一点”。这样既能均流,又不会把电压压得太低。
6.4 仿真发散:代数环和数值振荡的排查顺序
如果仿真一开始就跑发散,尤其是报“Algebraic Loop”相关的错误,第一嫌疑就是虚拟阻抗的电流反馈路径。
正常做法是把控制系统整体离散化,即把所有PI、坐标变换、虚拟阻抗计算都放到Ts的离散步长下运行。离散化之后,Simulink不会检测出代数环,因为每个计算周期内信号都有明确的前后依赖关系。如果某个环节必须保持连续,可以在虚拟阻抗反馈支路上串一个受控延迟或Memory模块,把代数环打破。
如果离散化之后依然数值振荡,问题多半出在求解器上。把ode23tb的最大步长限制在1e-5量级,或者干脆把整个模型配置成定步长离散仿真,用1e-5或2e-5的定步长跑。从稳定性角度看,定步长离散对于这种功率电子控制系统往往更友好,调试信息也更容易复现。
还有一个小排查技巧:把PWM开关频率从10kHz先降到2kHz跑一次,如果发散消失,那就是步长或高频开关和LC谐振之间的数值耦合问题;如果依然发散,那就回到线路拓扑和控制通路里找原因。这个方法能快速缩小排查范围。
这套双机并联自适应虚拟阻抗下垂控制模型,前前后后我改了大约三周时间,从最开始单机双环都调试不稳,到后来双机自适应性稳态误差压到很小,过程中最有价值的一点体会是:每动一个参数,必须能解释清楚它是通过什么路径影响哪条物理特性的,否则很容易在“调出新问题、再调回去”的循环里浪费时间。如果准备复现这套方案,我的建议是严格按单机验证、双机开环、双机下垂并联、最后开启自适应的顺序推进,每一步都保留截图和波形记录对照。希望这篇内容能帮你少走一些弯路。