ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

光伏并网逆变器弱电网稳定性分析:阻抗建模与扫频法实战解析

光伏并网逆变器弱电网稳定性分析:阻抗建模与扫频法实战解析 光伏并网逆变器的稳定性分析这几年绕不开一个词——阻抗建模。我在做博士课题时被这个问题折腾过很久逆变器在弱电网下明明仿真能稳定运行并网之后却出现振荡甚至烧掉设备。后来把目光转向扫频法与阻抗建模之后问题才真正被看透。这篇内容我围绕“光伏并网逆变器扫频与稳定性分析含锁相环、电流环”这套Simulink仿真把阻抗建模的思路、扫频法的实现、锁相环和电流环对阻抗的影响以及稳定性判据的用法完整拆开讲一遍。适合正在复现论文、做并网稳定性方向的研究生也适合做新能源并网设备开发的工程师——只要你想搞清楚“为什么逆变器在弱网下会振荡、怎么仿真验证自己的模型”这篇内容都会对你有用。1. 为什么光伏并网逆变器要做阻抗分析先聊一个非常现实的问题传统的稳定性分析比如看传递函数极点、根轨迹、状态空间特征值在单机单变流器场景下是够用的。但一旦逆变器接入的是一个“未知”电网电网的阻抗随线路长度、变压器、并联机组数量的变化而变化这时候你没法用一套固定的系统方程去描述整个并网系统。阻抗法的核心思路是把逆变器看成“一个源”把电网看成“一个负载”两者在公共耦合点处形成分压关系整个闭环系统的稳定性就由源阻抗和负载阻抗的比值决定。这个思路其实跟电子电路里的“输出阻抗匹配”很像。你在设计一个运放驱动长线缆时要考虑输出阻抗和电缆特征阻抗的匹配问题。逆变器并网也一样逆变器有自己的输出阻抗电网有电网的等效阻抗两者在dq坐标系下各自变成一个二维矩阵。阻抗在频域上是随频率变化的复数所以我们可以把不同频率下的阻抗特性画成Bode图再用奈奎斯特判据判断系统有没有一对穿越临界点的闭环极点。这里必须强调光伏并网逆变器跟普通三相整流器还不完全一样。光伏侧是直流母线前级通常有Boost电路做MPPT后级是三相全桥逆变器。从并网口看进去逆变器最核心的动态包括这几块电流内环、锁相环、PWM调制延迟以及直流母线电压波动带来的耦合。锁相环的存在使得dq坐标系的参考角与电网电压实际角度之间存在动态偏移这点直接会在阻抗模型里引入一个“负电阻”效应频率通常在锁相环带宽附近。电流环带宽则决定了逆变器在中频段呈现出的阻抗幅值与相位。PWM的采样保持和一拍延迟会整体给阻抗曲线带来相位滞后。这几项叠加在一起最终决定了逆变器在不同频段是“正阻尼”还是“负阻尼”。阻抗建模的价值就在于不用重新搭建一个包含详细控制结构的电网全系统模型只把逆变器的阻抗特性用扫频的方式测出来或者用解析公式算出来然后配合电网阻抗就能判断这个并网点在当前电网强度下会不会振荡。比如一个典型的应用场景电网短路比SCR从3降到1.5电网感抗变大此时逆变器输出阻抗在中频段与电网阻抗的交点处如果相位裕度不足就会发生次同步振荡。这种判断在时域仿真里往往要等到振荡发散才能发现而阻抗法在频域里一眼就能看到风险点。2. 整套方案的核心设计思路2.1 为什么选择同步旋转坐标系下的阻抗模型逆变器本质上是一个三相交流系统但控制是在dq同步旋转坐标系里做的。在abc三相坐标系下50Hz工频信号会占据主导地位阻抗特性没办法直接暴露出来。到了dq坐标系下稳态工作点变成直流量三相平衡系统在这个工作点附近的小信号扰动被拆成d轴和q轴两个正交分量这样就能在“直流工作点”附近做小信号线性化阻抗也自然是一个2×2矩阵。这是绝大多数并网逆变器阻抗建模论文的标准做法。dq坐标系下的阻抗矩阵写成这样Z_dq(s) [Z_dd(s), Z_dq(s); Z_qd(s), Z_dq(s)]其中Z_dd和Z_qq是自阻抗Z_dq和Z_qd是耦合阻抗。理想情况下如果控制对称自阻抗占主导耦合项很小。但实际上锁相环的存在会引入明显的dq耦合尤其是在PLL带宽附近。这也是为什么只在d轴注入扰动、只看Z_dd的做法在有些场景下会误判稳定性——因为你可能漏掉了Z_qd和Z_dq带来的负阻尼。所以做扫频的时候我建议直接分两次注入第一次在d轴注入小信号扰动同时测量d轴和q轴的电压电流响应得到矩阵的第一列第二次在q轴注入扰动得到矩阵的第二列。两次测量组合在一起才能得到完整的2×2阻抗矩阵。很多复现论文的人只测d轴自阻抗然后拿这个去套奈奎斯特判据结果和理论对不上排查半天发现是耦合项被忽略了。2.2 为什么扫频法能“测”出阻抗阻抗本身不是直接能拿万用表量的物理量它是“电压扰动”与“电流响应”的比值。扫频法的思路非常朴素在某一频点给并网逆变器注入一个幅值很小的正弦电压扰动或者电流扰动等系统进入稳态后测量同频率下的电压和电流分量用复数除法算出这个频点的阻抗值。然后把扰动频率从小扫到大就得到一条阻抗幅值-相位曲线。这个思路看似简单实际做的时候全是细节。扰动注入方式有两种串联电压源型和谐波电流源型。仿真里最常用的是在PCC处并联一个受控电流源注入某频率的小信号谐波电流然后测量PCC电压和并网电流的响应。因为逆变器本身在产生基波电流你在测量端需要用FFT或者相关分析法把基波分量和扰动频率分量分开。注意这里的“注入”不等于“真实往电网里灌一个谐波源”这只是为了测阻抗而加的一个虚拟小扰动幅值一般控制在基波幅值的1%3%既要保证信噪比又不能大到激发逆变器的非线性特性。另一种做法是PRBS伪随机二进制序列注入一次注入一个宽带信号然后通过互相关计算得到频率响应。这个思路在硬件在环测试里很常见仿真中也能用但精确度不如单频逐点扫频。Simulink仿真里我坚持用单频扫频因为每次扫频可以完整记录瞬态过程排除非线性和动态切换的干扰而且单个频点测量结果的置信度更高方便和解析模型逐点对比。2.3 验证“扫频结果”需要有解析模型做对标扫频测出来的阻抗曲线只是一堆数据点。如果你不建立解析模型这堆数据点没法用来解释“为什么这个频段会出现负电阻”。因此我在整套方案里保留了完整的解析建模部分先推导dq坐标系下逆变器输出阻抗的解析表达式把电流环PI参数、PLL带宽、PWM延迟、滤波电感电容参数全部带进去得到Z_dq(s)的符号表达式再和扫频结果逐频点对比。两者吻合说明模型准确两者在某个频段出现偏差正好暴露被忽略的动态因素。这个思路也是博士论文里“模型验证”环节的标准做法。论文的评审专家不会只看你扫频得到一堆漂亮的曲线而是要求你证明“这个阻抗模型是正确的”。用解析模型和扫频结果做互验既验证了解析模型的正确性又验证了扫频法的实施是否可靠一石二鸟。我后面会给出具体的对比方法幅值误差、相位误差和频点覆盖范围三方面对标。3. Simulink仿真实现完整拆解3.1 主电路与控制系统模型结构我搭建的Simulink模型分四个部分主电路、控制算法、阻抗测量注入模块、数据采集脚本。主电路采用标准的三相两电平光伏并网逆变器结构直流侧用理想电压源代替光伏阵列加Boost电路电压设定为700V。这样做的好处是先把MPPT动态从分析中拿掉聚焦在逆变器控制本身。如果后续想分析直流母线电压波动对阻抗的影响再把前级细节补回来。三相全桥采用IGBT/Diodes模型开关频率设为10kHz死区时间2us。交流侧是LCL滤波器逆变器侧电感L11.5mH网侧电感L21.2mH滤波电容Cf10uF。PCC点连接一个可调电感Lg模拟电网阻抗Lg从0.1mH到6mH可调对应短路比从强电网到极弱电网的变化。控制系统部分电流环采用dq解耦PI控制d轴电流参考值由直流母线电压外环输出或者直接给定恒功率参考值q轴电流参考值设为0单位功率因数。锁相环采用标准SRF-PLL结构PI参数取了带宽大约300Hz阻尼比0.707。PWM采用不对称规则采样等效一拍延迟加零阶保持。这一步在模型里体现为“Transport Delay”和“Zero-Order Hold”的组合。需要特别说明一个细节你用来做阻抗分析的仿真模型开关频率纹波必须和实际硬件一致否则高频阻抗段的扫频结果会失真。Simulink里有两种建模方式平均模型和开关模型。平均模型仿真快但掩盖了PWM延迟和高频谐波的效应做高频阻抗扫频时结果会偏理想开关模型更接近实际但每个频点都要等开关纹波滤波器稳定后再取数仿真时间成倍增加。我给的建议是先用平均模型完成全频段扫频锁定谐振风险区间后再用开关模型在关键频段做精细扫频验证。这样效率和精度都能兼顾。3.2 扫频法的实现步骤与参数设计扫频过程本质上是一个不断重复的实验流程。每一步的核心操作如下初始化仿真模型设置稳态工作点。比如有功功率5kW、无功0Var电网电压380V/50Hz。选定一个扰动频率f_i通常在1Hz到2000Hz范围内按对数均匀分布取点我习惯取50个频点。在PCC处并联注入频率为f_i的小信号正弦电流扰动幅值为基波电流幅值的2%持续0.2秒。待系统进入稳态后采集PCC点三相电压和三相电流记录到Workspace。对采样数据做FFT或者带通滤波提取f_i频率处的电压和电流复向量。计算该频点的阻抗值Z(f_i) V_fi / I_fi。切换该频点对应的阻抗分量d轴注入对应Z_dd和Z_qdq轴注入对应Z_dq和Z_qq。重复步骤2到7直到所有频点扫完。这里最容易翻车的地方是“采样时长与FFT分辨率”的匹配。仿真采样频率我设为50kHz记录时长0.2sFFT频率分辨率是5Hz。当扰动频率f_i不是5Hz的整数倍时FFT会出现频谱泄漏测出来的幅值和相位都带误差。最稳妥的做法是让记录时长等于扰动周期的整数倍然后在Matlab里用“整周期截断矩形窗”做FFT或者干脆用Goertzel算法只计算目标频率点的幅值和相位。Goertzel算法在仿真数据后处理里很好用代码不到10行可以精确定位某个频率分量的复数大小不会受FFT分辨率限制。关于扫频时间50个频点每个频点仿真0.4s含0.2s稳态时间总仿真时间20s。Simulink里跑20秒的开关模型在普通电脑上大概需要几分钟到十几分钟不等这个成本可以接受。如果嫌慢可以把扰动频率列表压缩到30个点还能接受。我在实际验证时发现30个频点已经能覆盖绝大部分稳定性判断需求关键频段比如100Hz到800Hz之间再加密取点效果比均匀取50个点更好。3.3 阻抗计算与数据后处理脚本扫频结束后每个频点计算出一组复数电压和复数电流。计算阻抗时要注意坐标系换算。如果你在abc三相坐标系下注入扰动需要先把电压电流变换到dq坐标系再计算阻抗矩阵还是直接在dq坐标系下做扰动注入我的选择是后者让扰动注入模块工作在dq坐标系下直接生成d轴或q轴的小信号扰动分量并通过Inverse Park变换加到PCC处。这样测量到的电压和电流直接就是dq分量省去一次坐标变换也避免三相不平衡引入的负序分量污染结果。下面是扫频主脚本的核心伪代码Matlab实现%% 扫频参数配置 f_list logspace(0, 3.301, 40); % 1Hz到2000Hz对数分布40个点 f_list unique(round(f_list*10)/10); % 避免频点过密 % 每个频点测量结果存储 Z_dd zeros(1, length(f_list)); Z_qd zeros(1, length(f_list)); for k 1:length(f_list) f_pert f_list(k); % 修改Simulink模型中的扰动频率参数 set_param(PV_Inverter_Model/Perturbation_freq, ... Value, num2str(f_pert)); % 运行仿真前0.2s稳态后0.2s注入扰动并记录 sim(PV_Inverter_Model, StopTime, 0.4); % 提取PCC处dq电压和dq电流 vd vd_measure.Data; vq vq_measure.Data; id id_measure.Data; iq iq_measure.Data; % 用Goertzel算法提取目标频率分量只计算f_pert一个点 Vd_f goertzel_dft(vd, fs, f_pert); Iq_f goertzel_dft(iq, fs, f_pert); % d轴注入时Z_dd Vd_f / Id_f, Z_qd Vq_f / Id_f Id_f goertzel_dft(id, fs, f_pert); Vq_f goertzel_dft(vq, fs, f_pert); Z_dd(k) Vd_f / Id_f; Z_qd(k) Vq_f / Id_f; end这段脚本里最关键的变量是“扰动频率要与仿真采样时长精确匹配”。我在0.2s记录窗口内采样10000个点fs50kHz正好200个工频周期和10000个扰动周期对50Hz整数倍频点。非整数倍频点则依靠Goertzel算法解决频谱泄漏问题。这两个手段加在一起测出的复阻抗精度可以做到幅值误差小于1%、相位误差小于0.5度。3.4 锁相环与电流环参数如何影响扫频结果锁相环在阻抗模型里的角色非常微妙。PLL的带宽决定了dq坐标系旋转角度的动态调整速度。当扰动频率低于PLL带宽时PLL能快速锁定扰动引起的电压相角变化相当于dq坐标系的参考方向跟着扰动走阻抗特性接近理想同步坐标系下的结果。当扰动频率高于PLL带宽时PLL跟不上扰动坐标参考方向保持固定阻抗特性反而接近“无PLL”情况下的结果。这个转变在Bode图上表现为在PLL带宽附近阻抗相位出现一个明显的凸起或凹陷而且q轴到d轴的耦合阻抗Z_qd会显著增大。我在仿真中验证过一个非常典型的结论PLL带宽从300Hz提高到600Hz逆变器输出阻抗在100Hz300Hz频段的相位明显向负方向偏移也就是更容易出现负阻尼。原因很简单PLL带宽越高PLL的调节作用越强逆变器对外表现为“试图维持电压相位”这个行为等效于一个负电阻。所以弱电网下抑制振荡的一个常规手段就是降低PLL带宽。你可以在Simulink里做参数扫描把PLL带宽当作扫频脚本外层循环变量观察阻抗曲线随PLL带宽的演化这一步的物理图像非常直观。电流环对阻抗的影响则集中在电流环带宽附近。电流环带宽通常设计在1/10开关频率附近即1kHz上下。在这个频段以下电流环的理想跟踪特性让逆变器表现为一个受控电流源输出阻抗很高在这个频段以上电流环失去调节能力输出阻抗逐渐由滤波电感主导表现为感性阻抗。这两个频段之间的过渡区域阻抗相位和幅值都剧烈变化正好是稳定性分析最关注的区域。所以电流环PI参数出来后务必要做一次扫频验证确认Z_dd曲线在过渡频段的形状跟预期一致。4. 扫频结果分析与稳定性判断4.1 扫频结果与解析模型如何对标验证把50个频点全部扫完之后第一件事不是直接做稳定性判断而是把扫频结果和解析模型对比。具体做法是画出Z_dd的Bode图幅频曲线和相频曲线上分别画两条线一条来自扫频数据点一条来自Z_dd(s)解析表达式对比两者的吻合程度。我在实际操作中遇到过一次有意思的偏差扫频结果在300Hz附近比解析模型多出一个谐振峰相位也出现跳变。后来排查发现是LCL滤波电容在模型里没有加阻尼电阻导致阻抗在谐振频点出现了尖锐的峰值。把电容串联阻尼电阻Rd2.5Ω加上之后扫频和解析模型重新对齐。这说明扫频结果不仅能验证模型还能反过来帮助发现模型中忽略的物理环节。推荐大家在对比时除了肉眼观察还可以算一个平均误差指标取所有频点幅值相对误差的中位数以及相位误差的中位数。如果幅值误差超过5%或者相位误差超过3度说明某个动态环节没被建模进去需要找原因。4.2 基于阻抗比的奈奎斯特稳定性判据有了准确的逆变器输出阻抗Z_inv(s)和电网阻抗Z_g(s)就可以做并网稳定性判断了。标准的判据是在整个频段内如果Z_g(s)/Z_inv(s)的奈奎斯特曲线不包围(-1, j0)点系统就是稳定的。这个判据的物理含义是并网电流在每个频率上都要满足分压关系如果电网阻抗和逆变器阻抗在某频率下幅值相等且相位差达到180度这个频点就会成为振荡点。旁观来看这跟负反馈放大器的稳定性判据如出一辙——环路增益的幅频和相频交点到-180度时的裕度就是稳定性的度量。项目中我用的方法是在Matlab里绘制Z_g/Z_inv的奈奎斯特曲线直接观察曲线与实轴负半轴的交点位置。如果交点实部大于-1系统稳定小于-1系统存在不稳定风险。举一个真实案例电网电感Lg从0.5mH增大到3mHZ_g的幅值整体上移。当Z_g/Z_inv的幅值曲线在约450Hz处与0dB线相交时对应相位裕度约为18度系统能稳定但阻尼很弱时域仿真中并网电流会出现明显的衰减振荡振荡频率就在450Hz附近。如果把电网电感进一步增大到5mH幅值交点的频率下降到360Hz相位裕度变为负值奈奎斯特曲线包围(-1, 0)点时域里就表现为发散振荡。这个过程中阻抗法给出的预测和时域仿真完全吻合。需要特别提示的是若只画Z_dd和电网阻抗Z_g_dd的单输入单输出奈奎斯特曲线在dq耦合较强锁相环带宽较高时会得到偏乐观的稳定性结论。因为Z_qd和Z_dq构成的耦合路径相当于一个附加的正反馈回路会把系统的稳定裕度进一步压低。所以我在代码里实现了一个2×2矩阵版本的广义奈奎斯特判据画出Z_g(s) * Z_inv(s) 的特征值轨迹看特征值曲线是否包围(-1, 0)点。这个方法在MIMO阻抗模型下是严格准确的虽然计算量稍大但仿真和脚本都不麻烦。4.3 稳定性分析结果如何指导控制器参数调整阻抗扫频的价值不仅在于“判断稳定与否”更在于定位“不稳定发生在哪个频段、由哪个环节主导”。以PLL带宽为例如果奈奎斯特曲线发现在100Hz300Hz频段相位裕度不足优先考虑降低PLL带宽。以电流环为例如果中频段阻抗幅值曲线出现凹陷反映出电流环增益不足或者相位裕度偏小需要调整电流环PI参数。如果问题是高频段1kHz以上谐振那就优先处理LCL滤波器参数或增加阻尼。我在项目中通过扫频阻抗比分析成功解决了一个弱电网振荡现象。原始参数下电网电感为4mH系统在稳态运行15毫秒后并网电流开始出现约380Hz的振荡幅值逐渐增大。扫频结果显示Z_g/Z_inv在380Hz处相位裕度为-5度。将PLL带宽从400Hz降到200Hz后重新扫频同一频点相位裕度变为22度时域仿真中振荡消失。整个调参过程耗时不到半天主要时间花在扫频仿真但比时域中反复试凑参数高效得多。5. 实操中的常见坑与排查技巧5.1 扰动幅值如何选取才不引入非线性误差扰动幅值太大会激发逆变器控制环的非线性特性比如电流环PI输出限幅、PWM调制过调制、锁相环的捕获非线性等扫出来的阻抗幅值会偏大或者相位出现虚假滞后。扰动太小测量结果会被开关纹波、数值噪声淹没。我的经验值是以PCC点额定电压为基准扰动电压幅值取额定电压的1%3%换算成扰动电流大约为额定电流的1%2%比较好。如果逆变器工作点在小功率比如10%负载扰动相对幅值要适当加大否则信噪比不够。一个通用做法是先扫两个频点做预实验分别用1%、2%、5%的扰动幅值测量同频点阻抗三者一致说明幅值在线性区若2%和5%的结果明显偏离1%说明系统已经进入非线性区要减小扰动幅值。5.2 为什么低频段阻抗扫频总是不准低频段1Hz50Hz扫频不准几乎是必然现象原因是测量窗口必须足够长才能覆盖低频扰动周期。1Hz扰动需要至少1秒的记录时间才能准确提取分量加上稳态时间单个频点仿真时间要到3秒左右。而50Hz以下频段恰好是电流环和PLL动态的交汇区稳态响应时间长瞬态衰减慢。我见过不少人把记录窗口设置成0.2秒对所有频段一视同仁结果10Hz以下的数据全部漂移和解析模型完全对不上。解决思路有两层。第一层是低频段单独设置扫频参数记录窗口至少包含10个扰动周期稳态时间也要加长到扰动周期的5倍以上。第二层是在后处理时优先采用“去趋势带通滤波”的组合先用高通滤波器滤掉直流偏移和缓慢漂移再用窄带带通滤波器提取目标频率分量。这个方法比直接FFT更稳健代价是计算量稍微增加。仿真中完全可以接受。5.3 扫频测量时PLL动态和稳态如何分离扫频法有个天然的矛盾注入扰动之后锁相环会调整自己的输出相位而这个调整过程本身就会改变PCC电压的相位。你测到的电压扰动里面既包含注入扰动的直接响应也包含PLL相位调整带来的间接响应。这两者其实是真实阻抗的一部分理论上不应该去掉。但如果不加控制PLL的瞬态调节会在扰动注入初期造成较大的测量误差。我的处理方式是在Simulink模型中把PLL输出角度直接引到测量后端。测量电压和电流时不用PCC电压自身的锁相角去做Park变换而是用“不含扰动的基波正序相位”作为dq变换的参考角。这样做的效果是把PLL动态和被测阻抗的PLL效应解耦PLL对阻抗的影响体现在阻抗矩阵的元素里而不是体现在测量坐标系的抖动上。实现方式是在仿真模型里加一个“参考相位生成器”根据基波频率和固定初相角生成一个理想的正弦参考。这个小技巧让扫频结果稳定了很多尤其是在分析PLL带宽附近的阻抗时数据不再抖动。5.4 扫频脚本自动化时的参数索引问题用set_param循环修改扰动频率时参数类型必须严格匹配。Simulink里如果是Constant模块set_param传字符串可以如果是MATLAB Function里的工作区变量就要在循环里直接给变量赋值后重新调用sim。还有一个容易犯的错是Simulink缓存导致模型参数更新不生效——每当修改模型结构或参数后先调用一次set_param(bdroot, SimulationCommand, update)再运行仿真。不然第一个频点用的还是上一次的缓存参数整个扫频数据全废。另一个自动化技巧是不要每次扫频都重新编译模型。Simulink默认每次sim都会检查模型是否需要重新编译如果只改Constant值模型结构没变编译器会自动复用速度还好。但如果你的模型里有可变步长求解器频繁改参数可能导致求解器步长策略重置导致每个频点的仿真表现不一样。建议把所有扰动频率相关的模块固定成连续运行模式用“Simulink.SimulationInput”对象批量管理参数和仿真选项这样每个频点的仿真设定严格一致扫频结果可复现性更强。5.5 常见问题速查表问题现象可能原因解决方法低频段阻抗幅值偏大瞬态未到稳态就采样频谱泄漏加长稳态时间每个频点单独设置记录窗口阻抗Bode图出现毛刺扰动幅值过大触发控制器限幅降低扰动幅值至基波的1%2%高频段结果与解析模型偏差大PWM开关纹波污染测量结果提高采样频率可用平均模型做高频段验证奈奎斯特判据预测稳定但时域振荡忽略dq耦合项用了SISO判据改用2×2阻抗矩阵的广义奈奎斯特判据扫频结果在不同频点之间不连续求解器容差或步长设置不一致固定ode23tb求解器限制最大步长10usPLL带宽附近相位跳变无法复现参考角取的是PCC电压自身锁相角用理想基波相位生成dq变换参考角经常有人问我这样一个扫频仿真从头到尾要花多久。按我的经验模型搭建和参数整定大约需要两天扫频脚本调试约一天扫频数据与解析模型对比验证约一天。总耗时四到五天可以出一套完整的阻抗谱加稳定性分析结果。论文里用这个流程核心图件阻抗Bode图、奈奎斯特曲线、时域验证波形基本都能覆盖。后面想往深走可以在此基础上加宽频带扫频PRBS、加入直流母线电压动态、考虑电网背景谐波对阻抗测量的影响这些都是可以继续做的方向。至少在目前把阻抗建模和扫频法这一套流程跑通你已经解决了并网稳定性分析里最核心的问题。
返回列表