
1. 项目背景与核心问题最近在做一个单相并网逆变器的项目客户对功率因数有硬性要求希望设备在并网运行时电网侧能呈现一个接近1的、稳定的功率因数。这听起来是个常规需求但实际做起来特别是用传统的双环PI控制总会遇到一些挠头的问题比如电网电压波动时电流跟踪的快速性和稳定性难以兼顾又比如在轻载或者非线性负载扰动下功率因数会漂移。为了解决这些问题我开始研究一种基于同步旋转坐标系d-q轴的控制策略也就是标题里提到的“不平衡d-q控制”。这个思路在理论上很优美它能把交流量转换成直流量来处理PI调节器的设计会简单很多。但单相系统天生只有一相怎么构建出虚拟的、正交的两相系统来套用这个强大的d-q理论就成了第一个要跨过去的坎。我选择在Simulink里搭建这个仿真模型原因很简单它可视化强能快速验证控制算法的逻辑是否正确参数是否合理而不用一开始就烧写代码、折腾硬件效率高得多。这个仿真的核心目标就是实现一个“单相统一功率因数变流器”或者叫单相电压源型逆变器VSI让它能以恒定的、接近1的功率因数向电网馈电或从电网取电。这里的“统一功率因数”我的理解是无论变流器运行在整流模式从电网取电还是逆变模式向电网馈电其交流侧的电压和电流都能始终保持同相位或反相位功率因数恒定且可调比如要求运行在0.9滞后或超前而不仅仅是简单的单位功率因数。2. 单相系统d-q变换的理论基石与实现三相对称系统的d-q变换Park变换大家都很熟悉了通过Clark变换和Park变换能把静止坐标系下的三相交流量转换到与电网电压同步旋转的d-q坐标系下此时基波正序分量就变成了直流量。但对于单相系统我们只有一路物理信号比如电网电压ug和逆变器输出电流ig。直接应用Park变换是行不通的因为我们需要一个正交的β分量。2.1 构造虚拟正交信号这是整个控制策略的起点。常见的方法有几种希尔伯特Hilbert变换在频域上对原始信号进行-90°的相移能精确产生正交信号但实时计算需要设计滤波器在离散系统中实现有一定复杂度。延时四分之一周期法这是最直观也最常用在仿真和低速数字控制中的方法。假设电网基波频率为fg周期为Tg。那么将原始信号延时Tg/4得到的就是其正交信号。例如ug Um * sin(ωt)那么其正交分量可以构造为ug_orth Um * sin(ωt - π/2) -Um * cos(ωt)。在Simulink中用一个Transport Delay模块设置延时时间为1/(4*50) 0.005秒针对50Hz电网即可。基于二阶广义积分器SOGI的正交信号发生器QSG这是一种更鲁棒、动态性能更好的方法。SOGI-QSG本质上是一个具有频率自适应能力的带通滤波器它能从输入的单相信号中同时生成两个输出一个与原信号同相v一个正交qv。它对电网频率的微小波动不敏感抗干扰能力比纯延时法强。在我的Simulink模型里我优先采用了SOGI-QSG方案。因为它不仅能生成高质量的正交信号其本身的结构通常由两个积分器构成也便于在离散域实现为后续实际DSP编程打下基础。SOGI的核心传递函数和Simulink实现通常围绕一个中心频率ω可设置为额定电网角频率和一个增益系数k来搭建。k值影响带宽和响应速度需要折中选取。2.2 执行Park变换一旦我们有了α-β坐标系下的两相分量[ug_α, ug_β]和[ig_α, ig_β]就可以进行Park变换了。变换需要同步旋转角θ这个角度由锁相环PLL从电网电压ug中实时获取。一个经典的单相PLL结构也是基于SOGI-QSG或者延时法构造正交信号然后使用基于d轴定向的PLL即让d轴与电网电压矢量对齐。这样变换公式如下[ud, uq]^T T(θ) * [ug_α, ug_β]^T[id, iq]^T T(θ) * [ig_α, ig_β]^T其中T(θ) [cosθ, sinθ; -sinθ, cosθ]当PLL锁相准确时电网电压矢量被完全定向到d轴上因此理论上uq 0ud等于电网电压的幅值。这是我们设计控制器时的一个重要前提。3. 不平衡d-q控制器的设计与功率解耦在d-q同步旋转坐标系下单相VSI的数学模型可以推导出来。其交流侧的状态方程经过变换后d轴和q轴的电流分量会存在耦合项形式为ωL * iq和-ωL * id其中L是滤波电感ω是电网角频率。这就是所谓的“交叉耦合”。如果不处理这个耦合直接用两个独立的PI调节器去分别控制id和iq动态性能会大打折扣因为调节id时会干扰iq反之亦然。3.1 电流内环设计解耦与PI参数整定“不平衡d-q控制”中的“不平衡”我理解在这里并非指系统不对称而是指控制策略通过引入前馈解耦使d轴和q轴电流可以实现独立、快速的跟踪。控制器结构通常是这样的给定值计算id_ref和iq_ref由外环通常是直流电压环给出。对于功率因数控制iq_ref直接与无功功率指令相关。若要运行在单位功率因数则设iq_ref 0。若要运行在某一固定功率因数如0.9滞后则需要根据有功功率指令和功率因数角计算出iq_ref。PI调节器id和iq分别与各自的参考值比较误差送入PI调节器。PI输出分别为vd_pi和vq_pi。前馈解耦在PI输出上加上耦合项的前馈补偿和电网电压前馈。最终生成d-q坐标系下的调制电压指令vd*和vq*。vd* vd_pi - ωL * iq udvq* vq_pi ωL * id uq其中ud和uq是电网电压的d-q分量理想锁相下uq0。加入ud前馈可以大大提高系统对电网扰动的抵抗能力。在Simulink中这个控制结构非常清晰。我用两个PID Controller模块设置为PI模式作为电流调节器。解耦项ωL * iq和ωL * id用Gain和Sum模块实现。电网电压前馈ud和uq则直接从PLL和变换模块后引出。3.2 PI参数整定的工程方法这是仿真调试的核心。我通常采用“零极点对消”的思路进行初步设计再通过仿真微调。被控对象考虑解耦和电压前馈后可以简化为一个一阶惯性环节Gp(s) 1 / (Ls R)其中R是滤波电感的等效电阻和线路电阻。将PI调节器设计为Gc(s) Kp Ki/s Kp * (1 1/(Tn*s))其中Tn Kp/Ki。令Tn L/R实现零点对消极点。则开环传递函数变为Gol(s) Kp / (Ls)。这是一个积分环节。根据所需的电流环带宽BW_i通常取开关频率的1/10到1/5来设计Kp。对于积分环节穿越频率ωc ≈ Kp/L。令ωc 2π * BW_i则可求得Kp L * ωc。Ki Kp / Tn Kp * R / L R * ωc。例如我的仿真参数L5mH,R0.1Ω希望电流环带宽BW_i1000Hz则ωc6283 rad/s。计算得Kp 0.005 * 6283 ≈ 31.4Tn 0.005/0.10.05sKi 31.4 / 0.05 628。在Simulink中将这些值填入PI模块作为初始参数。实操心得理论计算值只是一个起点。实际仿真中由于PWM延时、计算延时、采样保持等因素需要适当降低Kp、增加Ki即减小Tn来保证稳定裕度。我通常会先设一个较小的Kp比如计算值的一半然后慢慢增加观察电流阶跃响应的超调和稳定时间直到获得满意的动态性能。4. Simulink模型搭建与关键模块剖析我的仿真模型主要分为几个子系统主电路、信号检测与生成、PLL、坐标变换、电流控制器、PWM生成。下面挑几个关键部分说说我的实现和踩过的坑。4.1 主电路与PWM生成主电路就是一个单相全桥H桥逆变器通过LC滤波器连接到电网。直流侧用一个直流电压源模拟。PWM采用双极性调制或单极性倍频调制我选择了后者因为它的谐波特性更好等效开关频率高一倍。在Simulink中使用PWM Generator模块可以方便地生成四路驱动信号。这里第一个坑来了PWM Generator模块的载波三角波频率设置必须和你的求解器步长匹配。如果开关频率是fsw 10kHz那么仿真步长Fixed-step size至少要比1/(2*fsw) 5e-5s小一个数量级比如设为1e-6s或5e-6s否则会丢失PWM细节导致仿真结果失真甚至出错。我通常选择离散求解器如ode4 Runge-Kutta固定步长并开启“代数环”的加速选项。4.2 SOGI-QSG与PLL的实现我用Simulink基本模块增益、积分器、求和搭建了一个标准的SOGI-QSG。其状态方程是dx/dt A*x B*uy C*x需要将其离散化前向欧拉或双线性变换后用Unit Delay模块实现。这里第二个坑离散化的采样时间必须和整个控制系统的采样时间一致。如果PWM和电流环计算是10kHz那么SOGI和PLL的离散计算周期也应该是0.1ms。如果用了连续积分器而仿真步长又不够小很容易导致数值不稳定。PLL我采用基于SOGI的SPLL单相锁相环。它内部也包含一个PI调节器用于调节q轴电压理论上应为0来跟踪电网频率。这个PI的参数需要单独整定要求是动态响应快但比电流环慢且超调小否则锁相角度抖动会直接影响整个电流控制性能。4.3 坐标变换与调制波生成d-q坐标系下计算出的vd*和vq*需要反Park变换回α-β静止坐标系[vα*, vβ*]^T T(-θ) * [vd*, vq*]^T对于单相全桥我们只需要α轴分量vα*作为调制波因为β轴是虚拟的。这个vα*需要除以直流母线电压Vdc进行归一化得到标幺值范围应在-1到1之间然后送入PWM Generator的调制波输入端。这里第三个坑也是最大的一个坑调制波限幅。在动态过程中特别是启动、负载突变时电流调节器可能会输出很大的vd*和vq*导致vα*幅值超过Vdc。如果不加限幅归一化后的调制波幅值就会超过1导致PWM过调制实际输出的电压达不到指令值控制环会饱和甚至失稳。我的经验是必须在反Park变换后、归一化前对vα*和vβ*进行幅值限幅。一个简单的“幅值限幅”方法是计算指令电压矢量的幅值Vmag sqrt(vα*^2 vβ*^2)如果Vmag Vdc考虑到最大线性调制通常取Vdc/√2或Vdc/√3作为限幅值对应SPWM或SVPWM的最大线性调制比则按比例缩小vα*和vβ*vα*_limited vα* * (Vlim / Vmag)对vβ*同理。在Simulink中可以用Fcn模块或MATLAB Function模块实现这个逻辑。5. 仿真结果分析与问题调试搭建好模型设置好参数电网电压220V/50Hz直流母线电压400V滤波电感5mH滤波电容10uF开关频率10kHz就可以开始仿真了。5.1 稳态性能验证启动仿真待系统进入稳态后观察波形电网电压与电流ug和ig应该同相位单位功率因数或保持一个固定的相位差固定功率因数。用Simulink的Powergui工具进行FFT分析电流的总谐波畸变率THD应低于5%并网标准通常要求5%。d-q轴电流id和iq应该能很好地跟踪各自的参考值id_ref和iq_ref。稳态时应该基本为两条直线直流量波动很小。直流母线电压如果外环是电压环直流电压应稳定在给定值。5.2 动态性能测试与问题排查这是检验控制器鲁棒性的关键。我通常会做以下几个测试参考电流阶跃在某一时刻突然改变id_ref模拟有功功率指令变化或iq_ref模拟无功功率指令变化。观察id/iq的跟踪速度、超调量和稳定时间。如果响应振荡或超调过大需要回调电流内环的PI参数通常是减小比例增益Kp。电网电压跌落模拟电网电压突然下降10%-20%。观察系统能否保持稳定电流能否快速调整。如果出现大幅振荡可能是电网电压前馈ud的作用不够强或者PLL在电压跌落时锁相出现偏差。需要检查PLL的动态性能。负载突变改变直流侧的负载电阻。观察直流电压的波动和恢复时间如果有电压外环以及交流电流的响应。如果恢复慢可能是电压外环的PI参数太保守。我在调试中遇到的一个典型问题启动时电流冲击很大。原因和解决仿真开始时所有状态变量为0但PLL需要时间锁定坐标变换的角度θ从0开始变化。而电流内环的积分器在启动瞬间误差很大会迅速积分饱和输出很大的调制波导致过流。解决方案软启动让id_ref和iq_ref从0缓慢斜坡上升至目标值给控制系统一个缓冲时间。积分抗饱和在PI调节器中启用积分抗饱和anti-windup功能。Simulink的PID Controller模块可以设置输出限幅和抗饱和反馈增益。当输出饱和时抗饱和回路会削弱或停止积分作用防止积分器“windup”。初始化尽量为积分器模块如PLL的积分器、PI调节器的积分部分设置一个合理的初始值比如让PLL角度初始值等于电网电压的初相角。6. 从仿真到实际工程的思考Simulink仿真跑通只是万里长征第一步。要把这个算法移植到实际的DSP如TI C2000系列中还需要考虑很多工程细节离散化仿真中可能是连续模型或大步长离散。实际芯片中所有控制算法必须严格以采样周期Ts离散执行。需要将SOGI、PLL、PI调节器、坐标变换的公式全部用离散差分方程表示。PI调节器常用位置式或增量式公式实现。计算延时与补偿从采样电流到更新PWM占空比存在一个采样、计算、更新的延时通常为1.5个开关周期。这个延时会在控制环路中引入相位滞后影响稳定性。在离散域设计控制器时需要将这个延时e^{-1.5Ts*s}考虑进去或者在实际输出PWM时进行一拍超前补偿。参数辨识与自适应仿真中的电感L、电阻R是理想值。实际电路中这些参数会随温度、电流变化且存在误差。可以考虑在线参数辨识算法或者将控制器设计得对参数变化有一定鲁棒性这也是为什么仿真中PI参数需要留有余量。保护机制过流保护、直流母线过欠压保护、电网过欠压/过欠频保护等必须在软件中可靠实现。仿真时往往忽略这些但实际产品中这是安身立命之本。这个基于不平衡d-q控制的单相统一功率因数变流器仿真模型为我提供了一个强大的设计、验证和调试平台。它让我清晰地看到了理论如何转化为控制信号参数如何影响动态响应以及各种非理想因素可能带来的挑战。虽然离真正的产品还有距离但有了这个扎实的仿真基础后续的代码编写和硬件调试就有了明确的方向和信心。