阻抗建模、扫频验证、PLL与电流环耦合、Simulink仿真——这几个词放到一起,基本就是光伏并网逆变器稳定性研究的标配。我最初接触这个方向,是想复现一篇博士论文里关于弱电网下逆变器谐振的分析。论文的推导很漂亮,但真正动手时发现,把阻抗矩阵从公式变到仿真曲线,中间隔着不少细节。这个项目标题里的“阻抗建模、验证扫频法、锁相环电流环”其实已经把要做的三件事点破了:先建模,再验证,最后用验证过的模型做稳定性判断。这篇文章就以这个顺序讲透,适合正在做新能源并网阻抗研究、复现论文或者准备做硬件在环测试的人参考。
1. 先搞清楚阻抗建模到底在做什么
1.1 为什么要用阻抗而不是时域波形
很多刚接触这个方向的人会困惑:既然Simulink里已经能跑真实的三相PWM波形,为什么还要费劲去测量阻抗?因为时域波形只能告诉你“这台逆变器在某种电网条件下振荡了”,但没办法告诉你“它在什么频率区间危险、为什么危险、换一组电网参数会不会更糟”。阻抗是频域的“体质指标”,相当于给逆变器做了个体检,给出不同频率下电压扰动和电流响应之间的比值关系。
并网逆变器从外面看不是一个纯电阻或纯电感,它有控制环、滤波器、PWM延迟、锁相环。这些环节在特定频率段可能让阻抗呈现负实部。负实部意味着:当你给这个端口加一个电流扰动,它产生的电压分量会反过来加剧原来的扰动,而不是消耗能量。这种局部负阻尼和电网的感性阻抗耦合之后,就可能形成振荡。
阻抗建模的任务就是把“负阻尼在哪里出现”这件事变成可计算、可测量的物理量。光伏并网逆变器的阻抗建模通常是在dq旋转坐标系下做小信号线性化,最终得到一张2×2的阻抗矩阵。矩阵里的每个元素都是频率的函数,对应某一个频率的小扰动电压会产生多大、什么相位的小扰动电流。
1.2 dq坐标系下的阻抗矩阵不是玄学
为什么不用abc坐标下单相阻抗?因为三相交流系统在基频下本身是时变的,一个固定频率的正序扰动在不同时刻作用在端口上,响应的“有效相位”每时每刻都在变。如果硬要在abc坐标下定义阻抗,会发现阻抗随基频周期变化,不是线性时不变系统,不能直接用Bode图和奈奎斯特判据。
做成dq变换后,基频量变成直流工作点,小扰动围绕这个直流工作点线性化,系统就变成一个近似的线性时不变系统。这才是阻抗分析的前提。
但这会付出代价:原本在abc坐标下一个端口阻抗的概念,到dq坐标下变成了一个矩阵:
Z_inv(s) = [ Z_dd(s) Z_dq(s) Z_qd(s) Z_qq(s) ]
Z_dd是d轴电压扰动对d轴电流的影响,Z_dq是d轴电压扰动对q轴电流的影响,其他元素同理。由于坐标变换带来的频率耦合,Z_dq和Z_qd通常不能忽略。锁相环参与之后,这个耦合会更加明显。
打个比方:单相阻抗像测一个人的体重,dq阻抗矩阵像测体脂、肌肉量、水分包括各项指标。只测体重,判断不出健康隐患;只测Z_dd,也无法准确判断弱电网下的振荡风险。
1.3 扫频法在整个流程里的位置
有了理论推导的阻抗模型后,必须在仿真或硬件中验证它。扫频法本质上是一个频域系统辨识过程:在某个频率点上给系统注入一个小幅正弦扰动,测量端口的响应,然后计算该频率下的增益和相位。一个频率点得到一个阻抗数据,把关心的频率范围扫一遍,就得到完整的阻抗频率特性曲线。
扫频法的好处是直观、抗建模误差能力强。理论推导中往往会忽略一些非理想因素,比如数字控制延迟的准确模型、PWM谐波、传感器采样延迟、死区效应等。这些因素在推导时很难全部精确考虑,但在仿真里他们会真实存在。扫频法扫出来的阻抗曲线会和理论模型做一个对照,如果两者吻合,说明你的理论模型抓到了主要因素;如果不吻合,就需要回头检查有没有遗漏。
这也正是标题里“验证扫频法”的含义:扫频不是目的,验证理论模型才是。之后做稳定性分析时,用理论模型还是用扫频数据都可以,但通常做法是用理论模型做参数化分析,用扫频结果做终验。
2. 锁相环和电流环怎么把阻抗“搞复杂”的
2.1 锁相环造成d轴和q轴的耦合
锁相环是并网逆变器并网控制的核心环节,也是阻抗建模里最容易漏掉、漏掉之后最危险的一环。理想情况下,我们希望PLL输出的角度完全等于电网电压矢量的真实相位,这样Park变换恰好把电网电压解耦到d轴,q轴电压和基频解耦。但实际上PLL的带宽有限,当网侧电压中有扰动时,PLL输出角度会抖动,而这个抖动会反过来影响dq坐标系下的电压电流测量。
小信号下,PLL的动态可以用一个传递函数描述:Δθ = G_PLL(s) Δv_q。这个G_PLL(s)通常是一个二阶低通特性,由锁相环PI参数决定。锁相环带宽越高,这个角度扰动的影响范围越大。
由于dq变换是用PLL的输出角度构造的,角度扰动会将d轴和q轴的扰动互相“串扰”。表现到阻抗矩阵里,Z_dq和Z_qd变得不可忽略,而且Z_qq甚至会出现负实部。这个负实部出现的频段一般在PLL带宽附近,比如50Hz到300Hz之间。
弱电网场景下,电网阻抗增大,PLL看到的公共耦合点电压相位扰动更明显,因此负电阻效应更容易被激发。这就是为什么很多振荡事故都发生在SCR比较低的场站,而且振荡频率往往和PLL带宽有关。
2.2 电流环决定基波附近阻抗形态
电流环决定的是逆变器“主动抵抗”电压扰动的能力。d轴和q轴电流环通常用PI调节器,输出叠加前馈电压后生成调制波,经过PWM延迟作用于滤波器。
从端口看,电流环闭环之后,逆变器对外表现更像一个受控电流源并联一个阻抗。低频段,电流环增益很高,电压扰动会被控制器立刻补偿掉,电流响应很小,因此输出阻抗幅度很大;高频段,电流环增益下降,控制器压不住滤波器电感上的电压-电流关系,阻抗就会逐渐退化成近似jωL,幅频曲线呈每十倍频20dB上升的感性特征。
这个过程中有几个细节特别影响阻抗形状:电流采样滤波器的截止频率、PWM开关周期带来的控制延迟、调制饱和限幅、以及dq轴电流解耦项的交叉影响。在做扫频验证时,如果发现理论曲线和扫频曲线在中频段存在明显差异,大概率是控制延迟或采样滤波的模型不够准。
2.3 从传递函数到扫频验证曲线
完整的dq阻抗模型推导一般分两步。第一步把主电路在dq坐标系下线性化,得到滤波器的等效阻抗;第二步把电流环和锁相环的反馈路径并入小信号方程,得到整个逆变器端口的阻抗矩阵。
在Simulink里验证这套模型时,我习惯先搭一个平均模型,也就是把三相全桥等效成受控电压源,其输出由调制电压决定。平均模型没有PWM开关纹波,扫频曲线的毛刺少很多,和理论模型的对比更清晰。等确认平均模型下的阻抗曲线正确之后,再切回带有实际PWM和IGBT模型的开关电路,用扫频法验证非线性因素对阻抗的影响。
这里有一个很常见的误区:有些人直接拿开关模型去扫频,发现高频段曲线全是毛刺,就以为是模型不对。其实那是PWM开关纹波和高频侧的频谱泄漏导致的。先跑平均模型,把扫频法本身的正确性确认下来,再换开关模型,排查起来会轻松得多。
3. Simulink扫频实现:一步步搭起来
3.1 整体仿真模型结构
以最常见的两级式光伏并网系统为例。前级是PV阵列加Boost电路,中间是直流母线电容,后级是三相两电平VSC经L滤波器接入电网。做阻抗扫频时,如果只关注并网逆变器端口的小信号特性,前级PV和MPPT的动态可以简化成直流母线电压源,因为MPPT带宽很低,在扫频频率范围内基本不参与。
主电路模型需要包含:
- 直流电源或简化的PV模型,电压稳定在额定值;
- 三相VSC桥,可用开关模型或平均模型;
- L滤波器和阻尼电阻(如果有);
- 电网阻抗,用Rg、Lg串在理想电网电压源和PCC之间;
- 控制部分:PLL、dq坐标变换、电流PI控制器、PWM生成或者平均值调制。
建议把扰动源放在PCC端口附近,不要在直流侧加扰动。因为我们要测量的是逆变器对外呈现的端口阻抗,扰动必须作用于端口的电压或电流。
固定仿真步长可以用1e-5或5e-6秒。步长太大,高频扰动波形失真;步长太小,低扫频点仿真时长太长。平均模型下,1e-5秒基本够用。如果跑开关模型,步长建议小于开关周期的1/100,比如10kHz开关频率下用1e-6秒。
3.2 扰动注入的两种做法
第一种是电压源串联注入。在PCC和电网电压源之间串联一个受控电压源,注入一个很小幅值的平衡三相正弦扰动。为了让扰动在dq坐标下表现为频率f_scan的扰动,注入电压的实际abc频率要适当偏移。
例如,希望得到d轴激励对应的阻抗元素,可以注入一个正序平衡扰动,其abc频率是f1+f_scan。经过PLL角度变换后,这个扰动在dq域中会出现在f_scan位置。如果希望注入q轴激励,可以构造一个相位滞后90度的正序扰动,或者在dq域直接构造扰动再反变换到abc,注入到受控电压源。
第二种做法是电流源并联注入。在PCC并联一个受控电流源,注入小幅平衡扰动电流,测量PCC电压响应。这种方法在硬件实验中更常见,因为实际装置往往更不容易串联额外电压源。仿真中两种都行,但电压源串联注入更容易控制输入信号的信噪比。
我个人的建议是:用受控电压源串联注入,幅值取额定电压幅值的1%到3%。比如线电压幅值311V,取3到5V的扰动幅值。不要低于1%,否则FFT从噪声里提取信号困难;不要超过5%,否则可能触碰到限幅非线性,小信号假设失效。
3.3 FFT或相关积分提取幅值和相位
扫频法最核心的一步是从时域数据里提取特定频率下的幅值和相位。很多人直接用MATLAB的fft函数扫一圈,会发现频谱泄漏严重尤其是扰动频率和仿真时长不是整数倍周期的时候。
更稳的做法是相关积分法,也就是用正弦和余弦参考信号做相关运算。假设我们已经从Simulink里导出了时间向量t、dq电压v_d、v_q,dq电流i_d、i_q,扫频频率为f_scan,那么对任意信号x,在频率f_scan下的复数幅值可以这样提取:
function X = extract_amp_at_freq(t, x, f_scan, t_start) idx = t >= t_start; tt = t(idx) - t(idx(1)); x = x(idx) - mean(x(idx)); % 去除直流偏置 N = length(tt); Ts = (tt(end) - tt(1)) / (N - 1); coef = 2 / (tt(end) - tt(1)); X_re = coef * sum(x .* cos(2*pi*f_scan*tt)) * Ts; X_im = coef * sum(x .* sin(2*pi*f_scan*tt)) * Ts; X = X_re - 1i*X_im; end这个函数比fft适合扫频场景,因为你可以只计算感兴趣的频率点。参考频率就是f_scan,不需要加窗,只要仿真时长包含足够多周期的扫描周期就行。通常取5个周期以上,我习惯取10个扫描周期作为分析窗口,并且从仿真启动后的若干个扫描周期之后开始提取,避开初始暂态。
假设一次扫描电压源注入后,得到的电压扰动复数幅值为Vd_scan,电流扰动复数幅值为Id_scan,那么该频率点的阻抗元素可以计算为Z = Vd_scan / Id_scan。
3.4 两组独立激励解出2×2阻抗矩阵
要得到完整的dq阻抗矩阵,一次扫描是不够的,因为变频器内部存在耦合,单一d轴注入会同时产生d轴和q轴电流响应。为了解开Z_dd、Z_dq、Z_qd、Z_qq四个元素,需要做两组独立激励。
第一组:注入d轴扰动,记录扰动电压为Vd1、Vq1,响应电流为Id1、Iq1。 第二组:注入q轴扰动,记录扰动电压为Vd2、Vq2,响应电流为Id2、Iq2。
在Simulink中,这两个注入可以用同一个频率f_scan,但要错开注入时间点,比如第一组从0.5秒开始,第二组从3秒开始;也可以为了简化后处理,直接用两个不同的扰动频率。不过最清晰的做法还是分两次仿真,每次只加一组扰动。
整理成矩阵方程:
[ Vd1 Vd2 ] [ Zdd Zdq ] [ Id1 Id2 ] [ Vq1 Vq2 ] = [ Zqd Zqq ] [ Iq1 Iq2 ]
解这个2×2矩阵,就可以得到当前频率f_scan下的完整阻抗矩阵。对扫频范围内的所有频率点重复这个流程,就能得到阻抗矩阵随频率变化曲线。
做完这一步,恭喜你,你已经完成了标题里的“验证扫频法”中最麻烦的部分。
4. 稳定性分析怎么用阻抗结果
4.1 广义奈奎斯特判据与回比矩阵
扫频得到的阻抗矩阵不是最终目的,最终目的是判断逆变器接入一个给定电网后会不会振荡。传统单相电力系统里常用的奈奎斯特判据,在多输入多输出的dq阻抗系统中需要扩展成广义奈奎斯特判据。
假设逆变器端口阻抗为Z_inv,电网侧阻抗为Z_g。电网的dq阻抗矩阵可以写成一个二阶形式,对感性电网:
Z_g(s) = [ Rg + sLg -ω1·Lg ω1·Lg Rg + sLg ]
这里的ω1是基频角频率,负对角线交叉项来自电感上的旋转坐标转换。如果电网侧不止一台逆变器,或者有多机并联,Z_g还需要用并联网络化简。
定义回比矩阵L(s) = Z_g(s) · Y_inv(s),其中Y_inv是逆变器导纳矩阵,也就是Z_inv的逆。闭环系统稳定的充要条件是det(I + L(s))没有右半平面零点。通过求L(s)的特征值λ1(s)和λ2(s),分别做奈奎斯特曲线,观察它们是否环绕-1点。
听起来有点绕,但实际用MATLAB实现起来很简单,扫频数据本身就是频域点列,直接在每个频率点上计算Z_g和Y_inv的乘积特征值,然后画成奈奎斯特图就行。
4.2 锁相环负电阻的典型表现形式
如果工程上只需要快速判断风险,很多时候不用把矩阵特征值全部算出来,只看Z_qq和Z_dd的实部就够了。PLL引起的负电阻最典型的表现就是Z_qq在某个频段内实部为负。这个负实部通常在几十赫兹到几百赫兹之间,和PLL带宽绑定。电网感性越强,也就是Lg越大,谐振频率越低,越容易撞上这个负阻频段。
在Bode图上,正常感性滤波器的阻抗相位在+90度附近;当PLL负电阻出现时,Z_qq的相位会跑到-90度以下甚至接近-180度。判断方法可以很粗糙:相位进入“危险区”的频率,配合电网阻抗的幅值,就能粗略预测振荡频率。
当然,严格分析还是要看回比矩阵特征值在奈奎斯特图中的穿越情况。我在仿真里就见过一个模型,Z_qq在120Hz附近实部是负的,但理论上相位裕度还有20多度,实际时域仿真也稳定,只是阻尼偏低。这提醒我们:负阻抗不等于一定失稳,它只说明这一段存在负阻尼能力,是否振荡还要看整个闭环回路的相位关系。
4.3 验证扫频法的正确操作:先扫振点再回代
完整验证流程建议这样做:
先在Simulink时域模型里做一组“极限测试”,比如把Lg从一个较小值逐步增大,观察电流或者PCC电压什么时候开始出现持续振荡。记录振荡频率f_osc,这相当于给扫频法布置了一个“真值任务”。
然后在同一个工作点做扫频,得到扫频阻抗矩阵,计算回比矩阵特征值。如果扫频结果正确,奈奎斯特曲线应该在某个频率点逼近-1点,且对应的频率f_nyq应该和时域振荡频率f_osc非常接近。
再加一步:用理论推导的阻抗模型画同样的曲线,和扫频曲线叠加。两者吻合,说明理论模型从“数学正确”上升到了“工程可用”。我有一次复现中发现,普通一阶惯性环节表示PWM延迟时,高频段能对上,但中频段相位差了好几度;改成1.5拍延迟的准确模型后,扫频曲线和理论曲线几乎重叠。
这种“先扫频、再回代、再对比”的流程,本身就是最好的验证。
5. 实操中常见的坑和排查思路
5.1 仿真时长不足导致低频点曲线稀疏
扫频法在低频段特别耗时间。假设f_scan=1Hz,那一个扫描周期就是1秒,为了提取可靠幅值,至少需要5到10秒的仿真窗口,如果还要避开启动暂态,总仿真时长可能到15秒。步长若取1e-5秒,就是150万个点,虽然Simulink能跑,但确实慢。
我的做法是低频段从2Hz或5Hz开始扫,并且用对数频率间隔,比如2、3、5、7、10、15、20、30……这样每十倍频大约扫10到12个点,既能保证曲线平滑,又不会让总仿真时间失控。对于特别关注1Hz以下的动态,可以单独用更长时间仿真,不要整个频率范围都从1Hz开始。
还有一个小技巧:低频段用平均模型,高频段再切开关模型。平均模型在低频段和高频段都有较好的连续度,开关模型适合验证PWM死区和延迟带来的高频偏差。
5.2 扰动幅值过大导致小信号假设失效
小信号阻抗的前提是扰动足够小,系统工作点几乎不变。如果扰动大到让电流PI输出进入限幅,或者PLL在大角度扰动下非线性跳变,扫频出来的阻抗就会带上明显“谐波尾巴”,提取出的幅值相位也会不对。
排查方法很简单:同一个扫频点,分别用1%、3%、5%三种扰动幅值跑三次,如果算出来的阻抗点几乎重合,说明线性化有效;如果曲线明显分离,就得降低幅值。有些硬件在环测试里为了抗干扰恨不得加到10%,但仿真里完全没必要,1%到3%是最稳妥的范围。
另外,PLL角度扰动还有个特殊麻烦。PLL输入端的扰动如果太大,PLL可能进入非线性跟踪,表现为锁相角发生周期性的“跳动”,此时dq变换参考轴不再是小信号意义下的固定旋转轴,扫频结果不能用于线性稳定性分析。这时候只能先把扰动降下来再说。
5.3 电流正方向符号约定别搞反
扫频阻抗的定义依赖电流正方向。如果仿真里电流传感器规定的是“电网流向逆变器”为正,那么Z = V / I。如果规定“流入电网”为正,那Z = -V / I,符号反了,奈奎斯特曲线整个沿实轴翻转,可能把一个原本稳定的系统判成不稳定。
这个坑非常隐蔽,因为画Bode幅频曲线时,幅值是一样的,只有相位会差180度。很多人单独看幅频曲线发现没问题,一算稳定性就崩溃。建议在模型中给PCC端口加一个明确的电流传感器方向标记,并在后处理脚本里用同一套符号约定。
我在实际项目中见过因为符号约定不同,两个人各自扫频得到的结果相位完全相反,后来一核对才发现模型里电流方向被置反了。这种问题在硬件实验里尤其普遍,因为电流互感器的同名端接反很常见。
5.4 频谱泄漏和开关纹波混叠
即使使用相关积分法,也要求仿真分析窗口内包含整数个扫描周期。相关积分法对非整数倍周期不像FFT那么敏感,但依然建议在提取前做两件事:把直流分量减掉,把窗口时间设置成扫描周期整数倍。
开关模型下,PWM纹波的主要成分在开关频率及其边带附近,与扫频频率点通常不重合。但如果扫描点正好落在开关频率边带附近,提取结果会突然出现一个毛刺。可以把频率点稍微偏移几Hz再扫一次,如果阻抗值立刻正常,说明是混叠,需要避开相应频点。
另外,三相系统在dq坐标下会有6kHz的纹波特征频率,以及由负序扰动引起的2倍基频分量。如果扫描频率接近这个特征量,结果也会变得不可靠。平均模型能规避这些问题,所以再次建议先用平均模型完成整个扫频流程验证。
6. 一点个人经验和后续扩展
做了几轮阻抗建模和扫频验证之后,我的体会是:看再多的推导都不如亲手搭一个最小Simulink系统跑一次。第一次跑通时,你以为最难的是解矩阵,实际上最难的是让扫频曲线在两个频率点之间光滑过渡,以及排查那个“看起来无关紧要”的符号方向。
这个项目后续可以往几个方向扩展。一个是换成LCL滤波器的模型,这时候逆变器高阶特性在中频段变得更明显,电流环前馈处理不好会出现电容电流谐振峰,扫频曲线能很直观地看到阻抗谷点。另一个是加入多机并联场景,两台逆变器通过公共电网阻抗耦合,阻抗矩阵扩展成六阶或更高阶,扫频法依然适用,只是解矩阵的维数增加。
还可以把扫频法搬到实时仿真平台。我后来在硬件在环平台上实现过同样的扫频逻辑,唯一的变化是采样频率和数据传输会受到实时环境限制,但相关性提取的核心算法完全不用改。整个流程给我的感觉是:理论模型帮你定位问题,扫频法帮你验证定位准不准,两者配合才能真正对稳定性分析有底。