1. 为什么谐波抑制不能只靠一组PI参数先聊控制策略的取舍逻辑做有源电力滤波器APF仿真的人多半都经历过这样一个场景模型搭好了谐波电流检测模块的输出波形也正常可就是补偿后的电网电流THD压不下去测试5次、7次谐波超标PI调来调去只有两种结果——要么Kp大了系统高频振荡要么Ki大了稳态误差没消完还伴随电流波形毛刺。这时候你会发现纯PI控制对周期性谐波信号的处理存在天然短板。我最早做这个项目时用的就是常规的电流内环PI控制。按照教科书把内环带宽设计到几千赫兹理论上谐波频率范围内的增益应该足够高但实际仿真一跑5次谐波250Hz能抑制七八成13次以上650Hz就开始疲软。原因并不复杂PI控制器对阶跃参考或缓慢变化信号有无静差跟踪但对正弦参考信号它的开环增益在特定频率点并不是无穷大。若你代入误差传递函数去看会发现正弦信号经过PI闭环后幅值误差和相位误差始终存在而且频率越高残余误差越大。换句话说想用一对固定零点去压制整个谐波频段的所有周期分量控制能力根本不够用。这正是需要引入重复控制的地方。重复控制的理论根基是内模原理如果某个外部信号的数学模型内置于控制器内部那么系统对该信号就能实现零稳态误差跟踪。谐波都是基波的整数倍本质上是周期信号天然适配这个方法。把周期信号发生器放进去就能对所有谐波频率同时给出足够的增益压制。但现实没有这么理想。重复控制的动态响应速度取决于基准周期延迟基波50Hz对应20毫秒周期最坏情况下误差修正要等一个周期才见效补偿电流的跟随速度明显偏慢。负载突变那一下重复控制器根本反应不过来动态跌落比较难看。所以工程上通常把PI和重复控制并联或者串联在一起用PI吃动态、重复控制吃稳态各管一段。我最终确定下来的结构就是并联式复合控制这也成了整套Simulink仿真模型的骨架。2. 控制系统建模与谐波提取APF仿真里的第一道分水岭2.1 广义被控对象从逆变器输出到电网接口仿真模型里不能直接把“控制器”和“ PWM逆变器”连在一起完事你得把从调制波输入到实际补偿电流输出的整条链路当作被控对象来看待。这条链路由三大部分组成第一段是逆变器桥臂。三相两电平电压源型逆变器是APF最常见的拓扑开关频率设置在12800Hz直流母线电压稳定在750V左右。逆变器的数学模型近似一个带增益的惯性环节增益约等于母线电压的一半与载波幅值之比惯性时间常数取决于开关周期和滤波电感。第二段是L滤波或LCL滤波网络。因为谐波补偿电流需要快速跟随指令电感值不能太大我选的进线电感L1.4mH。这里有一个容易忽略的点电感本身会产生相位滞后而且滞后量随频率升高而增大到了13次谐波650Hz以上相位滞后可能超过15度。这说明重复控制里的相位补偿环节绝不是可有可无的装饰件。第三段是采样与数字处理延时。仿真里如果用离散控制器采样周期、占空比更新方式都会把额外的滞后塞进环路。我习惯把整个离散控制器的计算延时等效为半个采样周期这样做出来的电流环相位裕度估算才接近真实情况。整体来看广义被控对象的传递函数可以近似为G(s) Vdc/(2*Vtri) * 1/(Ls R)再串联一个纯延时。所有后续的PI参数和重复控制补偿设计都以这个对象模型为基准。2.2 谐波指令电流的实时提取dq同步旋转坐标下的高通滤波法谐波抑制策略要起作用前提是参考电流算得准。传统做法是先通过瞬时无功功率理论算出三相瞬时有功、无功电流再滤除基波分量得到谐波指令。在实际Simulink搭建中我用的是更直观的dq同步旋转坐标提取法。方法的核心思路把三相电流变换到与电网基波同步旋转的dq坐标系下基波正序分量在dq轴上是直流量谐波则表现为不同频率的交流量。此时把dq轴分量通过一个截止频率约20Hz的高通滤波器滤掉基波直流成分剩下的是谐波分量。再把谐波分量反变换回abc坐标系就得到了需要补偿的谐波电流参考值。这句话听起来简单但里面有三个关键点需要留意第一个是锁相环的精度。如果PLL输出的相位有偏移或抖动基波分量不能完全变成直流量后面高通滤波就会滤不干净参考电流里会残留反向基波扰动最终表现为补偿后电流反而变大。所以PLL一定要用SRF-PLL且环路带宽推荐设在30~50Hz兼顾动态和稳定。第二个是高通滤波器的相位问题。高通滤波器虽然只处理dq轴直流量但它的截止频率会引入轻微的相位移动在基波附近的谐波提取精度影响不大。但如果用二阶或更高阶滤波器注意不要在控制带宽内引起明显的相位变形。第三个是启动过渡。仿真一开始时母线电容未充电、控制器输出未稳定dq轴变换和高通滤波会有一段较长的暂态。建议先把谐波提取和控制器分开测试确认提取模块的输出波形干净后再接进闭环。2.3 电流内环其实包含两次坐标变换APF的电流控制器通常直接作用在旋转坐标系上这样可以更方便地对dq轴电流进行解耦。模型中dq轴电流参考值由谐波提取模块实时给出反馈值则来自测量到的电网电流同样经过abc-dq变换。为了防止混淆我在模型中单独封装了三个模块abc-dq变换单元、dq反变换单元和参考电流计算单元。每个单元都留有调试端口能在仿真过程中把中间量拉出来观察。刚开始做这个模型时我曾在坐标变换的符号约定上栽过跟头——dq轴变换矩阵有等幅值与等功率两种形式系数差了根号三倍如果不统一后面所有参数都会偏差。3. 重复控制器内部的结构拆解延迟链、低通滤波器与补偿网络3.1 内模原理的离散化表达N拍延迟就是周期信号的发生器数字重复控制器的核心是一个周期延迟环节z^(-N)其中N fs / f0是基波周期对应的采样点数。我的仿真模型开关频率12800Hz基波50HzN算出来是256。这意味着把当前周期的误差存进延时链256拍后把它读取出来并叠加到输出上如此周而复始对周期信号的修正会不断累积。为什么要用这个形式从原理上讲一个周期延迟环节加上正反馈就构成了一个周期信号发生器。闭环系统里嵌入它相当于在控制器内部“长期记忆”了上一周期的误差模式。谐波误差每周期重复一次控制器就能反复修正多个周期后误差趋近于零。这是重复控制能够实现高精度谐波抑制的根本原因。实际离散域里的常用形式是Q(z)是内置的低通滤波器典型值取0.95或0.98作用是削弱延迟环节在更高频段的积累作用防止高频未建模动态引发谐振。z^(-N)是主延迟链Krc是重复控制增益Gf(z)是相位与幅值补偿网络。3.2 为什么延迟链前面要加Q(z)稳定性换稳态精度的经典折中有些初学者会疑惑Q(z)设为1不是最好吗这样内模就是纯积分器理论上稳态误差为零。但Q(z)1带来的问题是整个重复控制器在每一个N的整数倍频率点都提供无穷大增益而这些频率点的模型不确定性会被无限放大。现实中电网频率有波动、电感参数会漂移、数字化采样存在误差PWM死区还引入非线性。这些因素都会使得“理论谐波频率处无限增益”变成“实际谐波频率附近振荡”。因此仿真实践中几乎没人敢把Q(z)设为1普遍做法是用一个小常数或者低通滤波器把高频积累增益压住。这会牺牲一点稳态精度——误差不会完全归零但对主要谐波的抑制率仍然可以做到90%以上换来的是鲁棒性。我自己的仿真参数中Q(z)直接填的0.96稳态THD从补偿前10%左右降到2%左右完全够用。3.3 相位补偿网络Gf(z)超前拍数的取值技巧相位补偿是整个重复控制器里最容易让仿真结果“好一截”或“烂一截”的环节。补偿网络负责把被控对象和滤波器造成的相位滞后提前补偿掉。其形式通常是z^k的超前环节串一个低通滤波器或零相位补偿滤波器。在离散域里z^k意味着把延迟链的输出提前k个采样周期。k的最佳取值等于整个控制环路在主要谐波频段中位点的相位滞后对应的拍数。以我的模型为例开关频率12800Hz下控制带宽附近的滞后主要来自L滤波器的惯性环节和PWM等效延时。经过整定k4时二次到十九次谐波处的相位补偿效果最好误差修正矢量与理论方向一致。如果k取小了相位欠补偿谐波抑制不完全误差收敛后会有残余波动k取大了则过补偿高频段可能出现相位反超反而引发振荡。建议仿真时先固定其他参数把k逐个试一遍观察补偿后电流THD与误差波形走势选择THD最小的值。这是一个可以直接抄作业的经验技巧。4. Simulink模型搭建链路从谐波提取到PWM发波的完整实现4.1 顶层框架图与模块划分整个Simulink模型从顶层可以分为六个功能区电网与非线性负载区、APF主电路区、谐波检测区、复合控制器区、PWM调制区以及观测与分析区。我用的是Simulink R2020b以上版本搭配Simscape Electrical的“Three-Phase Source”和“Universal Bridge”模块搭建主电路。功能区主要模块关键参数电网Three-Phase Source线电压380V50Hz短路容量按短路阻抗5%谐波源Three-Phase Rectifier 或非线性RLC负载阻感负载触发角0°直流侧负载电阻15ΩAPF主电路Universal BridgeIGBT直流母线电容4700μF进线电感1.4mH母线电压750V谐波检测abc→dq变换高通滤波器截止频率20Hz采样时间1/12800s复合控制器PI模块与重复控制模块并联PI: Kp2.8Ki180PWM调制三角载波比较PWM载波频率12800Hz幅值±1顶层模型的信号流是三相电源电压接入PLL锁相得到的同步相位送给dq变换模块非线性负载的电流经过谐波检测模块得到谐波参考电流参考电流与实际测得的电源侧电流做差误差进入复合控制器控制器输出经过dq反变换和PWM调制产生六路IGBT驱动脉冲。4.2 重复控制子系统的内部布线细节在Simulink里实现重复控制我建议把它封装成独立的子系统Subsystem。内部走线如下误差信号e进入子系统后分两条路并联。一条路直接乘以PI参数产生PI支路输出另一路先进入重复控制支路按顺序经过比例增益Krc → 加法器 → 周期延迟链z^(-N) → Q(z)滤波器 → 相位超前z^k → 幅值补偿器Gf。加法器的第二路输入是延迟链输出经过Q(z)滤波后的回馈构成内模正反馈。这里最容易犯的错误是延迟链的构建方式。在Simulink离散模块里可以使用Discrete Delay或Memory模块但两者行为不同。Discrete Delay带ZOH语义更准确地符合数字化实现Memory不按采样周期保持会引入时序混乱。务必使用Discrete Delay并将采样时间设为与控制器一致的基本步长。子系统在触发条件上也有讲究。重复控制支路必须在固定采样步长下运行而且延迟链的初始状态要设置为零。我专门加了一个reset接口仿真过程中的任意时刻都可以一键清空延迟链便于做动态启动和负载突变的观察实验。4.3 三相PWM波生成与母线电压闭环PWM调制部分采用的是最常见的三角载波比较法。控制器输出的三相调制波幅值在±1之间三角载波频率12800Hz比较后产生六路PWM脉冲输送给Universal Bridge的IGBT门极。这里需要注意一个关键点调制度不能超过1否则进入过调制区输出电压基波幅值会畸变重复控制理论上计算得再好实际补偿电流也会明显失真。直流母线电压需要单独的电压外环稳住。电压外环用PI控制采样的是直流母线电压输出作为有功电流分量叠加到谐波参考电流上补偿APF自身开关损耗和电容漏电流引起的母线跌落。电压环带宽设低一些典型值在20~50Hz不要对谐波抑制产生干扰。4.4 仿真步长配置与非线性负载建模这套模型包含PWM高频开关过程必须用固定步长离散仿真。我把固定步长设为1/12800/4即每个开关周期采样四次Simulink里填写1.953125e-5秒。如果追求更快速度步长放松到一个开关周期也没问题但谐波波形的毛刺会略微增加。非线性负载的选择直接影响谐波谱结构。最经典的是三相全桥整流带阻感负载产生的特征谐波为6k±1次以5次、7次、11次、13次为主。如果负载改为电容滤波型整流谐波频带更宽电流峰值倍数更高对控制器的压力明显增大。建议先用阻感整流负载把模型调试稳定再换成电容滤波型做压力测试。5. 参数整定实操先稳住PI再谈重复控制的收敛5.1 电流环PI的预整定逻辑重复控制虽然负责稳态精度但它依赖误差信号的有效性。如果一开始的PI把电流环搞得不稳定重复控制注入的修正量只会加剧振荡。所以必须先单独调试PI支路让它能稳得住。具体操作为了在Simulink中把重复控制支路暂时短接只保留PI电流闭环。此时的电流环开环传递函数近似为PI * G(s) * e^(-sTd)。我先把母线电压设为恒定750V参考电流指定为固定幅值的正弦波观察稳态跟随和阶跃扰动响应。Kp的选择以电流环交叉频率约1/10开关频率为目标进行计算。12800Hz开关频率下交叉频率取1200~2000Hz对应Kp大约在1.5~3之间。在这个基础上加Ki把低频增益抬起来配合去耦项后电流环相位裕度能保持在45度以上。我最终的Kp2.8、Ki180就是这么试出来的。5.2 重复控制增益Krc与Q(z)的耦合关系把重复控制支路恢复后第一个要调整的参数是Krc。Krc太小每次周期修正只是“意思一下”收敛可能需要上百个周期仿真跑二十秒依然能看到缓慢下降的误差包络Krc太大第一个周期修复过头后续修正量震荡发散。通过扫参对比我这个模型在Krc0.4附近动态和稳态综合表现最好。一个容易被忽略的耦合是Krc和Q(z)的取值关系。Q(z)越接近1重复控制增益在谐波频率点的峰值越高同样的Krc会产生更强的修正力度但也更容易激发出高频谐振。我建议固定Krc为0.3先试Q0.95、0.97、0.98观察误差收敛曲线和补偿电流FFT。若高频段出现明显毛刺把Q往下调或减小Krc两条路都能解决但响应速度表现不同。5.3 误差收敛曲线的判读技巧重复控制调试过程中最可靠的判据不是补偿后的THD而是误差信号的包络收敛轨迹。正常工作时误差每个周期应该呈现单调递减趋势大约经历10到20个基波周期后进入稳定。若误差呈等幅振荡说明增益边界已到需要降Krc或调Q(z)若误差快速变小但随后反弹说明相位补偿过冲把超前拍数k减一档再试。我把误差、补偿电流和PLL相位一起送到Scope里保存数据跑完后用FFT工具直接分析补偿前后电流的频谱。观察5次、7次、11次、13次谐波幅值的衰减倍数比单纯盯着THD数值更直观因为THD是总的效果无法暴露某个特定频次的补偿失效。6. 四种典型工况的仿真结果从标准整流负载到极端负荷突变6.1 稳态工况补偿前后FFT对比与THD变化标准阻感整流负载下补偿前A相电流的THD在11.5%左右FFT结果显示5次谐波含量最大约9.6%7次约5.8%11次3.2%13次2.1%。这会直接导致中性线电流超标和变压器额外发热。接入PI重复控制复合策略后稳态仿真时间设为0.5秒取最后0.2秒做FFT分析。补偿后THD降至1.9%其中5次谐波从9.6%降到0.7%抑制率92.7%7次从5.8%降到0.5%抑制率91.4%。11次和13次也在2%以下。这个结果说明复合控制在稳态谐波抑制上完全达到了预期。6.2 负载突变工况动态响应的真实差异为了观察动态性能我在2秒时刻突加一组阻性负载使谐波电流幅值从约18A迅速跳到30A。记录补偿电流误差波形可以看到负载突变瞬间PI支路立刻响应误差在几百微秒内先压下去重复控制支路因为延迟链保留了上一周期的旧值第一拍反而会输出一个偏置扰动随后逐周期修正大约经过3到5个基波周期60~100ms误差重新收敛。如果单独用纯PI控制稳态误差始终有残差THD在负载突变后回升到5%以上而且无法自动消减。如果单独用重复控制稳态精度优秀但动态那段补偿电流跟指令偏差较大母线电压跌落也更明显。两者的互补价值在这个工况里展现得很清楚。6.3 电容滤波型整流负载的压力测试把非线性负载换成三相不控整流加电容滤波后负载电流峰值系数很大低次谐波含量更高同时电流在过零附近有明显的断续段。这个场景下重复控制的收敛速度会变慢误差波形不再是光滑的正弦叠加而是包含尖锐跳变。实测补偿后THD约3.5%比阻感负载工况差一些。原因在于电容滤波型负载的谐波频谱远超周期延迟链能覆盖的基波整数倍范围高频非整数次成分无法被内模完全吸收。这也说明复合控制策略的适用范围仍以特征谐波为主面对宽频谐波源时需要额外扩展重复控制器的内模结构或并联多个支路。6.4 三相不平衡工况的补充观察最后再提一个我实测过的工况负载三相不对称A相接入大功率单相整流器B、C相接入较小负载。此时负序分量出现在系统中dq坐标下的分量不再单纯是直流量与谐波量的叠加还混有100Hz负序基波成分。谐波提取模块里若是用同步旋转坐标高通滤波负序基波分量会被当成低频谐波保留进参考电流导致补偿电流里注入负序。由于重复控制内模只覆盖基波整倍数频率100Hz分量无法被完全消除补偿效果受限。若要应对这种情况需要在检测环节增加正负序分离。这部分我目前只做了仿真验证暂未纳入最终的简化模型不过很值得后续单独开一篇文章展开。7. 调试中踩过的坑离散域实现细节与仿真实战心得7.1 双线性变换与离散PI参数换算Simulink里的连续域PI模块如果直接丢进离散模型内在求解器依然会在每个固定步长内计算连续域的状态方程仿真没问题但和你真正写在DSP芯片里的离散PI行为完全不是一回事。这就是“仿真通过但实机跑不通”的老问题的根源。正确做法是直接使用Discrete PID Controller模块并在模块参数中选择合适的离散化方法。我习惯用后向欧拉法离散积分项离散后的PI系数与连续域系数之间需要按采样周期换算直接套连续系数会导致实际增益偏差。若用Simulink内置的离散PID模块直接填Kp和Ki即可它会自动按所选积分方法离散化比手动传递函数建模可靠得多。7.2 延迟链初始状态与仿真复位重复控制延迟链的初始状态在仿真启动阶段就是一堆零这本身没有问题。但在做多组参数对比时如果沿用上一次仿真的状态继续跑延迟链里还残留着旧参数的历史误差新参数的性能判断会被污染。我给模型加了一个简单的延时链清零逻辑每当仿真重启时间触发或手动开关按下就把N个延迟寄存器全部置零。这个细节看似微小实际影响很大。我第一次做Krc对比实验时不同Krc的收敛曲线混在一起怎么解释都解释不通最后发现就是延迟链旧数据没清除。清空后所有实验结果立刻变得干净整洁。7.3 固定步长与求解器选择的搭配APF仿真模型里同时存在快速开关变换和慢速工频信号跨尺度特性明显。我使用discrete求解器配合固定步长1.953125e-5秒整个仿真稳定且速度可控。如果误用变步长求解器Simulink会在每一个开关沿处额外加密步长模型仿真时间可能暴涨百分之几百而且步长自适应过程本身也会给离散控制器引入额外时序抖动。7.4 补偿电流过冲时的限幅与抗饱和启动阶段或负载突变时补偿电流指令可能在一瞬间超过逆变器输出能力此时如果不加限幅控制器积分项会持续增长导致迟滞饱和。重复控制器同样有固有饱和机制——误差过大时修正量会超过占空比上限。我的工程做法是在控制器输出和PWM调制器之间加一个Saturation模块限幅设为±0.95再加一个简单的积分限幅反馈。实测加入限幅后过冲电流峰值下降了约40%恢复时间缩短了三分之一。这个改动虽然简单但对整个系统的保护至关重要。7.5 仿真结果与理论估算之间的偏差处理任何仿真都不可能完全复现教科书理论曲线。我的这套模型中补偿后电流THD的实测值与理论估算存在大概0.5%左右的偏差主要来源是PWM调制过程的高频纹波和Q(z)滤波器带来的基波泄漏。仿真阶段偏差可控但如果你准备把这个仿真模型往硬件移植建议额外考虑死区时间、管压降和采样延时这几个非理想因素它们在实际装置中会比仿真模型更显著地拉高残余谐波。调试过程中被反复验证的一条规则是先用最简单的工况把全链路跑顺再逐渐往模型里叠加非理想因素不要在第一步就把所有细节都装进去。我就是先在理想开关模型下调好复合控制器的所有参数之后才引入死区与采样延时最终得到的模型既有清晰的调试脉络也保留了接近实际装置的特性。8. 后续可以扩展的方向与个人体会这个模型跑通之后我顺手做了几个有意义的小扩展。一个是把重复控制器从单周期内模改成多周期内模用延迟链并联的方式覆盖25Hz分谐波对特定电网场景有一定效果。另一个是在复合控制器的重复控制支路前串入一个简单的前馈权重以负载电流直接前馈到调制波动态响应速度进一步提升。两个扩展都只花了两三天时间就完成验证说明基础框架选得好后续迭代成本很低。整个项目做下来我最大的体会是谐波抑制这件事控制器的软件仿真难度并不在模型本身而在于你愿不愿意花时间去理解每一个环节的物理含义。重复控制里的延迟链不是一句“把误差存起来”就能敷衍过去的你必须清楚每个采样周期里数据从哪儿来、到哪儿去、为什么经过这些系数之后误差会收敛。当你能在Simulink的Scope图上预判出下一个周期误差曲线的大致走势时这个模型才算真正吃透了。最后分享一个小技巧保存仿真结果时建议把误差信号和补偿电流信号以数组形式写入工作区然后用脚本自动计算各次谐波抑制率。我写了一个简单的分析脚本跑完一次仿真直接输出5、7、11、13次谐波的抑制率表格。这样迭代参数时不需再用FFT工具逐个点对比效率提升非常明显。希望你搭模型时一开始就把数据输出接口设计好不要像我最初那样为了看数据反复暂停重跑。