
做三相并联型有源电力滤波器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、uqud、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坐标下对应300Hz7次对应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 - edL·d(iq)/dt uq - R·iq - ω·L·id - eq这里ed、eq是电网电压在dq轴上的分量ω是电网角频率。可以看到d轴和q轴之间通过ω·L项互相耦合也就是说改变d轴电压会影响q轴电流反之亦然。如果不做解耦PI调节器调起来很别扭一个轴的动作会扰动另一个轴。所以电流环PI控制器输出后我会加上解耦补偿项d轴输出要减去ω·L·iqq轴输出要加上ω·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/(LsR)PI调节器做成零极点对消的形式Kp可以按L·ωc估算Ki则按R/L来配比算出来Kp在十几到二十几Ki在几百到一千多的范围。这个值做初值再根据波形微调比较靠谱。电压外环的被控对象近似为一个积分环节1/(sC)响应天然比电流环慢。电压环Kp我一般先给0.1到0.8Ki给5到30然后看Udc波形。如果电压恢复太慢适当增大Ki如果出现振荡先降Kp。下面给一个我用着还算顺手的初始参数表注意这只是起点不是最终答案不同模型平台、不同采样频率都要重新调。环节参数参考初值调节方向电流内环d/q轴Kp_i10~15跟踪慢就加振荡就减电流内环d/q轴Ki_i300~800消除稳态误差过大容易振荡电压外环Kp_u0.2~0.5电压回落慢可加大电压外环Ki_u10~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是常见范围。我这里取2mHR取0.1Ω。在Simulink里实现主电路时用Simscape Electrical库里的器件更顺手。电网用Three-Phase SourceIGBT桥用Universal Bridge并选IGBT/Diode类型直流侧用电容交流侧用电感串联接到PCC。负载回路建议加一个断路器或者使用定时投切这样后面测试负载突变时APF的动态响应比较方便。5.2 控制子系统组织方式控制部分推荐分成几个独立子系统不要都堆在顶层Harmonic_Detect负载电流输入谐波指令输出内部包含坐标变换和LPFPLL锁相环子系统输出θ、sinθ、cosθ供各个变换共用Voltage_PI直流母线电压采样输入输出有功电流校正量Current_PI谐波指令和APF输出电流dq分量输入输出电压指令ud、uqSVPWM接收uα、uβ输出PWM比较值并生成脉冲。我把电压电流采样都经过一个零阶保持器ZOH模拟实际DSP的采样保持采样周期设为100微秒