做三相并联型有源电力滤波器APF仿真,绕不开一套非常经典的组合:电压外环、电流内环都用PI控制,谐波检测用id-iq法,最后调制走SVPWM。我可以直接说,这套方案是我见过最适合作为APF入门和课程设计模板的路子,它把“检测谐波、跟踪指令、稳定直流母线”三件事分得清清楚楚,每个环节都能单独验证,也非常方便后续扩展成重复控制、滑模、无差拍之类的改进算法。
这篇文章我会从方案选型、id-iq检测细节、双闭环PI参数整定、SVPWM实现方式,到仿真搭建和调试顺序全部过一遍,并把我实际搭模型时踩过的坑、试过的参数一起放出来。如果你正准备用Matlab/Simulink复现这个项目,建议直接按文中的调试顺序走,能少走很多弯路。
1. 先想清楚再动手:这套方案为什么这么选
1.1 并联型APF到底在干什么
有源电力滤波器APF的核心思想并不复杂:电网给非线性负载供电时,负载电流里除了基波,还有大量谐波。APF并联在公共连接点PCC上,实时检测负载电流中的谐波分量,然后通过PWM变流器向电网注入一路大小相等、方向相反的补偿电流,把谐波在进入电网前“抵消”掉。
这里的“并联型”指的是APF的主电路拓扑与负载并联接入电网,工业上绝大多数APF都是这种结构。原因是并联接入方便,扩容简单,投切不影响负载供电,而且谐波电流源天生适合用并联电流源去补偿。如果做成串联型,相当于在电网和负载之间串一个电压源,那主要用来解决电压质量问题,和咱们做谐波补偿的思路不一样。
主电路结构上是典型的电压源型PWM变流器:三相桥臂IGBT,交流侧通过并网电感L接到PCC,直流侧有一个大电容C。这个电容负责支撑直流母线电压,也承担补偿过程中的无功和谐波能量缓冲。整个系统的物理模型并不复杂,真正的难点在于怎么让控制算法准确、快速地输出想要的补偿电流。
1.2 双闭环PI加id-iq加SVPWM的搭配逻辑
为什么要选“电压外环+电流内环都是PI”?因为从控制目标来看,APF其实有两个控制量要管:一是直流母线电压Udc要稳定在给定值附近,二是APF输出电流要实时跟踪谐波补偿指令。
如果只做电流环,电容电压会随着运行慢慢跌落。因为变流器的IGBT有开关损耗、电感有铜损,这些有功损耗必须从电网侧补充,否则能量只出不进,Udc迟早撑不住。所以电压外环负责维持直流母线能量平衡,它输出的有功电流分量叠加到电流指令上,让APF从电网吸收一点有功来弥补自身损耗。
电流内环则是APF实现谐波补偿的关键,它必须有足够快的响应速度,让实际输出电流紧紧咬住指令电流。在同步旋转dq坐标系下用PI控制,可以把正弦跟踪问题变成直流量跟踪问题,PI控制就能实现无静差。这个方案计算量小、实现简单、参数也直观,所以在工程和仿真中特别常见。
谐波检测选id-iq法,我看中它的一点是:在电网电压畸变的情况下,它比传统的p-q瞬时无功功率法更稳。因为id-iq法只依赖锁相环输出的同步角度,电网电压畸变对检测结果影响很小。这对仿真来说可能看不出多大差距,但放在工程现场电网环境复杂的场景里,这个优势就很明显了。
1.3 仿真整体信号链路
我在搭建仿真时,习惯先把信号链路理清楚,再往Simulink里放模块。整个APF控制系统的信号流向可以概括为:
- 采样三相负载电流iLa、iLb、iLc,送入id-iq谐波检测模块;
- 检测模块输出谐波电流指令(常为dq轴谐波分量或者反变换后的三相电流指令);
- 电压外环采样直流母线电压Udc,与参考值比较后经PI调节器输出一个有功电流校正量,叠加到d轴指令上;
- 电流内环采样APF实际输出电流ifa、ifb、ifc,转换到dq坐标系,与参考指令比较后经PI调节器输出电压指令ud、uq;
- ud、uq经过坐标反变换得到静止坐标系下的uα、uβ,送给SVPWM模块生成开关脉冲;
- 脉冲驱动三相桥臂IGBT,使APF输出补偿电流注入电网。
这个链路里最容易让人绕晕的地方在于“电流环参考到底是什么”。我刚开始做的时候也犯过迷糊:电流内环反馈到底用电网电流还是APF输出电流?答案是必须用APF输出电流,也就是并网电感上的电流。谐波检测得到的是“需要APF发出的补偿电流指令”,电流环的任务是让APF实际输出等于这个指令,最终网侧电流等于负载电流减补偿电流,自然就正弦了。
2. id-iq谐波检测:别再把坐标变换搞反
2.1 原理:同步旋转坐标系里基波变成了直流
id-iq谐波检测法的理论根子是瞬时无功功率理论,但形象一点理解就是“换个坐标系看电流”。三相电流是50Hz的交流量,控制起来麻烦,但如果用一个和电网基波同步旋转的坐标系去观察,基波正序分量在这个坐标系里会变成直流分量,而谐波分量因为频率不同,旋转坐标系下依然是交流量。
具体实现过程是:先采样三相负载电流,经过Clarke变换得到两相静止坐标系下的iα、iβ,再通过Park变换得到同步旋转坐标系下的id、iq。这里的旋转角度θ来自锁相环PLL,锁的是电网A相电压的基波正序相位。
转换到dq坐标系后,id中包含基波有功电流的直流分量,也包含谐波产生的交流纹波;iq类似。这时用一个低通滤波器LPF把直流分量滤出来,就得到了基波有功和基波无功对应的d、q轴分量。再用负载电流的id、iq减去这两个基波分量,剩下的就是谐波分量。这就是id-iq法提取谐波的本质。
反变换的时候,把谐波dq分量转回三相坐标系,就得到三相谐波补偿指令电流。这里要提醒一句:坐标变换的系数有两种约定,一种是等幅值变换,一种是等功率变换。采用等幅值变换时,变换矩阵前有系数2/3,如果选错,后面所有电流幅值都会差一个比例系数,表现出来就是补偿后THD下降不明显,却找不到原因。
2.2 低通滤波器和PLL:两个决定检测质量的地方
id-iq检测模块里最容易影响效果的就是低通滤波器LPF。因为dq坐标系下,基波正序分量对应0Hz直流,但5次谐波在dq坐标下对应300Hz,7次对应300Hz的另一个方向(实际负序会到6倍频即300Hz),基波负序则对应100Hz。LPF的截止频率选多少,直接决定检测精度和动态响应速度。
截止频率如果取得太高,比如200Hz以上,100Hz的基波负序分量就很难滤干净,检测到的“基波”里混有交流成分,导致谐波指令出现偏差。如果取得太低,比如1Hz,虽然滤波干净,但负载突变时检测结果要很久才能跟上,动态补偿效果差。工程上一般取10到50Hz之间,二阶Butterworth低通是比较常用的选择。我这里实测下来,10到25Hz是个比较舒服的范围,静态补偿效果和动态响应都能兼顾。
PLL锁相环的质量同样关键。id-iq法当中,θ角精度直接影响Park变换的正确性。如果锁相角度有偏差,检测到的id、iq会混叠,导致谐波提取不准。仿真中如果电网电压是理想三相正弦,用Simulink自带的PLL模块通常没什么问题;但如果电网电压有畸变,我建议在PLL前面加一个低通滤波或者只取基波正序电压参与锁相,否则锁出来的角度会被谐波污染,整个检测结果都跟着乱。
2.3 Simulink里推荐的做法
具体在Simulink里搭id-iq检测模块,我建议不要堆成一大坨,而是用子系统封装好。里面大致是这样的结构:
- 输入:三相负载电流iLa、iLb、iLc,还有PLL输出的sinθ、cosθ;
- 第一步:Clarke变换得到iα、iβ;
- 第二步:Park变换得到id、iq;
- 第三步:LPF分别对id、iq滤波,得到基波分量id_f、iq_f;
- 第四步:用id - id_f得到d轴谐波分量,iq - iq_f得到q轴谐波分量;
- 第五步:如果直接在dq域做电流控制,就把这两个谐波分量作为电流环的d/q参考;如果要在abc坐标系里做电流跟踪,再做一次Park反变换得到三相补偿指令。
有一个容易忽略的点:电流方向。负载电流的采样方向决定了检测出的谐波分量符号。如果负载电流传感器方向装反,最终补偿出来的电流会变成“增谐波”而不是“消谐波”,补偿后电网电流THD反而更高。仿真模型里多数情况下不会装反,但如果你自己搭的模型发现谐波越补越大,第一反应应该就是检查电流方向或者控制量符号。
3. 双闭环控制:电流内环负责快,电压外环负责稳
3.1 电流内环数学模型与解耦前馈
电流内环的控制对象是APF并网电感L和线路电阻R。在dq同步旋转坐标系下,变流器的数学模型可以写成一对方程:
L·d(id)/dt = ud - R·id + ω·L·iq - ed
L·d(iq)/dt = uq - R·iq - ω·L·id - eq
这里ed、eq是电网电压在dq轴上的分量,ω是电网角频率。可以看到,d轴和q轴之间通过ω·L项互相耦合,也就是说改变d轴电压会影响q轴电流,反之亦然。如果不做解耦,PI调节器调起来很别扭,一个轴的动作会扰动另一个轴。
所以电流环PI控制器输出后,我会加上解耦补偿项:d轴输出要减去ω·L·iq,q轴输出要加上ω·L·id,同时把电网电压前馈项ed、eq也加到输出上。这样处理后,电流环的等效对象就被“解耦”成了两个独立的一阶惯性环节,d轴和q轴可以分开整定。很多仿真教程里为了简化省略了前馈,但APF要输出高次谐波电流,动态响应要求高,能加尽可能加。
这里还要说一个我自己的体会:很多新手在Simulink里做电流环时,会把“参考电流”和“反馈电流”都直接在abc坐标系下比较,然后把误差量直接做比例放大。这种做法不是不能用,但PI对正弦参考的跟踪天然存在稳态误差,除非在abc域用PR谐振控制器。既然标题定了PI控制,那就老老实实把电流转换到dq域做,基波谐波里我们想跟踪的指令,在dq域里映射后本质是各次交流量的叠加,PI能保证低频增益高,配合适当的带宽已经可以达到不错的补偿效果。
3.2 电压外环为什么存在以及怎么接
电压外环的物理意义很直观。直流母线电容上的能量变化等于流入和流出功率之差。正常运行中APF要输出谐波补偿电流,这些电流会在直流侧产生功率波动,同时桥臂损耗、电感损耗又会消耗有功,如果不加控制,Udc会缓慢下降。电压外环通过检测Udc实际值与给定值的偏差,经PI调节器输出一个d轴有功电流增量,让APF从电网吸收少量有功来补偿损耗,从而把Udc稳定在额定值。
在信号连接上,电压外环的输出要叠加到id轴电流指令上。这里的具体接法决定了系统能否正常工作:我一般把电压环输出的电流校正量i_p直接加到d轴谐波指令上,再把合成后的id_ref作为电流内环的d轴参考。如果发现直流电压建立不起来甚至越控越低,可以把i_p的符号取反再试,很多情况下是电流参考方向和传感器方向定义不一致导致的。
电压环带宽必须远低于电流环,一般相差5到10倍以上。电流环的响应速度决定补偿效果,电压环只需要稳住直流母线平均值,不需要快速响应。如果电压环PI调得太快,它输出的有功电流校正量会抖动得很厉害,和电流环相互激励,整个系统出现低频振荡。
3.3 一套可复用的PI整定初值
PI参数整定是整个仿真里最“玄学”又最影响结果的部分。我自己的习惯是先根据经验公式算一组初值,再放到Simulink里根据波形微调,而不是凭空乱试。
以一套典型的380V/50Hz系统为例:直流母线电压给定700V,直流侧电容C取3000μF左右,并网电感L取2mH,电阻R约0.1Ω,开关频率10kHz。电流内环的穿越频率通常取开关频率的1/10到1/5,也就是1kHz到2kHz。把控制对象近似为G(s)=1/(Ls+R),PI调节器做成零极点对消的形式,Kp可以按L·ωc估算,Ki则按R/L来配比,算出来Kp在十几到二十几,Ki在几百到一千多的范围。这个值做初值,再根据波形微调比较靠谱。
电压外环的被控对象近似为一个积分环节1/(sC),响应天然比电流环慢。电压环Kp我一般先给0.1到0.8,Ki给5到30,然后看Udc波形。如果电压恢复太慢,适当增大Ki;如果出现振荡,先降Kp。
下面给一个我用着还算顺手的初始参数表,注意这只是起点,不是最终答案,不同模型平台、不同采样频率都要重新调。
| 环节 | 参数 | 参考初值 | 调节方向 |
|---|---|---|---|
| 电流内环d/q轴 | Kp_i | 10~15 | 跟踪慢就加,振荡就减 |
| 电流内环d/q轴 | Ki_i | 300~800 | 消除稳态误差,过大容易振荡 |
| 电压外环 | Kp_u | 0.2~0.5 | 电压回落慢可加大 |
| 电压外环 | Ki_u | 10~30 | 稳态误差和响应速度靠它调 |
| LPF截止频率 | 二阶低通 | 10~25Hz | 滤不干净就降,动态慢就升 |
调试的时候记住一个原则:先调电流环,再调电压环。电流环稳定了,电压环才有意义。
4. SVPWM实现:从矢量表到PWM脉冲
4.1 SVPWM相比SPWM的优势
标题里“S...”按最常见的方案理解就是SVPWM空间电压矢量调制。APF这种应用为什么偏爱SVPWM而不是传统的SPWM?最直接的原因是直流电压利用率。SPWM在正弦调制下的相电压基波幅值最多到Udc/2,而SVPWM的线性调制区可以让相电压基波幅值达到Udc/√3,相当于把直流电压利用率提升了约15%。对APF来说,同样的直流母线电压,SVPWM能输出更大的补偿电压,意味着能补偿更大的谐波电流,这在工程上是很实际的优势。
另外,SVPWM每次开关切换只动作一个桥臂,开关损耗相对分散,输出电压谐波含量也更低。更重要的是,SVPWM是从“电压矢量合成”的角度出发,和后来很多先进控制算法(比如模型预测控制)思路一致,学一遍能复用很久。
SVPWM的原理可以概括成一句话:三相逆变器共有8个基本电压矢量,其中6个有效矢量把平面分成6个扇区,2个零矢量放在起始和中间。任意时刻想要的参考电压矢量,都可以由它所在扇区的两个相邻有效矢量和零矢量,按伏秒平衡原则在一个控制周期内合成出来。
4.2 计算流程与Matlab Function代码
SVPWM的标准实现分三步:判断扇区、计算相邻矢量作用时间、生成七段式开关序列。下面这段Matlab Function是我自己用的一个简化实现,输入是uα、uβ、直流母线电压Udc和开关周期Ts,输出是三个桥臂的比较值Tcm1、Tcm2、Tcm3,单位是秒。外部再用一个周期为Ts的三角载波去和比较值比较,就能生成对应桥臂的PWM。
function [Tcm1, Tcm2, Tcm3] = svpwm(u_alpha, u_beta, Udc, Ts) % SVPWM调制函数,输出三相桥臂比较值 % 1. 扇区判断 if u_beta > 0 A = 1; else A = 0; end if (sqrt(3)*u_alpha - u_beta) > 0 B = 1; else B = 0; end if (-sqrt(3)*u_alpha - u_beta) > 0 C = 1; else C = 0; end N = A + 2*B + 4*C; % 2. 计算X Y Z X = sqrt(3)*u_beta*Ts/Udc; Y = (1.5*u_alpha + sqrt(3)/2*u_beta)*Ts/Udc; Z = (-1.5*u_alpha + sqrt(3)/2*u_beta)*Ts/Udc; % 3. 根据扇区确定T1、T2 switch N case 1 T1 = Z; T2 = Y; case 2 T1 = Y; T2 = -X; case 3 T1 = -Z; T2 = X; case 4 T1 = -X; T2 = Z; case 5 T1 = X; T2 = -Y; case 6 T1 = -Y; T2 = -Z; otherwise T1 = 0; T2 = 0; end % 4. 过调制保护 T0 = Ts - T1 - T2; if T0 < 0 T1 = T1 / (T1 + T2) * Ts; T2 = T2 / (T1 + T2) * Ts; T0 = 0; end % 5. 七段式切换时间 Ta = T0 / 4; Tb = Ta + T1 / 2; Tc = Tb + T2 / 2; % 6. 根据扇区分配比较值 switch N case 1 Tcm1 = Tb; Tcm2 = Ta; Tcm3 = Tc; case 2 Tcm1 = Ta; Tcm2 = Tc; Tcm3 = Tb; case 3 Tcm1 = Ta; Tcm2 = Tb; Tcm3 = Tc; case 4 Tcm1 = Tc; Tcm2 = Tb; Tcm3 = Ta; case 5 Tcm1 = Tc; Tcm2 = Ta; Tcm3 = Tb; case 6 Tcm1 = Tb; Tcm2 = Tc; Tcm3 = Ta; otherwise Tcm1 = 0; Tcm2 = 0; Tcm3 = 0; end end这段代码里有一个往往被忽略的细节:第4步过调制保护。如果电流环PI输出饱和或者直流母线电压不够,合成的参考矢量可能超出SVPWM线性调制范围,T1加T2就会大于Ts。如果不处理,输出波形会畸变。我这里采用的方法是等比压缩T1和T2,让总作用时间等于Ts,等效于把超出范围的矢量“拉回”到最大内切圆上。实际系统里还应该配合PI输出的限幅来用。
4.3 接死区、限幅和载波比较的踩坑提醒
拿到Tcm1、Tcm2、Tcm3之后,下一步是生成六路IGBT驱动脉冲。这里必须加死区时间,否则同一桥臂上下管可能出现直通。仿真里虽然IGBT不会真的烧毁,但你会看到直流侧电流瞬间尖刺、母线电压波动异常,严重的直接把仿真搞发散。死区时间可以设为2到5微秒,用Universal Bridge模块时也可以直接填写死区参数。
我一般在SVPWM输出之后加一个饱和限幅模块,限制电流环PI的输出幅值。限幅的物理含义是限制SVPWM的调制深度,避免过调制。计算依据可以这样理解:SVPWM线性区内参考电压矢量幅值最大不能超过Udc/√3,所以电流环PI输出电压指令在进入SVPWM之前,最好先做幅值判断和限幅。这个限幅同时还能起到抗积分饱和的作用,我会把PI模块的“Anti-windup”选项打开,并设置与输出限幅一致的上下限。
还有一个经常遇到的坑:SVPWM和PWM载波的同步问题。控制周期Ts和载波周期最好严格对应,而且电流采样、PI计算、PWM更新要保证固定的时序。Simulink仿真里如果控制部分用的是离散模块,建议把控制步长设为和Ts一致,这样每次计算得到的比较值更新一次,PWM载波也按这个周期循环,逻辑上才接近真实数字控制器。
5. 从零搭建仿真和调通全流程
5.1 主电路参数设计与器件选择
先定主电路参数。电网侧设三相380V/50Hz,线电压有效值380V。负载我用一个三相不控整流桥带阻感负载来产生典型谐波,这种负载会产生5、7、11、13次等特征次谐波,THD一般能到25%到30%,非常适合用来检验APF的补偿效果。
APF直流母线电压的选取要留有裕量,一般取电网线电压峰值的1.5倍左右。380V电网线电压峰值约537V,直流母线取650到750V比较合适,我这里用700V。直流电容的容量主要影响电压环的动态特性和电压纹波,取值太小则Udc波动大,取值太大会让电压环响应迟钝。仿真里取2200μF到4700μF都行,我常用3000μF。
并网电感L的选择要从电流跟踪能力和纹波两个角度考虑。电感太小,开关纹波电流大,补偿效果受纹波干扰;电感太大,电流变化率受限,APF跟不上高次谐波指令。经验上取电网侧基波阻抗的3%到10%,对380V/50Hz、APF容量几十千伏安的系统,1mH到3mH是常见范围。我这里取2mH,R取0.1Ω。
在Simulink里实现主电路时,用Simscape Electrical库里的器件更顺手。电网用Three-Phase Source,IGBT桥用Universal Bridge并选IGBT/Diode类型,直流侧用电容,交流侧用电感串联接到PCC。负载回路建议加一个断路器或者使用定时投切,这样后面测试负载突变时APF的动态响应比较方便。
5.2 控制子系统组织方式
控制部分推荐分成几个独立子系统,不要都堆在顶层:
- Harmonic_Detect:负载电流输入,谐波指令输出,内部包含坐标变换和LPF;
- PLL:锁相环子系统,输出θ、sinθ、cosθ,供各个变换共用;
- Voltage_PI:直流母线电压采样输入,输出有功电流校正量;
- Current_PI:谐波指令和APF输出电流dq分量输入,输出电压指令ud、uq;
- SVPWM:接收uα、uβ,输出PWM比较值并生成脉冲。
我把电压电流采样都经过一个零阶保持器ZOH,模拟实际DSP的采样保持,采样周期设为100微秒