我们有源电力滤波器专题先从同步环节讲起。谐波补偿做得好不好,很大程度上取决于能不能在电网畸变、不平衡、频率波动的情况下拿到一个干净、稳定、可用的电网电压相位参考。三相不平衡和低次谐波会直接污染传统锁相环的输出,导致后面电流环参考坐标全部偏移。DSOGI-PLL 就是在这种背景下被广泛使用的一种电网同步方案:它用两个二阶广义积分器对静止坐标系下的电压做正交分解,再提取基波正序分量,最后交给同步旋转坐标系锁相环完成相位锁定。这篇文章把 DSOGI-PLL 的原理和建模过程拆开讲,从 SOGI 单结构的传递函数,到双 SOGI 的正负序分离,再到整个 PLL 闭环搭建,覆盖完整的数学基础和系统设计路径。
这篇文章的重点是“搞懂为什么 DSOGI-PLL 能在有源电力滤波器里抗畸变、抗不平衡”,而不是简单抄一段 Simulink 仿真图。所以内容会偏原理建模,但每一个关键推导都会落到可以操作的控制结构上。适合正在做 APF 谐波抑制、SVG 无功补偿、微电网并网控制,或者电力电子锁相环设计的工程师和学生。如果后续要继续做仿真波形验证、DSP 代码移植和实验台架调测,上半部分把原理搞清楚会轻松很多。
1. DSOGI-PLL 核心能力速览
| 项目 | 说明 |
|---|---|
| 技术方向 | 三相电网同步、基波正序提取、谐波畸变下锁相 |
| 全称 | Dual Second Order Generalized Integrator - Phase Locked Loop |
| 典型应用场景 | 有源电力滤波器、无功补偿装置、并网逆变器、微电网控制 |
| 主要功能 | 生成 αβ 轴正交电压、分离正序与负序分量、输出电网相位和频率 |
| 对 APF 的作用 | 为谐波检测和电流控制提供准确的同步旋转坐标系 |
| 典型控制频段 | 基频 50 Hz / 60 Hz,具体跟所在电网制式有关 |
| 建模工具 | MATLAB/Simulink、PLECS、PSIM 等通用仿真平台均可实现 |
| 实现方式 | 连续域传递函数建模,或离散化后在 DSP / FPGA 中编程实现 |
| 是否需要 GPU 或专用 AI 硬件 | 不需要,算法本身计算量不大,重点在采样周期和实时性 |
从硬件角度看,DSOGI-PLL 不依赖大型计算资源。它需要的是一个固定的控制周期采样,通常与控制电流环的 PWM 频率保持一致。真正影响性能的反而是采样频率、离散化方式、SOGI 中心频率跟踪速度,以及 PI 调节器的带宽设计。后面文章会逐项说明。
2. 为什么有源电力滤波器需要一个高性能同步环节
先看有源电力滤波器的工作方式。
APF 检测负载侧电流,提取出需要补偿的谐波分量和无功分量,然后通过变流器输出一个方向相反、幅值相等的补偿电流,把电网侧电流“校正”成接近正弦。常用的检测方法基于瞬时无功功率理论,或者基于同步旋转坐标系下的 d-q 变换。这两种方法都有一个共同前提:必须知道电网电压或电流的实时相位。
如果电网电压是标准三相对称正弦波,传统 SRF-PLL 足够用。它的思路是把三相电压通过 Clarke 变换转到 αβ 静止坐标系,再通过 Park 变换转到与电网电压矢量同步旋转的 d-q 坐标系。控制目标是把 q 轴电压分量调节到零,这样锁相环输出的角度就能跟踪电网电压矢量方向。
问题出在电网并不是理想源。当负载是非线性负载时,公共连接点电压会产生畸变;当电网发生单相接地、两相不平衡或者负荷不对称时,三相电压幅值不再相等,相位也不再严格相差 120°。这时如果还用标准 SRF-PLL,谐波和不平衡分量会直接叠加到 d-q 轴电压上,PI 调节器无法同时抑制多个频率的扰动,锁相角度就会发生周期性波动。
角度波动对 APF 的影响非常直接。
谐波检测环节会把三相电流变到 d-q 坐标系,如果 θ 本身带误差,d-q 轴之间会出现耦合项,基波分量不能完全被滤除,谐波提取结果里会残留基波成分。补偿电流生成环节同样依赖 θ,θ 的波动会等效为调制信号的相位扰动,最终导致补偿效果变差。更严重的是,电网电压负序分量在 d-q 坐标系里是 100 Hz 的交流量,如果不做处理,它会让锁相环输出产生二倍工频的振荡。许多实验里出现的直流侧电压波动、补偿后并网电流仍有低频纹波,根因并不在电流环,而在同步相位已经不稳。
DSOGI-PLL 要做的事情就是,在电压发生不平衡和谐波畸变时,先把电压里的基波正序分量提取出来,再对这个干净的正序分量做锁相。这样进入 PLL 的信号不是原始电压,而是经过 SOGI 滤波和对称分量分解后的正序基波电压。PLL 只需要跟踪一个近似三相对称、基本无谐波的正序电压矢量,控制难度大幅下降。
3. SOGI 单结构建模:一个滤波器加一个正交信号生成器
DSOGI-PLL 的最小单元是 SOGI,即二阶广义积分器。它本质上是一个工作在特定频率附近的谐振器,输入一个交流信号,输出两个信号:一个与原信号同相,另一个滞后 90°。这个“正交信号生成”特性,是解决单相系统和无中线三相系统中相位提取问题的关键。
对于给定的中心频率 ω0,SOGI 的典型结构可以用两个传递函数描述。
同相输出:
D(s) = v' / v = (k * ω0 * s) / (s² + k * ω0 * s + ω0²)正交输出:
Q(s) = qv' / v = (k * ω0²) / (s² + k * ω0 * s + ω0²)其中:
- v 是输入信号;
- v' 是与 v 同相的输出分量;
- qv' 是滞后 90° 的正交分量;
- k 是阻尼系数,决定滤波器带宽和动态响应速度;
- ω0 是中心角频率。
如果输入信号频率正好等于 ω0,可以算出 D(s) 的增益接近 1,相位接近 0;Q(s) 在 ω0 处的相位滞后 90°,且仍能保持一定幅值。频率偏离 ω0 越远,D(s) 和 Q(s) 的输出幅值越小。SOGI 因此也具备带通滤波能力。它的优点是不需要设计高阶 FIR 或 IIR 滤波器,只用了两个积分环节就能在基频附近形成选频特性,特别适合在数字控制器里逐周期迭代计算。
从 Simulink 建模的角度看,SOGI 可以拆成三个基本运算块:比例放大器、误差求和、两个积分器。典型实现方式是把式中的微分方程转写成积分形式,在仿真中直接用 Integrator 模块搭出来。输入信号与同相输出做差,得到误差信号;误差乘上 k 后加到一个积分通道和中心频率负反馈通道,构造出谐振结构。
阻尼系数 k 的选择有明显工程含义。
k 越大,SOGI 的带宽越宽,动态响应越快,但滤波效果越差。k 越小,带宽越窄,对谐波的抑制能力越强,但输入频率发生偏移时,SOGI 的输出幅值和相位误差会变大。很多文献给出的折中范围在 k = 1.2 ~ 1.8 之间。实际设计时不能单独盯着 SOGI 想问题,还要考虑整个锁相环的带宽。如果 PLL 环路本身很慢,SOGI 响应太快也没有意义;如果 SOGI 选频太窄,在电网频率波动明显的场合就容易出现相位误差。
4. DSOGI 结构:双通道正交分解与正负序分离
三相系统做同步控制时,第一步通常是把 abc 三相量变换到 αβ 静止坐标系。
假设三相电网电压为 Va、Vb、Vc,采用等幅值 Clarke 变换:
vα = (2/3) * (Va - (1/2) * Vb - (1/2) * Vc) vβ = (2/3) * ((√3/2) * Vb - (√3/2) * Vc)在没有零序分量的三相三线系统中,αβ 轴上的电压仍然同时包含正序分量和负序分量。DSOGI 的做法是,先对 vα 做一次 SOGI 滤波,得到同相分量 vα' 和正交分量 qvα';再对 vβ 做一次 SOGI 滤波,得到 vβ' 和 qvβ'。然后通过矩阵运算,把正序和负序分量分离开。
在标准推导中,正序分量可以表示为:
vα+ = 0.5 * (vα' - qvβ') vβ+ = 0.5 * (qvα' + vβ')负序分量可以表示为:
vα- = 0.5 * (vα' + qvβ') vβ- = 0.5 * (-qvα' + vβ')这里的 q 表示对信号施加 90° 滞后运算。在 SOGI 中,实际输出的正交分量 qvα' 和 qvβ' 正好承担了这个功能。
这组公式的意义在于,它把原本混叠在 αβ 坐标系中的正序和负序信息解耦了。平衡正序电压经过 Clarke 变换后,vβ 和 vα 之间存在固定相位关系;不平衡电压加入负序后,叠加在 vα、vβ 上的负序分量方向与正序相反。通过上述矩阵组合,两个通道的输出一相加,负序干扰被抵消,正序被保留;另一种组合方式则反过来保留负序,抵消正序。
对 APF 而言,负序分量并不总是需要滤除。某些补偿目标要求同时补偿负序电流,这时 DSOGI-PLL 提取负序分量的能力反而成了优势。比如不平衡负载补偿时,可以用同样的结构把负序电流的幅值和相位算出来,作为补偿指令的一部分。
再把上述输出经过 Park 变换转到 d-q 旋转坐标系:
vd+ = vα+ * cos(θ) + vβ+ * sin(θ) vq+ = -vα+ * sin(θ) + vβ+ * cos(θ)理想情况下,正序电压的 d 轴分量接近常数,q 轴分量为零。实际中由于电网频率偏移、滤波器相位误差、采样延迟等因素,q 轴不会严格为零,这就是后面 PLL 闭环要处理的误差。
从模块化角度看,DSOGI 并不是特别复杂的结构。两个 SOGI 通道之间除了中心频率共享,相互没有强耦合。这样带来的好处是,在数字信号处理器里可以把两个通道写成一个通用子函数,用同一套系数计算两次,节省程序空间。坏处是如果两个通道的滤波参数不一致,就会在正负序分离结果中引入额外的不对称,所以实际工程中要保证两个 SOGI 使用完全相同的离散化系数。
5. PLL 闭环建模:从正交分量到相位输出
DSOGI 的输出并不能直接当作相位信号。它得到的是 αβ 静止坐标系下的基波正序电压分量。要得到控制需要的电网相位 θ,还要再经过一个同步旋转坐标系锁相环。
整个 DSOGI-PLL 闭环可以划分为两个层级。
第一层是 SOGI 谐振频率的调整。SOGI 的中心角频率 ω0 如果固定为 314.159 rad/s,当电网频率偏离 50 Hz 时,SOGI 输出就会出现幅值和相位误差。因此实际设计中通常把 PLL 估计出的角频率反馈到 SOGI 中心频率端口,让 SOGI 始终跟随真实电网频率。这个功能可以单独做成一个锁频环 FLL,也可以直接把 PLL 输出频率反馈回去。
第二层是相位锁定。将正序电压 vα+、vβ+ 经过 Park 变换后,得到 vq。利用 vq 作为误差信号,经过 PI 调节器修正角频率,再对修正后的角频率积分得到相位 θ:
ω_est = ω_ff + Kp * vq + Ki * ∫vq dt θ = ∫ω_est dt其中 ω_ff 是前馈频率,通常取电网额定角频率;Kp 和 Ki 是 PI 调节器参数。
把这三个部分画成信号流就是:三相电压进入 Clarke 变换,得到 vα、vβ;两个 SOGI 分别滤波,得到各自正交量;DSOGI 矩阵运算得到正序分量;Park 变换将正序电压转到 d-q 轴;vq 送入 PI;PI 输出校正频率;频率积分得到 θ;θ 既作为 Park 变换的旋转角度,也作为 APF 后级控制的同步角度。
从控制理论角度看,PLL 是一个非线性闭环系统,因为 Park 变换里包含 sin 和 cos 项。但在锁相点附近,sin 项可以近似为线性小信号,因此可以把整个环路近似成二阶线性系统来设计 PI 参数。设计目标是让 vq 动态过程快速收敛,同时要抑制谐波和负序残余造成的脉动。PI 带宽越高,动态响应越快,但对高次扰动的抑制能力越差;带宽越低,抗干扰能力越强,但动态响应变慢。
实际建模中需要特别注意的是,不能只单独调 PI 参数。SOGI 的滤波效果、中心频率反馈路径、Park 变换里的计算延迟共同影响整个环路稳定性。如果离散化步长较大,或者算法执行时有明显延迟,需要引入延迟补偿,否则在高带宽设计下容易震荡。
6. 仿真建模与效果验证思路
本文上半部分虽然以原理推导为主,但原理必须落到仿真结构上才能验证。如果是在 MATLAB Simulink 中搭建 DSOGI-PLL,建议按照下面几个步骤组织模型。
第一步,建立三相电源和负载。电源可以先用理想三相电压源,并在电压源内部加入 5 次、7 次谐波和三相不平衡幅值设置,用于模拟 APF 应用中的恶劣电网条件。负载部分则可以用三相不控整流桥加感性负载,这样会产生典型的 6k±1 次谐波电流。
第二步,搭建 Clarke 变换和 Park 变换。使用 Simulink 标准库中的数学运算模块或者自己写 S-Function。如果使用 MATLAB 2019 之后的版本,可以配合 Simscape Electrical 里的三相锁相环模块先做参照,但自建模型能更清楚地看到内部变量。
第三步,搭建两个 SOGI 模块。可以把 SOGI 封装成子系统,然后复制两次,一个输入 vα,一个输入 vβ。为了后续测试方便,把 SOGI 中心频率端口引出,方便接频率反馈。
第四步,加入正负序分离矩阵模块,计算 vα+、vβ+。
第五步,将 vα+、vβ+ 接到 Park 变换模块,取出 vq,再经 PI 调节器和积分环节输出 θ。
为了便于批量测试不同的电网畸变条件,可以将电源谐波参数和三相不平衡参数设置成 MATLAB 工作区变量,然后用脚本循环仿真。一个最基础的批处理脚本模板如下:
% DSOGI-PLL 仿真批处理示例 % 将谐波含量、不平衡度放入工作区,循环运行 Simulink 模型 modelName = 'dsogi_pll_demo'; harmonicCases = [0.05, 0.1, 0.15]; % 5次谐波幅值占比 unbalanceCases = [0.0, 0.1, 0.2]; % 不平衡程度 for m = 1:length(harmonicCases) for n = 1:length(unbalanceCases) h5 = harmonicCases(m); ub = unbalanceCases(n); simOut = sim(modelName, 'StopTime', '0.5'); vqData = simOut.vq.Data; thetaData = simOut.theta.Data; fprintf('h5=%.2f ub=%.2f vq波动=%.2f V\n', ... h5, ub, max(abs(vqData)) - min(abs(vqData))); end end这样一个脚本能快速评估不同畸变程度下锁相环的稳态误差。
如果不想用 Simulink,想直接用代码验证原理,可以用下面这个离散化版本的结构作为参考。它演示的是每个采样周期内 SOGI 子系统的更新方式,并不是完整生产代码,但可以帮助理解数字实现流程。
function [v_alpha_1, qv_alpha_1, v_beta_1, qv_beta_1] = dsogi_update(...) % 示意代码,实际使用时需要按离散化方法和采样时间调整参数 % 输入为上一个周期的状态量和当前采样点 vAlpha, vBeta % 输出为 SOGI 滤波后的同相分量与正交分量 vAlpha = 1; % 示例值,替换为真实采样值 vBeta = 0; % 示例值,替换为真实采样值 Ts = 1 / 10000; % 采样周期,按实际控制频率设置 w0 = 2 * pi * 50; % 中心频率 % 这里需要写入你实际的 SOGI 离散方程组 % 不同离散化方式对应不同系数,避免直接复用未验证的整型差分式 v_alpha_1 = 0; qv_alpha_1 = 0; v_beta_1 = 0; qv_beta_1 = 0; end这里刻意没有填充具体的离散差分系数。原因是 SOGI 的离散化跟采样频率、积分器实现方式、是否使用 Tustin 变换都有关。不同文献给出的系数格式并不统一,如果直接抄某一个固定系数,很容易在换系统后失效。真正规范的做法是先确定采样周期和离散化方法,再得到差分方程,然后写函数或生成嵌入式代码。
7. 实时控制器实现:采样频率、计算量与离散化
DSOGI-PLL 最终要落到实际控制器里。常见实现平台是数字信号处理器或者 FPGA。与 Simulink 离线仿真不同,实时控制里每个采样周期只能执行一次整套算法,因此需要认真评估计算量和离散化误差。
从计算量角度看,每个采样周期需要完成:
- 一次 Clarke 变换:约 3 到 4 次乘法;
- 两次 SOGI 离散差分:约 8 到 12 次乘法;
- 正负序矩阵运算:约 8 次乘法;
- 一次 Park 变换:约 4 到 6 次乘法;
- PI 调节和频率积分:约 4 到 6 次乘法。
整个算法加起来大约几十次乘加运算,对现代 DSP 来说负载很低。但与算法本身相比,真正影响结果的是采样点与 PWM 中断的时序关系。如果采样点靠近开关切换瞬间,电压和电流信号里会混入大量开关毛刺,SOGI 的滤波效果再好,也无法完全消除采样误差造成的高频扰动。
离散化方式也需要特别关注。同一套连续域传递函数,用 Euler 法、Tustin 法和零极点匹配法离散化后,在偏离中心频率处的频率响应会有差异。尤其当采样频率只比基频高几十倍时,差异会更明显。高频采样条件下差异可以忽略;当控制频率只有几 kHz 时,就不能再拿连续域公式计算 SOGI 增益,必须使用离散域设计。
最好的做法是在仿真里把控制器部分也用离散模块搭建,固定采样周期。这样可以暴露离散化带来的相位滞后,提前评估这种滞后对 PLL 带宽的影响。
DSOGI 中心频率反馈路径同样需要注意时序问题。如果 PLL 输出频率更新速度远低于 SOGI 执行速度,会出现频率跟踪滞后。频率跟踪滞后在稳态下不影响最终相位,但在电网频率突变时会增加动态调节时间。工程上通常让 PLL 环路带宽略低于 SOGI 中心频率跟踪环路的带宽,避免两个环路互相激励。
8. 常见问题与排查方法
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 锁相角度存在二倍频波动 | 电网电压负序分量未完全滤除 | 查看 DSOGI 输出的 vα+、vβ+ 波形中是否存在负序残留 | 检查 SOGI 两路参数是否一致,确认正负序分离矩阵接线正确 |
| 电网频率偏移时相位误差明显 | SOGI 中心频率固定,未跟随频率变化 | 查看 SOGI 中心频率输入端是否接入 PLL 估计频率 | 将 PLL 输出频率反馈到 SOGI 中心频率,或改用 FLL |
| SOGI 响应太慢,动态过程拖长 | k 值取得过小 | 对比不同 k 值下输出阶跃响应 | 在滤波效果和动态速度之间重新调节 k |
| PLL 环路震荡,锁不住相位 | PI 参数带宽过高或算法延迟未补偿 | 用小信号模型分析开环增益和相位裕量 | 降低 PLL 带宽,增加延迟补偿,或减小仿真/控制周期 |
| 仿真结果与离散化代码结果不一致 | 仿真使用连续模块,代码使用离散差分 | 对比同一输入信号下两者的 SOGI 输出曲线 | 将仿真模型改为离散模块,使用与 DSP 一致的采样周期 |
| 不平衡工况下正序结果仍含负序 | Clarke 变换或矩阵运算中符号错误 | 单独输入已知正序和负序电压,检查矩阵输出 | 用平衡正序信号验证矩阵,确认公式展开正确 |
9. 参数设计与工程化建议
DSOGI-PLL 的参数不是一个孤立的“调 PI”问题,而是需要把 SOGI 系数、PLL 带宽、采样频率和负载特性放在一起考虑。
先从 SOGI 阻尼系数 k 入手。建议先用 k = 1.5 附近的值做初版仿真,观察输出信号在电压跌落或者谐波突变后的恢复时间。如果输出振荡小但跟踪慢,可以适当增大 k;如果跟踪快但波形振荡明显,则减小 k。
然后是 PLL 的 PI 参数。可以先把 PLL 环路近似成线性系统,根据期望的闭环带宽和阻尼比计算初始 PI。比如工程设计里常把 PLL 闭环带宽设定在 10 Hz 到 30 Hz 之间。带宽太低,电网频率突变时角度恢复慢;带宽太高,谐波和不平衡扰动容易穿过 SOGI 滤波层进入角度输出。
三是对着实际负载电流波形调节。APF 应用里 DSOGI-PLL 的输出不只是给锁相内部使用,还要给谐波检测和电流环使用。建议在电流环闭环前,先用 PLL 输出角度观察 d-q 轴电流波形。如果 d-q 轴电流里存在明显 100 Hz 波动,即使锁相角度波形看起来很好,也要怀疑是不是 PLL 与电流环之间存在采样延迟或离散化滞后。
工程实现上建议分类保存参数。SOGI 参数、PLL 参数、采样控制周期、滤波系数分开写到配置头文件或 MATLAB 初始化脚本中。调参时只修改单一变量,不要随手改公式内部常数。这样做的好处是,当仿真波形异常时,能快速还原出到底是参数漂了还是模型连接出错了。
以下是一份最小可运行配置的初始脚本示例,里面所有参数都可以放到模型初始化里集中管理。这个文件的结构比具体数值更重要,实际数值需要结合你的采样频率和控制目标重新计算。
% DSOGI-PLL 参数初始化脚本 % 按实际系统修改以下参数 fs = 10000; % 采样/控制频率 Hz f0 = 50; % 额定基频 Hz w0 = 2 * pi * f0; % 中心角频率 rad/s k_sogi = 1.5; % SOGI 阻尼系数,先取 1.2~1.8 之间尝试 % PLL 初始 PI 参数,带宽和阻尼比按小信号模型计算 Kp_pll = 80; % 比例增益 Ki_pll = 1500; % 积分增益 % 数据处理长度 N = 1000; evalin('base', sprintf('fs = %d;', fs)); evalin('base', sprintf('f0 = %d;', f0)); evalin('base', sprintf('w0 = %.6f;', w0)); evalin('base', sprintf('k_sogi = %.3f;', k_sogi)); evalin('base', sprintf('Kp_pll = %.3f;', Kp_pll)); evalin('base', sprintf('Ki_pll = %.3f;', Ki_pll));代码里使用 evalin 写入基础工作区,主要是为了方便 Simulink 模型里的变量直接可见。如果使用 Simulink 的 Data Dictionary,也可以把参数放到.sldd文件中,后续做批量仿真时用代码统一修改。
10. 总结与下一步
DSOGI-PLL 的价值在于,它把“畸变电压下的正序基波提取”和“频率相位锁定”整合成了一个控制流程:SOGI 负责选频和正交生成,DSOGI 负责正负序分离,PLL 负责最终锁相。三部分层层递进,每一层都有明确的数学模型。对有源电力滤波器来说,这套结构显著改善了不平衡和谐波工况下的同步质量,也直接补偿了后面电流环和电压环的工作可靠性。
这篇文章作为专题上半部分,已经把原理和建模链条完整覆盖:SOGI 的传递函数、q 运算的含义、双通道矩阵分离公式、PLL 闭环结构,以及从 Simulink 到 DSP 实现的关键差异。下一步最值得做的事,是先搭一个包含 5 次、7 次谐波和三相不平衡电源的仿真模型,用平衡正序输入验证 SOGI 和 DSOGI 矩阵输出,再加上 PLL 闭环,观察不同畸变程度下 vq 波形和 θ 波形。
最容易踩的坑也在前面提醒过了:一是公式里的符号方向,二是连续域与离散域的差异,三是 SOGI 频率没有真正做到自适应。如果能先把这三个问题在仿真里验证清楚,后面做硬件在环或者 DSP 实验时会少走很多弯路。建议先收藏这篇,再按第三节到第六节把模型逐层搭起来。