1. 单相PWM整流器到底在做什么
先把话说直白一点:单相PWM整流器本质上就是一个“能反向工作的整流桥”。普通二极管整流桥只能把交流变成直流,电流波形是脉冲状的,功率因数低、谐波大。而PWM整流器用全控器件(MOSFET或IGBT)代替二极管,通过高频开关和合适的调制策略,让网侧电流跟踪网侧电压,实现单位功率因数运行,同时母线电压可调、能量可以双向流动。
我第一次接触这个拓扑是在做车载充电机项目的时候,当时需要一台能实现AC-DC双向变换的实验平台,功率等级3kW左右,母线电压400V。选来选去,单相全桥PWM整流器是最合适的入门拓扑——结构简单、控制逻辑清晰、Simulink里搭建起来也快。后来发现这套模型稍加改动就能用于储能变流器(PCS)的并网侧控制,实用性很强。
这篇文章面向的是电力电子方向的学生、刚入行的工程师,以及需要快速搭建仿真验证控制算法的朋友。我会从模型整体架构讲起,把SVPWM在单相里的特殊处理方式说透,然后一步步给出Simulink搭建过程、参数计算、调试技巧和踩坑记录。所有参数和步骤都经过实际验证,你可以直接照着复现。
注意:单相SVPWM和三相SVPWM在实现上有本质区别,网上很多资料把三相那套直接搬过来,结果跑不通。后面我会专门讲这个点。
2. 整体模型架构与控制思路拆解
2.1 为什么选双闭环加SVPWM的结构
单相PWM整流器的控制目标有三个:第一,维持直流母线电压恒定;第二,让网侧电流正弦化且与电压同相位;第三,动态响应要快。要同时满足这三点,最经典也最可靠的结构就是电压外环+电流内环的双闭环控制。
电压外环的作用是稳压。它采集母线电压,与给定值比较后经过PI调节器,输出一个电流幅值指令。这个指令的物理含义是:负载消耗了多少能量,就从电网抽取多少能量补回来。电流内环则负责快速跟踪这个指令,同时保证电流波形质量。
那为什么调制环节选SVPWM而不是SPWM?这里有几个实际考量。SPWM实现简单,但直流电压利用率只有0.866(相对于SVPWM的1.0),意味着同样的母线电压下,SVPWM能输出更高的交流电压。对于单相全桥,SVPWM还能更灵活地安排零矢量位置,降低开关次谐波。实测下来,同样开关频率下SVPWM的电流THD比SPWM低2到3个百分点。
不过要说明的是,单相系统只有两个桥臂、四个开关管,它的“空间矢量”概念和三相不同。三相有8个基本矢量构成六边形,单相实际上只有4种有效开关状态,对应电压矢量在一条直线上。所以单相SVPWM更多是借用“矢量作用时间计算”的思路来做脉宽分配,本质上是载波调制的一种变形。
2.2 单相全桥的四种开关状态
先把开关状态理清楚。单相全桥有左右两个桥臂,每个桥臂上下管互补导通(要留死区)。定义开关函数:
- S1、S4导通,S2、S3关断:交流侧输出电压为+Udc
- S2、S3导通,S1、S4关断:交流侧输出电压为-Udc
- S1、S3导通 或 S2、S4导通:交流侧输出电压为0(零矢量)
所以总共4种有效状态,对应电压矢量+Udc、-Udc和两个零矢量。在一个开关周期内,通过分配这几种状态的作用时间,就能合成出想要的平均电压。这就是单相SVPWM的核心逻辑。
2.3 关键参数计算与选型依据
在动手搭模型之前,有几个参数必须先算清楚,否则仿真跑起来要么发散要么波形难看。
直流母线电压:对于单相220V交流输入,峰值电压约311V。要保证整流器能控制电流,母线电压必须高于交流峰值。一般取1.2到1.5倍裕量,我通常选400V。如果做储能双向变换,母线电压还要考虑电池侧电压范围,这里按400V设计。
开关频率:仿真里常用10kHz,实际硬件可能选20kHz。开关频率越高,电流纹波越小,但开关损耗越大。仿真阶段10kHz足够,步长设1e-6秒。
交流侧电感:这个参数直接决定电流纹波大小。计算公式为:
L = (Udc × Ts) / (4 × ΔI_max)
其中Ts是开关周期(10kHz对应100微秒),ΔI_max是允许的最大电流纹波,一般取额定电流的20%。假设额定电流15A,纹波取3A,代入得L ≈ (400 × 100e-6) / (4 × 3) ≈ 3.3mH。实际取3mH左右。
直流侧电容:主要抑制母线电压纹波。经验公式:
C = I_load / (2 × ω × ΔUdc)
负载电流10A,电网角频率314rad/s,允许电压纹波5V,算下来C ≈ 10 / (2 × 314 × 5) ≈ 3185μF。仿真里取3300μF。
这些参数不是拍脑袋来的,每个都有物理依据。电感太小电流纹波大,太大会导致电流跟踪变慢;电容太小母线电压波动大,太大会增加成本和体积。
3. Simulink模型搭建全流程
3.1 主电路搭建与器件选择
打开Simulink,新建一个Blank Model。主电路部分需要以下模块:
- 交流电源:Simscape Electrical里的AC Voltage Source,设置峰值311V、频率50Hz
- 网侧电感:Series RLC Branch,选L类型,3mH,串联小电阻0.1Ω模拟寄生参数
- 全桥:用4个IGBT/Diode模块搭成H桥,或者直接用Universal Bridge设成2桥臂
- 直流电容:Series RLC Branch选C类型,3300μF
- 负载:初期用Resistor,后期换成受控电流源模拟储能
这里有个细节:IGBT模块要设置反并联二极管,否则电流无法续流。Universal Bridge里勾选“Diode resistance”和“Forward voltage”用默认值即可。死区时间在仿真里可以先设0,但实际硬件必须加2微秒左右死区,否则直通炸管。
实操心得:主电路搭好后先别急着加控制,用固定占空比开环跑一下,确认能出波形再往下做。我见过不少人一上来就闭环,结果分不清是主电路问题还是控制问题。
3.2 坐标变换与锁相环实现
单相系统没有天然的正交分量,所以需要构造一个虚拟正交信号。常用方法有两种:延时90度法和SOGI(二阶广义积分器)法。延时法简单但动态响应慢,SOGI法响应快但参数整定麻烦。仿真里我推荐用SOGI,因为后面做双向能量流动时动态要求高。
SOGI的核心传递函数为:
D(s) = kωs / (s² + kωs + ω²) Q(s) = kω² / (s² + kωs + ω²)
其中ω是电网角频率,k是阻尼系数,一般取1.414。D(s)输出与输入同相,Q(s)输出滞后90度。有了这两个正交分量,就能做Park变换得到dq轴分量,锁相环用标准的SRF-PLL结构。
在Simulink里,SOGI可以用Transfer Fcn模块实现,也可以用Simscape里的现成模块。我习惯自己搭,因为参数看得见、改起来方便。PLL的PI参数:Kp=50,Ki=2000,这个值在50Hz电网下锁定时间约20ms。
3.3 双闭环PI参数整定方法
电流内环的PI参数可以按“模最佳”或“对称最佳”整定。工程上更常用的是试凑法结合理论初值。电流环带宽一般取开关频率的1/10到1/5,即1kHz到2kHz。按1kHz设计:
Kp_i = L × ωc = 3e-3 × 2π × 1000 ≈ 18.8 Ki_i = R × ωc = 0.1 × 6280 ≈ 628
实际调试时先把Ki设0,加大Kp直到电流跟踪略有超调,再加Ki消除稳态误差。我最终用的值是Kp_i=15,Ki_i=500。
电压外环带宽要远低于电流环,一般取100Hz左右。Kp_v = C × ωv = 3300e-6 × 628 ≈ 2.07,Ki_v取50左右。注意电压环输出要限幅,上限设为额定电流峰值,防止启动冲击。
注意:PI参数不是唯一的,跟你的电感、电容实际值有关。如果仿真波形不对,先检查主电路参数是否和计算一致。
3.4 SVPWM调制模块的Simulink实现
这是整个模型最核心也最容易出错的部分。单相SVPWM的实现步骤:
第一步,根据电流环输出的电压指令Vref,判断它落在哪个扇区。单相只有两个有效矢量+Udc和-Udc,所以扇区判断很简单:Vref>0时用+Udc和零矢量合成,Vref<0时用-Udc和零矢量合成。
第二步,计算有效矢量作用时间。设开关周期为Ts,Vref归一化后为m(0到1之间),则有效矢量作用时间为T1 = m × Ts,零矢量时间为T0 = (1-m) × Ts。
第三步,分配零矢量位置。这里有两种方式:单极性调制和双极性调制。单极性调制下,零矢量集中在周期两端或中间,开关次数少、谐波好;双极性调制下,零矢量分散,实现简单。我推荐用单极性,具体做法是:
- 左桥臂用Vref与三角载波比较
- 右桥臂用-Vref与同一个三角载波比较
这样自然就实现了SVPWM的效果,而且开关次数比双极性少一半。实测电流THD在3%左右,比双极性低1个百分点。
在Simulink里,三角载波用Repeating Sequence模块,幅值±1,频率10kHz。比较用Relational Operator,输出直接驱动IGBT门极。注意要加死区,用Transport Delay实现2微秒延时。
4. 仿真调试与常见问题排查
4.1 启动冲击与软启动设计
直接给母线电压指令400V,启动瞬间电流会冲到很大,因为电容从0充电相当于短路。解决办法是加软启动:让母线电压指令从0斜坡上升到400V,时间设0.2秒。或者先不控整流把电容充到311V,再切入闭环。
我一般用斜坡法,实现简单。用Ramp模块,斜率2000V/s,0.2秒到400V。同时电流指令限幅在额定值1.5倍,防止过流。
4.2 电流波形畸变排查思路
仿真跑起来后,如果电流波形不是正弦,按以下顺序排查:
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| 电流顶部塌陷 | 母线电压不够 | 提高Udc或降低交流电压 |
| 电流过零畸变 | 死区影响或PLL相位偏差 | 减小死区、检查PLL输出 |
| 电流高频毛刺 | 开关频率太低或步长太大 | 提高开关频率、减小仿真步长 |
| 电流直流偏置 | 积分器饱和或采样偏置 | 加抗饱和、检查反馈通道 |
最常见的是过零畸变,根源往往是PLL在电压过零附近锁相不准。把SOGI的k值从1.414降到1.0可以改善,但会牺牲动态响应。折中取1.2。
4.3 母线电压二倍频纹波抑制
单相系统天生有100Hz功率脉动,导致母线电压有二次纹波。仿真里能看到母线电压在400V上下波动,幅度取决于电容大小。要抑制这个纹波,除了加大电容,还可以在电压环里加陷波器,滤掉100Hz分量。
陷波器传递函数:N(s) = (s² + ωn²) / (s² + ωn s/Q + ωn²),ωn=628rad/s,Q=5。加在电压反馈通道上,效果立竿见影。我实测能把纹波从8V降到2V以内。
4.4 双向能量流动的切换逻辑
做储能应用时,整流器要能在整流和逆变之间切换。逻辑很简单:母线电压低于给定值时,电流指令为正,从电网吸收能量;高于给定值时,电流指令为负,向电网回馈能量。关键是切换过程要平滑,不能有冲击。
我的做法是在电压环输出后加一个速率限制器,限制电流指令变化率不超过50A/s。同时电流环的PI要加抗饱和,防止切换时积分器累积。实测切换时间约10ms,电流过渡平滑。
5. 从仿真到代码生成的落地经验
5.1 定点化与代码生成配置
Simulink模型验证通过后,可以用Embedded Coder生成C代码,烧到DSP或FPGA上。但浮点模型不能直接用,要做定点化。关键是选好定标:电流采样用Q12格式,电压用Q10,PI调节器内部用Q15防止溢出。
代码生成配置里,系统目标文件选ert.tlc,语言选C。勾选“Generate code only”先看代码质量。注意SVPWM模块里的三角载波要用查表法实现,不能直接算sin,否则实时性不够。
5.2 实际硬件调试的坑
仿真和硬件最大的区别是噪声和延时。硬件上电流采样有噪声,PLL会被干扰。解决办法是在采样后加一阶低通滤波,截止频率2kHz。另外PWM更新有延时,电流环带宽不能设太高,实际我降到800Hz。
还有一个坑是死区补偿。死区会导致输出电压偏差,电流过零时尤其明显。补偿方法是根据电流方向给电压指令加一个偏置,偏置量等于死区时间除以开关周期再乘以Udc。2微秒死区、10kHz开关频率、400V母线,偏置约8V。
5.3 模型整理与版本管理
Simulink模型容易越改越乱,建议一开始就做好模块封装。把主电路、PLL、电流环、电压环、SVPWM分别封装成Subsystem,接口用Bus信号。这样调试时只看某个子系统,不会被其他部分干扰。
版本管理用Git,但Simulink的.slx是二进制文件,diff不方便。我的做法是每次大改前另存一个版本,文件名带日期和修改说明。另外把关键参数放到Model Workspace里,改参数不用进模块。
6. 几个容易被忽略的细节
第一个细节是仿真步长。10kHz开关频率,步长至少1e-6秒,否则PWM边沿不准。如果用变步长,最大步长也要限制在1e-6。我试过用1e-5步长,电流波形明显失真。
第二个细节是代数环。电压环输出到电流环,电流环又影响母线电压,如果反馈路径没有延时,Simulink会报代数环错误。解决办法是在电压反馈通道加Unit Delay模块,或者用连续积分器打破环。
第三个细节是SVPWM的零矢量分配。单极性调制下,如果零矢量全放在周期一端,会导致开关次数不对称。正确做法是两端各放一半,这样每个开关周期内每个桥臂只开关一次,损耗最低。
第四个细节是初始条件。电容初始电压设为0,电感初始电流设为0,否则仿真一开始就有冲击。在Series RLC Branch里可以设初始值,或者在积分器里设Initial condition。
这套模型我从最初搭建到稳定运行花了大约两周,中间反复调整参数和排查问题。现在回头看,最难的不是控制算法本身,而是各种细节的配合——参数匹配、时序对齐、死区处理。希望这些经验能帮你少走弯路。后续如果要做三相版本,整体框架不变,只是SVPWM部分要换成六扇区判断,坐标变换也要改成三相的Clarke变换。