☰
单相PWM整流器双闭环控制与调制策略:Simulink建模及PI参数整定
2026/10/24 4:27:41 网站建设 项目流程

1. PWM整流器和二极管整流的本质差异:这套控制方案到底在解决什么

先把结论放在前面:单相PWM整流器这套"双闭环+单极性调制/单极性倍频调制"的方案,核心目标就两个——把直流侧电压稳住,同时让交流侧电流变成和电网电压同频同相的正弦波。如果你只是想要一个能整流的模型,二极管整流桥加电容就够了,但那玩意儿输入电流畸变严重、谐波大、电压不可调,能量还不能回馈。PWM整流器之所以值得搭,是因为它把"整流"从被动的通断变成了主动的电流整形。

普通整流桥的问题在于:电流只在电压峰值附近那一小段导通,波形是一串很窄的尖峰脉冲,频谱上全是高次谐波。而PWM整流器用电感串在交流侧,通过高频开关让电感电流始终跟踪一个正弦指令,电流波形被"逼"成了正弦,功率因数可以做到接近1。所谓单位功率因数,说白了就是电流和电压波形一致、相位一致,电网侧看不到无功和谐波污染。

单相PWM整流器本质上是个BOOST电路,这个点很多人建模时容易忽略。交流侧电压峰值是311V时,直流侧电压必须给到350V以上,通常取380V到400V,否则电感电流根本"顶"不上去。因为电流要从电网往直流电容里灌能量,直流侧电压必须高于交流峰值才能形成正确的功率流向,这和升压斩波是同一个道理。

1.1 为什么非要用双闭环,单环实在行不通

搭过模型就会明白:单电压环控制效果很差。电压外环输出的是"电流幅值指令",但交流电流本身是一个随时间正弦变化的量,光给幅值还不够,还得给定相位。如果你只检测直流电压误差、直接去调整开关占空比,交流侧电流的波形和相位完全失控,仿真里表现出来就是电流畸变、直流电压波动剧烈,甚至系统根本稳定不下来。

双闭环的思路是分层管理:

  • 电压外环:负责慢速的功率平衡。检测直流母线电压,和给定值比较,经PI控制器输出电流内环所需的幅值指令。
  • 电流内环:负责快速的电流整形。用幅值指令乘上电网电压的同步相位sin(wt),生成一个完整正弦电流参考,再让实测电流去跟踪它。

电流内环比电压外环快得多,这样两个环在工作频段上错开,不会互相干扰。这是整个控制系统的基石,后面所有调制方式、PI参数整定都建立在"内外环分层"这个前提上。

1.2 单相系统的数学模型其实就两个方程

做PI整定之前,必须把被控对象的数学模型理清楚。单相PWM整流器交流侧的动态方程是:

L * di/dt = Vs - Vab - i * R

其中Vs是电网电压,Vab是桥臂输出电压,R是线路电阻,L是交流侧电感。这个方程的意义是:通过控制Vab的大小和相位,就能控制电感电流i的波形。直流侧的动态方程是:

C * dVdc/dt = i_dc - Vdc / R_load

也就是电容电流等于输入功率折算的电流减去负载电流。两个方程一个管交流、一个管直流,中间靠功率平衡耦合起来。后面整定电流环参数时,用第一个方程;整定电压环参数时,用第二个方程。

2. 单极性调制与单极性倍频调制:换一种载波逻辑,谐波天差地别

这一节是整个模型的灵魂。同样一套主电路、同样的双闭环,调制方式不同,输出波形质量完全不同。单极性调制和单极性倍频调制在MATLAB里的实现差异其实就几个逻辑门,但出来的谐波特性是两个档次。

2.1 单极性调制的基本逻辑

PWM调制的本质是拿调制波和三角载波比较。单极性调制的特点在于:输出电压只在0到+Vdc之间切换(正半周),或者只在0到-Vdc之间切换(负半周),不会出现+Vdc直接跳到-Vdc的情况。

具体到四个开关管的驱动:

  • 交流电压正半周时,下桥臂的另一个管子保持导通,上桥臂的管子做PWM通断,输出在+Vdc和0之间切换;
  • 交流电压负半周时,换成另一侧的下桥臂管子保持导通,对应上桥臂管子做PWM通断,输出在-Vdc和0之间切换。

这样开关管的电压应力小,电流纹波也小。单极性调制下,桥臂输出电压的脉动频率等于载波频率,比如载波10kHz,输出基波脉动就是10kHz,谐波主要分布在10kHz附近的边带。

2.2 单极性倍频调制让别人以为你用了双倍开关频率

单极性倍频调制巧妙的地方在于:开关管的实际开关频率没变,还是10kHz,但桥臂输出电压的脉动频率变成了20kHz。听起来像魔术,其实就是用同一个三角载波,同时和两路相反的调制波比较。

具体做法是:把调制波v_m和它的反相-v_m一起送到比较器。用一个比较器的输出驱动左侧桥臂,另一个比较器的输出驱动右侧桥臂。因为两路调制波相差180度,它们和同一个三角载波的交点必然交错出现,每个载波周期内输出电压会上下脉动两次,等效频率直接翻倍。

这就是单极性倍频的名字由来——不是载波频率变高了,而是输出脉冲的重复频率翻倍了。谐波最低次群中心从fc附近挪到了2fc附近,幅值还明显更低。同样条件下,交流侧电流的THD能显著下降,或者反过来说,如果你对THD要求不高,可以把开关频率降一半,开关损耗就省下来了。

2.3 两种调制在Simulink里的开关分配

搭模型的时候,我建议把PWM生成部分做成一个独立子系统,留一个开关可以在两种调制之间切换。单极性调制需要根据电网电压相位判断正负半周,然后决定哪一组管子常通、哪一组做PWM。单极性倍频则不需要判断半周,直接用v_m和-v_m分别比较就行。

对比项单极性调制单极性倍频调制
调制波数量1路2路(互为反相)
桥臂输出脉动频率= 载波频率= 2倍载波频率
最低次谐波中心fc附近2fc附近
同等THD下所需开关频率较高较低
死区影响每次换流产生一个缺口换流次数翻倍,单次缺口影响变小
建模复杂度简单多几个逻辑运算,基本不算增加负担

死区这块需要多说一句。实际模型里给IGBT加了死区之后,倍频调制因为换流次数更多,死区效应出现的频率更高,但每次误差时间短,综合效果通常还是倍频更好。仿真时如果忽略死区,两种调制都能跑得很干净,真正能拉开THD差距的是不加死区时的理想对比。

3. Simulink建模的分层思路:主电路、测量、控制回路各自独立

很多人搭这种模型喜欢全部堆在一个文件里,最后连线密密麻麻,查错查到崩溃。我平时习惯拆成三个大块:主电路、测量与相位处理、控制回路与PWM生成。每个大块用子系统封装起来,调参和看波形都非常方便。

3.1 主电路模块怎么选

主电路这块用Simscape Electrical里的Specialized Power Systems库。按220V交流电网来算,参数这么给:

  • 交流电压源:幅值311V,频率50Hz;
  • 线路阻抗:用Series RLC Branch,R=0.5Ω,L=5mH;
  • 整流桥:用Universal Bridge,桥臂数选1,功率器件选IGBT/Diode,这样省事且参数稳定;
  • 直流侧电容:C=2200uF,耐压留够余量;
  • 直流负载:先给一个固定电阻,R=30Ω,功率大概5kW。

交流侧电感L的选择很关键。L太小,电流纹波大,谐波超标;L太大,电流响应慢,而且感抗压降会让功率因数下降。经验值是让电感感抗占交流侧阻抗的15%到25%,5mH对应50Hz下感抗约1.57Ω,相对311V/30Ω左右的等效负载阻抗来说是比较合理的起步值。

3.2 测量环节最容易被忽略的两个点

电流内环需要的是交流电流瞬时值,所以用Current Measurement直接量电感支路电流,信号进控制回路之前一定要过一遍单位换算,SI单位制下不需要额外处理,但要注意Scope显示时波形是正弦,内环PI要用的也是瞬时值,不是RMS值。

电压外环需要的是直流母线电压瞬时值。这里有一个很容易踩的坑:直流侧电压波形里有开关纹波,直接送给PI会产生高频干扰。我习惯在测量之后加一个一阶低通滤波,截止频率设在500Hz左右,既能滤掉20kHz附近的开关噪声,又不会影响电压环几百毫秒量级的动态响应。

同步相位信号怎么来?最简单可靠的方式是直接用sin(wt)发生器,因为是单一固定频率的电网,不需要PLL。如果你希望模型更接近真实场景,加一个单相PLL也行,但仿真初始阶段相位锁定需要时间,启动波形会比固定相位方式难看一些。我图省事直接给一个Sin(wt)模块,相位初始值和电网电压源设为一致。

3.3 控制回路和PWM生成的完整信号链

控制回路的信号流是这样走的:

  1. 电压参考Vdc_ref=400V减去实测直流电压Vdc,得到电压误差;
  2. 电压误差进外环PI,输出电流幅值指令Iref,这里必须加一个Saturation限幅,把Iref限制在比如50A以内,防止启动时电流冲击过大;
  3. Iref乘以sin(wt)得到正弦电流参考iref_sin;
  4. iref_sin减去实测交流电流ia,得到电流误差;
  5. 电流误差进内环PI,输出调制波信号v_m;
  6. v_m进PWM生成子系统,产生四路IGBT门极脉冲。

外环PI的限幅必须要加,否则启动瞬间直流电压误差很大,外环PI会输出一个巨大的电流指令,内环就算拼了命也追不上,模型直接发散。限幅值根据设计功率定,50A对应220V系统已经能跑到十几千瓦了。

PWM生成我用的是三角载波比较:三角载波幅值设为1,频率10kHz,调制波v_m范围限制在-1到1之间。直接把v_m和载波送进Relational Operator,输出就是脉冲。四路脉冲要加上死区时间,用Transport Delay延迟2us即可,IGBT的驱动逻辑需要保证同一桥臂上下管不直通。

倍频调制只需要把v_m复制一份取反,和同一路三角载波分别比较,再把两路比较结果按桥臂分配成四路驱动即可。

4. 双闭环PI参数整定的工程步骤:先内环后外环

参数整定是整个模型能不能稳定工作的核心。我的方法是从被控对象数学模型反推初始值,再在仿真里微调。这比随便写一组数字然后到处试要快得多,也更容易找到问题出在哪一环。

4.1 电流内环参数从被控对象直接推

电流环的被控对象就是交流侧电感电阻串联支路,传递函数是:

G_i(s) = 1 / (L*s + R)

PI控制器取Kp + Ki/s。工程上最常用的做法是零极点对消:让PI的零点去抵消被控对象的极点。也就是令Ki/Kp = R/L,这样电流环开环传递函数就变成Kp/(L*s),成了一个纯积分加比例的结构,非常好设计。

按我给的L=5mH、R=0.5Ω,R/L=100。期望电流环穿越频率取开关频率的十分之一,10kHz载波对应fc_i=1kHz。此时Kp = 2pifc_i * L ≈ 31.4,Ki = R/L * Kp ≈ 3140。

实际仿真里我不会直接用这个理论值,因为采样零阶保持和PWM纯延时会让相位裕度下降。第一次仿真我会把Ki打个七折,改成Ki=2200左右,然后看电流跟踪指令有没有过大的超调振荡。如果电流波形贴着正弦参考走、没有明显滞后,说明相位裕度够了。

4.2 电压外环参数和那个容易被忽略的100Hz问题

电压外环的被控对象是直流侧电容,近似为1/(Cs)的积分特性,负载电阻会产生一个并联的功率泄放通道,实际对象是1/(Cs + 1/R_load)。

电压外环带宽必须拉开和电流环的距离,一般取电流环带宽的五分之一到十分之一,100Hz到200Hz。但这里有一个单相系统特有的限制:单相瞬时功率天然带有两倍工频(100Hz)的波动,这个波动会反映到直流电压上。如果电压外环带宽超过100Hz,外环PI会把100Hz的电压波动当成误差去调节,电流指令就会被带上100Hz的振荡分量,交流电流谐波直接变差,功率因数也会掉。

所以我把电压外环穿越频率设在30Hz左右。开环增益按C*dV/dt的关系估算,初始参数给Kp=0.3,Ki=10。调的时候看直流电压的启动响应,如果超调太大、恢复太慢,就按"先降Kp稳定波形,再升Ki消除静差"的顺序微调。

4.3 整定现场的判断技巧

说几个仿真里判断参数是否合适的直观方法:

  • 电流波形有没有毛刺:内环Ki太大,电流在波峰附近会出现小幅高频抖动,肉眼可见;Ki太小,电流在过零附近追不上正弦参考,波形会有削顶。
  • 电压启动有没有明显超调:外环Kp太大,直流电压冲过400V再掉回来,超调量超过10%就要降Kp。
  • 负载突变后的恢复速度:把负载电阻从30Ω切换到15Ω,直流电压会先掉下去再爬回来。恢复时间在0.2秒到0.5秒之间比较合理,如果掉下去两秒都回不来,外环Ki太小或者Iref的限幅已经到了边界。

按我这边的经验,只要内环参数靠谱,外环在30Hz左右带宽下调试很宽容,Kp和Ki在正负30%范围内调整都不会出大问题。

5. 仿真结果怎么验:稳态纹波、动态响应和THD判读

模型跑通不难,难的是知道结果"好到什么程度才算合格"。我一般从三个维度去判断:稳态波形、动态响应、谐波分析。这三个维度分别回答三个问题:它稳不稳、它抗不抗干扰、它干不干净。

5.1 启动和稳态波形怎么算正常

仿真时间设0.6秒。启动阶段你会看到直流电压从0开始往400V爬升,这个过程中交流电流会有一个短暂的冲击,这就是外环限幅在起作用,电流被压在50A以内。如果电压爬升过程平稳、没有大的来回摆动,说明内环和外环的分层是有效的。

稳态判据我一般用这几条:

  • 直流母线电压平均值稳定在400V正负3V以内;
  • 直流电压纹波峰峰值小于5V;
  • 交流电流波形是干净的正弦,过零点附近没有明显畸变;
  • 交流电流和电网电压相位一致,也就是电流过零点和电压过零点对齐。

第四点特别容易看漏。有时候电流波形看起来正弦得很漂亮,但相位偏了十几度,功率因数已经掉到0.95以下了,波形上不那么明显。用Scope同时显示电网电压和电流,着重看两个波形的过零点是否对齐,这是检查是否实现单位功率因数的最快方法。

5.2 负载突变最能暴露参数问题

稳态看不出的问题,一切负载就现原形。我在0.3秒处把R_load从30Ω切换成15Ω,相当于负载功率从5kW翻倍到10kW,看系统怎么反应。

正常的表现是:交流电流幅值自动增大,新稳态下依然是正弦且和电压同相;直流电压先跌落一小截再慢慢回到400V,跌落幅度在10到20V之间,恢复时间0.3秒左右。如果电压跌落超过50V,说明外环带宽太低或者Ki太小;如果电流在切换瞬间出现大幅振荡,说明内环阻尼不够,需要降低Kp或者增加Ki。

这里也顺带验证了限幅的作用:把Iref限幅改成20A再切负载,你会发现电压恢复得很慢,因为电流指令顶在限幅值上,系统输出不了足够的功率去给电容充电。

5.3 THD对比:单极性和倍频的差距有多明显

用powergui的FFT工具打开,选稳态段(0.4到0.6秒)的交流电流波形,基波设为50Hz,显示谐波到20kHz。按我常用的参数组,区别大致是这样:

调制方式等效脉动频率交流电流THD(典型范围)适合的开关频率策略
单极性调制10kHz3%到6%10kHz以上
单极性倍频调制20kHz1.5%到3%6k到8kHz也可以接受

单极性倍频的谐波频谱里,最低次谐波群集中在大约20kHz附近,这个频段用一个小电容就能滤掉。而单极性调制的10kHz附近的谐波幅度要明显高一些。如果你后级还要接EMI滤波器,倍频方式的滤波器体积能小一号,这是实打实的工程收益。

判断"稳定"还有一个容易误判的点:电流波形看起来是正弦,但其实THD主要是低次谐波贡献的,比如3次、5次谐波超标。这种通常不是调制的问题,而是内环PI参数没整好或者外环100Hz振荡串进来了。看到低次谐波大的时候,先检查外环带宽,再检查内环相位裕度,顺序不要反。

6. MATLAB2022a模型降版本兼容的处理经验

标题里写了"可将至更低版本",说明这是一个很多人都会碰到的需求。2022a建的模型给用旧版本软件的人用,经常出现打开报错、模型损坏、模块找不到等问题。我在这块踩过不少坑,说点能直接落地的处理思路。

6.1 版本不兼容的来源到底是什么

Simulink模型文件(.slx)内部有schema版本号,高版本保存的模型,低版本软件打开时会提示"模型版本较新,无法加载"。这个限制不是靠改后缀名能绕过去的,必须用正经方法转格式。

另一种不兼容是模块库的问题。2022a里Simscape Electrical的模块库经过多次改名,很多模块在旧版本里要么路径不同,要么参数结构变了。最常见的是老版本SimPowerSystems和新版本Simscape Electrical在Universal Bridge、Three-Phase Bridge这类模块上命名差异。模型打不开,有时候不是文件版本问题,是找不到模块。

6.2 可操作的三条降版本路线

第一条是Simulink自带的另存为功能。在编辑器里点"Save As",对话框下方有一个"Save as previous version"选项,可以把模型存成往前几个版本格式。2022a可以另存为2021b,2021b还能继续往2020b转,但一般只支持往回倒两个小版本,跨度太大就失败了。

第二条是用Export to Previous Version工具,这个需要额外的Simulink许可证支持。它能处理更复杂的模型内容,但也不是万能密钥,遇到个别模块版本差异还是会警告甚至跳过。

第三条是我的推荐方案:从一开始建模时就用"老模块"。控制回路全用最基础的Sum、Gain、Integrator、Saturation、Relational Operator、Logical Operator,这些模块从十几年前到现在一直在标准库里,参数格式没变过。主电路用Universal Bridge加Series RLC Branch,存储为旧版本时基本不会遇到模块找不到的情况。这样降版本的失败率最低。

6.3 跨版本跨度太大时的终极方案

如果目标版本实在太老,比如要降到2016b以下,转格式成功的机会很小。我最后用的是脚本重建路线:不追求传输Simulink文件,而是用MATLAB的m脚本去解系统的微分方程,把PWM整流器的两个动态方程写进去,用数值积分跑出电压电流波形。

% 简化版单相PWM整流器数值仿真思路 % 状态: 交流电感电流ia, 直流电压Vdc % 输入: 电网电压vs, 桥臂输出电压vab(由PWM调制决定) L = 5e-3; R = 0.5; C = 2200e-6; Rload = 30; fs = 10000; dt = 1e-6; t = 0:dt:0.6; for k = 1:length(t)-1 % vab根据调制波和载波比较结果确定 % 占空比 -> vab -> 更新ia dia = (vs(k) - vab - R*ia(k)) / L * dt; ia(k+1) = ia(k) + dia; % 直流侧功率平衡 -> 更新Vdc dVdc = (vab*ia(k)/Vdc(k) - Vdc(k)/Rload) / C * dt; Vdc(k+1) = Vdc(k) + dVdc; end

这段思路不是完整的工程代码,但说明了核心逻辑:只要把两个微分方程写清楚,任何版本的MATLAB都能跑。Simulink模型适合展示控制结构和参数灵敏度,脚本适合跨版本复用和批量参数扫描。两条路配合着用,版本兼容问题基本就解决了。

我在实际处理中还有一个心得:模型里尽量减少高级封装,那些封装得很漂亮的子系统在旧版本里经常出问题,因为封装面具下的模块版本可能已经变了。遇到这种情况,老老实实把子系统就地展开,用最底层的基本模块重新连线,虽然看起来笨,但兼容性最好。反正控制算法本身不复杂,真正复杂的永远是参数,而参数是跟你走的,不跟模型走。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询