光伏VSG并网Simulink仿真:虚拟同步发电机控制与参数整定

发布时间:2026/9/9 16:51:12
光伏VSG并网Simulink仿真:虚拟同步发电机控制与参数整定 1. 光伏VSG为什么光伏逆变器要装成一台同步发电机这几年做光伏并网仿真的人应该都注意到一个趋势传统的PQ控制、下垂控制在并网友好性上越来越吃力而虚拟同步发电机VSG这个方向的热度一直在涨。尤其是光伏这种直流侧波动大、且缺乏旋转惯量的电源并网占比一高电网频率和电压稳定性就会受影响。VSG的思路说白了就是给逆变器装一个数字飞轮让它在电网眼里看起来就像一台真实的同步发电机——有惯量、有阻尼、能参与调频调压。我最初接触光伏VSG这个项目时也是从Simulink仿真入手的。整套系统做下来核心其实就三件事第一把光伏阵列和Boost电路做到能稳定输出直流电第二把VSG控制算法写进逆变器控制里让有功-频率、无功-电压两条外特性符合同步机的规律第三把并网那一套锁相、滤波、软启停处理好。这篇文章我会把整个搭建过程、参数选取思路、S-Function实现细节还有调试中踩过的坑一次性讲清楚。内容偏向实际动手适合正在做电力电子仿真、准备写论文或者做并网控制课题的同学参考。我个人认为VSG仿真真正难的不是Simulink操作本身而是控制逻辑和物理模型的对应关系——你写的每个公式、每个增益到底在模拟同步发电机的哪个部件这块想明白了仿真模型就是一通百通的事。所以下面我会先从控制原理拆起再进到Simulink的具体实现最后聊调试经验希望能帮你少走几步弯路。2. 光伏VSG系统整体设计思路与方案选型2.1 为什么选VSG而不是下垂控制很多初学者会问一个问题下垂控制Droop Control也能实现有功-频率、无功-电压的下垂特性和VSG的效果看起来差不多为什么非要上VSG这里有一个关键区别下垂控制的本质是静态特性它模拟的是同步发电机最终的下垂终点但完全没有模拟发电机的动态过程。真实同步发电机在负荷突变时由于转子的机械惯量存在频率变化是有一个过渡过程的——频率不会瞬间跌到新稳态点而是平滑过渡这给电网调频留出了反应时间。下垂控制做不到这个它响应太快本质上是没有惯量的控制。VSG在控制环里引入了同步发电机的转子运动方程用这个方程来虚拟出一台同步发电机。它的好处非常明显惯量可调虚拟转动惯量J可以按需设置调大一点频率变化更平滑调小一点响应更快。这个参数在真实发电机上改不了但虚拟机上就是写代码的事。阻尼可控阻尼系数Dp可以根据系统阻尼比来设计避免功率振荡。无缝切换VSG支持并网模式和孤岛模式的无缝切换这在微电网里很实用。从仿真角度看VSG的控制算法虽然比下垂控制复杂一些但复杂度增加得有限换来的是动态特性和物理意义都更接近真实系统。做研究、写论文VSG的说服力也更强。2.2 光伏直流侧和交流侧的分工逻辑光伏VSG系统可以看作两个相对独立的子系统直流侧负责把太阳能转成稳定的直流电交流侧负责把直流电转成满足并网要求的交流电。两侧由逆变器桥臂连接中间靠直流母线电容解耦。直流侧我采用光伏阵列 Boost升压电路 MPPT控制的结构。光伏阵列的输出电压范围是80~150V左右具体取决于光照和温度通过Boost升压到400V左右给逆变器提供一个合格的直流母线电压。MPPT用扰动观察法PO每0.01s更新一次占空比光照突变时能跟上变化。交流侧就是核心了——三相全桥逆变器 LC滤波 并网开关。逆变器的调制波由VSG算法输出包括电压幅值指令和相角指令通过SPWM或SVPWM生成驱动脉冲。LC滤波器的L和C要按开关频率和电流纹波要求设计后面我会给具体计算过程。这里有个重要的分工原则MPPT管直流侧的最大功率跟踪VSG管交流侧的并网功率平衡。两者不能互相干扰否则系统会振荡。直流母线电容就是两侧的缓冲池MPPT只负责把更多功率送到母线上VSG只负责按同步机特性把母线上的功率送出去。2.3 并网模式下VSG的功率平衡约束在并网模式下电网电压幅值和频率是基本固定的被大电网钳住此时VSG输出的有功功率和无功功率取决于VSG内电势与电网电压之间的功角差和幅值差。也就是说VSG发射的有功由功角决定无功由电压差决定。这一点极其重要因为它决定了VSG在并网模式下调节的本质VSG根据有功指令P_ref改变虚拟转子角度这个角度推着功率流向电网送根据无功指令Q_ref调整电压幅值指令E_ref再通过励磁环节维持机端电压。在实际实现时VSG功率环输出的就是两个物理量θ_0虚拟转子角度送到Park变换作为相位基准E_ref虚拟电动势幅值作为电压外环的给定这两个量进到电压电流双闭环后生成调制信号整个过程就把VSG的功率指令翻译成了逆变器能执行的电压指令。这块逻辑理顺了Simulink模型搭起来就快了。3. 核心控制环节拆解机械方程、电气方程与参数设计3.1 虚拟转子运动方程机械部分VSG最核心的就是下面这个二阶方程J * dω/dt Tm - Te - Dp*(ω - ωg)dθ/dt ω其中J虚拟转动惯量单位kg·m²但仿真里通常按实际物理量折算Tm机械转矩等于P_ref/ωn由有功指令换算Te电磁转矩等于Pe/ωnPe是逆变器当前输出有功Dp虚拟阻尼系数模仿发电机的阻尼绕组作用ωg电网同步角速度50Hz对应314.159rad/s这个方程的含义非常直观当有功指令P_ref大于当前输出功率Pe时Tm大于Te虚拟转子就会加速频率升高功角增大输出功率增大直到重新平衡。反过来也一样。整个过程中J决定了频率变化的惯性大小Dp决定了振荡衰减的快慢。在Simulink里实现时我不推荐用纯模块搭积分链因为中间需要频繁修改参数还容易把单位搞混。更推荐用S-Function把整个VSG算法包起来输入是P_ref、Q_ref、Vabc、Iabc输出是E_ref和θ_0。这样参数修改、逻辑修改都集中在一个文件里调试体验好很多。3.2 虚拟励磁调节器电气部分VSG的无功-电压控制模仿的是同步发电机励磁系统的自动电压调节器AVR控制方程是dE/dt (1/Kq) * [Q_ref - Qe Dq*(Vref - Vmeas)]其中Q_ref无功功率指令Qe当前输出无功功率Vref额定电压幅值参考比如311V相电压峰值Vmeas滤波后的机端电压幅值Kq无功积分系数决定无功调节速度Dq电压下垂系数模拟发电机的外特性这个方程表达的意思是如果当前无功输出小于指令或者机端电压低于参考值励磁就会增强E_ref上升让逆变器多输出无功来抬升电压反之则减磁。这里E_ref同时参与电压内环的给定所以VSG的电压控制是励磁控制 内环定电压两级协作的。3.3 虚拟惯量和阻尼系数的选取逻辑参数选取是VSG仿真里最容易懵的地方。J和Dp不能随便取否则要么频率波动太大要么功率振荡不收敛。我建议按以下思路来先确定阻尼系数DpDp的物理意义是频率变化1rad/s需要多少转矩补偿可以近似取为 P_ref/ωn 的1~2倍或者按系统允许的最大频率偏移来算。比如额定功率10kW额定角速度314rad/s允许频率偏移5%约0.5Hz那么Dp ≈ (10000/314) / (π) ≈ 10。这个值作为初始估算。再根据振荡衰减要求确定J对二阶系统阻尼比ξ和自然振荡角频率ωn之间的关系是 ξ Dp / (2√(J*ωn))。通常我们希望ξ在0.6~0.8之间欠阻尼但衰减快可以反推J。我一般先设一个初值J0.5跑仿真看功率波形振荡收敛慢就增大Dp振荡频率太低就减小J做一两次迭代就有感觉了。注意仿真步长J取小的话比如0.1以下VSG动态响应会变快要求仿真步长更小否则数值误差会放大。固定步长建议设成1e-5或更小。3.4 电压电流双闭环怎么和VSG衔接VSG输出的E_ref和θ_0并不是直接送到调制器去生成PWM的中间还要经过一个电压电流双闭环。这里很多教程没说透我多写两句。在Simulink里电压外环接收两个信号三相输出电压Vabc和VSG计算出的参考电压Vref_abc。Vref_abc由E_ref和θ_0合成Vref_a E_ref * sin(θ_0) Vref_b E_ref * sin(θ_0 - 2π/3) Vref_c E_ref * sin(θ_0 2π/3)然后把Vabc做Park变换转到dq坐标系和Vref的dq分量Vd_ref E_ref, Vq_ref 0做PI控制输出电流内环的指令Id_ref和Iq_ref。电流内环再对输出电流做PI控制输出调制波最后送PWM发生器。这个双闭环的作用是外环确保输出电压能够跟踪VSG给的电压指令内环提高动态响应并限制过流。因为VSG输出的E_ref是缓慢变化的直流信号所以电压环PI的带宽不需要太高一般取几百Hz就行电流环带宽要高一些取几千Hz确保纹波电流能被抑制。4. Simulink仿真模型搭建全过程实录4.1 光伏阵列与Boost电路模块配置光伏阵列我直接用Simulink左侧库里的PV Array模块。双击进去可以设置串联电池数、并联电池数、Vmp、Imp等参数。我通常设置10个组件每串10块电池Imp约5AVmp约35V整体输出约250V。光照从1000W/m²起始第1.0秒突降到800第2.0秒再恢复到1000用来验证MPPT跟踪和VSG在直流侧扰动下的响应。Boost电路比较简单就是一个开关管用MOSFET 一个二极管 一个电感 输出电容。电感值按电流纹波要求算经验公式 L UinDTs/ΔI_L其中ΔI_L取平均电流的20%左右。输入250V输出400V占空比D约0.375开关频率20kHzTs5e-5平均电流约10A算下来L在4.7mH左右。电容按电压纹波要求取2200μF。MPPT我用PO法封装为一个MATLAB Function模块输入是光伏电压Vpv和电流Ipv输出是Boost占空比D更新周期0.01s。PO的实现要点是判断dP/dV的正负来决定占空比调整方向步进取0.005太小跟踪慢太大会在最大功率点附近振荡。4.2 VSG控制的S-Function编写与嵌入VSG算法我写成C MEX S-Function也可以写Level-2 MATLAB S-Function。考虑到仿真速度和后期部署生成C代码C MEX更优但调试起来MATLAB版更方便。这里我给一个简化版的Level-2 MATLAB S-Function骨架你可以在里面补全控制逻辑function vsg_sfun(block) setup(block); end function setup(block) block.NumInputPorts 5; % P_ref, Q_ref, Vabc(3), Iabc(3), Vdc block.NumOutputPorts 2; % E_ref, theta ... block.SetPreCompOutPortInfoToDynamic; ... end输入信号我建议至少包含有功指令P_ref、无功指令Q_ref、三相电压Vabc、三相电流Iabc、直流母线电压Vdc。输出就是E_ref和theta_0两个标量。在mdlOutputs里做以下流程由Vabc和Iabc计算瞬时功率P和Q用P_ref、P以及上一时刻的ω累加角度用Q_ref、Q和电压偏差更新E_ref输出theta和E_ref。写S-Function时最容易踩的坑是初始状态设置。ω的初值必须设为314.159rad/s50Hz对应θ初值设为0E_ref初值设为311否则模型一开始就会因为相角跳变而出大电流。4.3 逆变器主电路与滤波、并网开关的处理逆变器主电路用Universal Bridge模块选择3-arm bridge、MOSFET/Diode类型开关频率设20kHz。这里注意一个细节Universal Bridge的默认开关阻抗和缓冲电路会影响仿真精度建议把Ron设小一点0.001Ω缓冲电阻设大一些1e6Ω避免造成可观的电压跌落。LC滤波参数计算路径我走的是开关纹波衰减到20%以下取L2mHC20μF算下来谐振频率f_res 1/(2π√(LC)) ≈ 796Hz远小于开关频率20kHz又高于基波50Hz满足冲突要求。电感寄生电阻设0.1Ω电容ESR设0.01Ω接近真实器件。并网开关我用Three-Phase Breaker实现第0.6秒闭合让逆变器开始并网。前面0.0~0.6秒其实是预同步过程——VSG先把电压幅值E_ref调到接近电网锁相环跟踪电网相角等θ和电网相角差值小于一个很小值比如0.01rad时再合闸。这是比直接合闸稳妥得多的操作否则并网瞬间会有大电流冲击。4.4 仿真参数与步长设置建议仿真参数设置直接影响VSG动态特性的呈现效果我建议这样配置仿真时长3~5秒给光照突变留出观察窗口求解器固定步长 ode3Bogacki-Shampine步长设1e-5控制周期PWM和采样1/20000s电气采样周期自动继承为什么用固定步长而不是默认的可变步长因为PWM调制器输出的是高频开关信号如果步长不固定脉冲宽度会抖动功率波形上会出现毛刺影响VSG的动态分析。固定步长虽然会牺牲一点仿真速度但波形干净、可复现性好这是我实测下来最省心的方案。5. 调试中的常见问题与排查技巧实录5.1 S-Function编译和初始化报错S-Function最常见的报错是Error in S-function xxx during initialization或者Index expression out of bounds。前者多半是输入输出端口数设置和实际接线不匹配检查NumInputPorts、NumOutputPorts和 mdlOutputs 里实际用到的端口数后者通常是数组越界比如Vabc是3×1向量你却用了Vabc(4)。还有个隐蔽的问题如果S-Function里用了全局变量或者持久变量但Simulink在不清理状态下重复运行仿真旧状态的残留值会把波形搞乱。我的做法是在mdlStart里把所有状态清零包括ω、θ、E_ref、积分器状态保证每次按F5都是一次干净的启动。5.2 并网瞬间电流冲击过大这个问题几乎每个人都会遇到一次。如果并网合闸瞬间电流突然冲到好几倍额定值大概率是预同步没做好VSG输出的电压幅值、频率和相位与电网不一致。排查方法分三步先把E_ref和电网相电压峰值比一下差值必须小于3V对311V系统再看VSG的θ是否已经跟踪上电网相位你可以在仿真里加一个Scope同时观察θ和电网A相相位理想情况是两条线重合或非常接近确认合闸时刻不是任意时间点最好在电网A相电压过零点附近合闸这样冲击最小。如果以上都做到还有冲击那要检查滤波电感是否有寄生电阻没有寄生电阻的纯电感并网瞬间电流变化率会非常大建议加0.1Ω左右的阻尼电阻。5.3 VSG输出功率振荡不收敛这种情况通常表现为有功功率波形在给定值附近高频振荡或者衰减特别慢。我观察下来有三个主要原因虚拟惯量J太大J大则惯性大频率变化慢但容易造成低频振荡减小J到0.2~0.5试试。阻尼系数Dp太小Dp不足时系统欠阻尼功率振荡衰减很慢逐步增大Dp观察波形直到临界阻尼以上。LC滤波谐振未被阻尼如果L和C的谐振频率和VSG闭环带宽重叠功率波形会叠加高频纹波。解决方法是提高L或者降低C把谐振频率和VSG截止频率拉开。还有一个容易被忽略的因素是电流内环带宽不够。如果电流环PI参数太慢VSG对外表现就是官子软功率跟踪慢看起来像振荡。把电流环Kp稍微调大、Ki适中往往能立竿见影。5.4 光照突变下直流母线电压崩溃光照从1000突降到800时如果直流母线电压下降严重甚至跌到低于交流侧峰值电压逆变器就会失控。这通常是MPPT响应太慢或者直流电容容量不足。MPPT的PO步长如果太小小于0.001在光照突变时跟踪速度跟不上导致输入功率和输出功率失衡母线电压跌落。可以加大步长到0.005~0.01或者改用扰动步长自适应策略。电容方面如果母线电压纹波大把2200μF加到3300μF效果立竿见影。5.5 使用MATLAB Function时报Variable size错误如果你用MATLAB Function或S-Function里生成了变长数组Simulink会报Variable-size data is not supported。我在写VSG控制时遇到过原因是把瞬时功率计算里的角度值存进了没有预分配大小的向量。解决方法是把数组长度固定或者用一个固定大小的循环结构避免动态变量维数。更稳妥的方案是用Level-2 S-Function因为它对C语言语法支持更完整数组操作更可控。如果你只是做仿真验证MATLAB Function就够用如果后续要生成代码、做硬件在环那尽早切到S-Function或Simulink Coder的道路上。6. 我踩过的一些坑和最终建议做光伏VSG仿真真正花时间的其实不是搭模型本身而是把控制参数调到看起来像一台真发电机的那个过程。我刚开始做的时候J和Dp完全照抄某篇论文结果放自己系统里波形振荡得没法看。后来才明白参数是跟着系统容量、电压等级、滤波参数走的换成自己的模型必须重新整定。另外一个体会是VSG并网模式下不要死盯着功率波形看要把虚拟转子角频率ω波形和功角δ波形一起拉出来看。很多问题在功率波形上表现不好判断但在ω和δ上非常清晰——比如阻尼不足时ω振荡惯量过大时δ迟迟不回稳。把这些内部状态量加Scope调试效率会提高很多。最后给所有准备复现的小伙伴一个建议第一步先用理想直流源替代光伏部分把VSG并网跑通确认交流侧控制没问题后再接光伏和MPPT。分开调省时间不会一出问题就两头抓瞎。我最初就是把整个系统一次性搭完结果出了问题根本定位不到是哪侧的锅浪费了至少两天。模块化调试永远比整体调试靠谱。这个项目做完之后其实还可以往后扩展比如把VSG做成自适应的J参数调整、或者在负载突变时验证VSG的调频能力、再做一下故障穿越验证这些都是很好的论文增长点。不过那些属于进阶玩法先把这篇里的模型吃透后面的路自然就顺了。