
搞并网逆变器的同行尤其是碰过三电平NPC拓扑的人大概率都有过类似的体验PI参数调到头秃LCL谐振峰压不下去好不容易加上有源阻尼动态响应又变得拖泥带水。我这两年多时间一直在做LCL型三相并网逆变器的控制从传统双闭环一路折腾到FCS-MPC有限控制集模型预测控制坦白讲MPC不是银弹但它确实把很多以前互相打架的问题拆解掉了——不需要解耦、不需要调制器、不加额外硬件就能同时管住并网电流和直流侧中点电压。这篇文章不打算写成教科书式的推导而是把从仿真到样机的完整过程摊开讲预测模型怎么建、代价函数怎么配、权重因子怎么调、延迟补偿怎么做、计算量怎么降以及实验里那些论文不会告诉你的坑。适合正在做MPC方向的研究生或者准备把这套控制从Simulink往控制器上落地的工程师。1. LCL谐振与中点漂移这两个老难题为什么被FCS-MPC轻松化解1.1 双闭环策略在三电平NPC拓扑下的连锁麻烦传统三相并网逆变器最成熟的方案是电压外环加电流内环电流内环通常用PI调节器加前馈解耦调制部分走SPWM或SVPWM。这套组合在纯L或LC滤波的两电平拓扑里相当顺利但换成LCL滤波器加三电平NPC之后麻烦就扎堆冒出来了。先说LCL本身。滤波器是三阶系统在谐振频率附近有一个很陡的阻抗峰闭环里一旦激励到这一个频段的谐波电流波形就跟着振荡。工程上要么并无源阻尼电阻牺牲效率要么做有源阻尼最常见的就是在算法里引入电容电流反馈或分裂电容等虚拟阻抗。有源阻尼本身又要额外调参数而且它和电流内环的带宽、相位裕度会互相牵制。叠加三电平NPC之后又冒出一个绕不开的问题直流侧两个串联电容的中点电位会漂。中点电压不平衡轻则导致输出电压谐波增大重则把电容和开关管的电压应力推到临界。传统方法一般是在SVPWM里注入零序分量或者调整小矢量作用时间这又和电流控制耦合在一起。我早期用PI加注零序的SVPWM方案调了三周才算稳定下来。问题在于各个控制环路的带宽不同、耦合又深每动一个环节都要重新检查其他的。这种感觉就像在按一个浮在水面的球按下去这头那头又翘起来。1.2 FCS-MPC的破局点把多目标直接写进代价函数FCS-MPC的思路完全不同。它不追求把每个控制目标拆成独立环路而是直接利用逆变器一个很朴素的特性开关状态是有限的。三电平NPC每相有P、O、N三种状态三相组合起来一共3的3次方等于27种开关状态对应到空间电压矢量为9类。控制器要做的就是对这27个状态逐一做三件事先根据系统模型预测施加这个状态后下一拍甚至下两拍的系统状态比如并网电流、中点电压差再算一下目标值和预测值之间的偏差最后选偏差最小的那个开关状态直接输出给驱动电路。这样一来并网电流控制、中点电压平衡、甚至开关频率限制、共模电压抑制全部都可以化成代价函数里的一个附加项。不需要调制器不需要解耦网络不需要额外设计小矢量时间分配。我在第一次把中点电压项加进代价函数时波形出来几乎是自动收敛的第一次感受到什么叫一个框架通吃多目标。当然这种直观性是有代价的模型精度决定稳态性能计算量比传统方案大一截开关频率不固定需要重新设计滤波器。这几个代价的具体表现和应对办法我在后面几个章节里分别展开。先记住一句话FCS-MPC适合的从来不是最省事的方案而是多约束强耦合对动态响应要求高的场景LCL型三电平并网逆变器恰好就是典型。2. 预测模型的搭建LCL状态方程和中点电压方程是整个控制的地基模型预测模型是第一位的。模型偏差太大会直接导致稳态误差甚至振荡。我见过不少人直接在Simulink里拖模块用官方的MPC工具箱跑通仿真就以为完事了实际写DSP代码时才发现状态方程哪里少了一项符号哪里反了。所以这一章把模型从物理到离散一步步说清楚。2.1 LCL滤波器在三相静止坐标系下的状态方程一个典型的LCL滤波并网逆变器由三部分组成逆变器侧电感L1含寄生电阻R1、滤波电容Cf、网侧电感L2含寄生电阻R2。状态变量自然就是逆变器侧电流i1、网侧电流i2、电容电压uc。以A相为例列KVL和KCL逆变器侧回路L1乘di1a/dt加上R1乘i1a等于逆变器输出电压va减电容电压uca。网侧回路L2乘di2a/dt加上R2乘i2a等于电容电压uca减电网电压ega。电容节点Cf乘duca/dt等于i1a减i2a。三相系统在三相对称时可以做Clark变换到αβ坐标系α轴和β轴方程形式完全相同、互相解耦所以控制器里只写一套α轴方程β轴复用同样的系数。写成矩阵形式是dx/dt A乘x B乘v G乘eg其中x是[i1α, i2α, ucα]这组状态向量A矩阵是[[-R1/L1, 0, -1/L1], [0, -R2/L2, 1/L2], [1/Cf, -1/Cf, 0]]输入矩阵B是[1/L1, 0, 0]的转置电网电压系数G是[0, -1/L2, 0]的转置。这里的v就是逆变器输出的α轴电压它由当前开关状态决定。三电平NPC的输出电压与开关状态的关系很直接每相开关状态定义为1对应输出Udc/20对应输出0负1对应输出负Udc/2变换到αβ坐标后就是v。整个FCS-MPC的预测核心就是这一组方程。2.2 离散化方法的选择别在上位机跑没问题、下到DSP就跑飞状态方程是连续系统控制器处理器是离散执行所以必须离散化。这一步看着简单实际上坑不少。最简单的做法是前向欧拉把dx/dt近似成后面式子代入状态方程整理后得到差分方程。前向欧拉的好处是计算量小、代码直观很多两电平MPC的论文都这么用。但我要提醒一句LCL本身是弱阻尼振荡网络前向欧拉属于显式数值积分当系统谐振频率相对采样频率较高、且阻尼比较小时离散化后的极点可能被推到单位圆外仿真里会出现不明所以的高频振荡。我对比过的三个方案。前向欧拉适用于采样周期很小、谐振频率较低的场合比如谐振频率2到3千赫兹、采样周期50到100微秒勉强能用。精确矩阵指数法是把连续状态方程的解析解写成带矩阵指数的形式在代码启动时用泰勒级数或Padé近似算好系统矩阵和输入矩阵之后每个控制周期只是矩阵乘加计算量并不比前向欧拉大多少但数值稳定性好很多。双线性变换法精度也不错但对并网这种带独立输入项的系统整理起来稍麻烦。我的建议很明确直接走矩阵指数法。在Matlab里用c2d可以拿到离散化的系统矩阵然后作为常数存到控制器里。这么做代价只是启动阶段多算几次矩阵指数在线运行时多一个矩阵乘法而已换来的却是高温、参数漂移下都不容易出现的数值振荡。我在样机上对比过前向欧拉和精确离散化在谐振频率6千赫兹左右的表现前者在满载时出现毛刺后者纹丝不动。2.3 中点电压的动态方程符号最容易搞反的一步三电平NPC的中点电位由直流侧两个电容输出电压决定。设上电容电压为uc1、下电容电压为uc2定义中点电位偏移量为Δu等于uc1减uc2。中点电位会漂本质是因为流入或流出直流侧中点O的电流不为零。中点电流iz和三相电流、各相开关状态的关系需要仔细推导。当某一相输出O状态时该相电流会经由箝位二极管流入或流出中点输出P或N状态时则不走中点。具体的表达式是iz等于负的SaO乘ia加上SbO乘ib加上ScO乘ic其中SaO在a相输出O状态时取1否则取0。负号来自电流正方向的定义我假定相电流正方向为从逆变器流向电网此时若某相输出O且电流为正实际是电流流入中点与iz流出中点的参考方向相反所以要取负。有了中点电流之后两个电容的电压动态就可以写出来。假设两个电容容值相等均为C则d(Δu)/dt等于负的iz除以2C。把这个式子离散化就得到从当前拍预测下一拍中点电位偏移量的公式。这一项会成为代价函数里中点电压平衡项的基础。这里有个最容易被忽略的细节在27个开关状态里小矢量存在P型和N型冗余即同一个基本电压矢量对应两组开关状态这两组状态产生的中点电流方向相反。FCS-MPC之所以能自然地平衡中点电压正是因为代价函数会自动从冗余小矢量里挑出能纠正当前电位偏移的那个。你不需要像SVPWM那样预先计算小矢量占空比只需要把这个预测模型和代价函数写好剩下的交给枚举比较。3. 代价函数设计并网电流跟踪与中点电压平衡的协同代价函数是FCS-MPC的大脑。它的结构直接决定控制效果也决定权重因子好不好调。这一章把代价函数怎么设计、各项怎么归一化、权重怎么整定一次讲清楚。3.1 电流跟踪项的设计细节参考电流从哪来、怎么比较并网电流控制最直观的代价函数项是并网电流参考值i2*与预测值i2(k1)的偏差。在αβ坐标系下写成两部分α轴误差的绝对值加上β轴误差的绝对值也可以写成误差的平方和。绝对值形式对权重因子梯度变化更平滑平方和形式对大偏差惩罚更重。我实际做下来两者稳态性能差异不大平方和的动态收敛稍微快一点但超调也更明显推荐先试绝对值形式。参考电流i2*从哪来是另一个问题。如果是纯并网功率控制可以根据有功和无功给定直接算出αβ轴参考电流公式为i2α星等于三分之二乘以P参考乘eα加上Q参考乘eβ除以eα平方加eβ平方i2β星类似。如果逆变器前面还有直流母线电压外环那外环输出作为有功电流给定无功电流单独给定再经过坐标反变换得到αβ参考。不管哪种方式PLL都要锁准电网相位这一点到第五章实验部分再细讲。电流项是整个代价函数的主项衡量的是逆变器下一拍能不能把并网电流拉回目标。这一项权重固定为1即可不需要调节。3.2 中点电压平衡项的两种接入方式中点电压平衡项的写法有几种流派。最简单的就是在中点电位偏移预测值累加一个权重系数再求绝对值或平方。代价函数整体就变成电流跟踪项加λ乘绝对值形式的中点偏移项。另一种差分方式是每相开关状态对中点电流的影响有正有负与其在代价函数里加权惩罚不如在候选矢量层面直接约束比如只允许选择当前能减小|Δu|的小矢量冗余组。这种做法计算量更小但损失了一部分最优性而且当中点偏移不严重时它会影响电流跟踪的灵活度。我建议以加权惩罚项为主方案。这样在电位偏移较小时代价函数会优先保证电流电位偏移一旦增大该项快速占主导自动拉回平衡。3.3 权重因子λ的工程整定路线权重因子λ是FCS-MPC被吐槽最多的地方。论文常写经过调试选取合适值后面就没有下文了。我提供一个可复现的整定流程。先把电流误差和中点电压差做归一化处理。电流项除以额定电流峰值中点电压项除以Udc的一半使两者在正常工况下都是0到1量级。这样做以后λ的初值可以从0.5开始试。整定步骤是先设λ为0跑纯电流控制记录中点电位的漂移速度比如在满载时每10毫秒漂多少伏。然后逐步增大λ每步增加0.1观察两个指标中点点位最大偏移是否降到了可接受范围一般建议小于直流母线电压的5%并网电流THD是否仍在限值内一般对比基准值增幅不超1%。当λ在某个区间内两个指标同时达标就说明整定成功。我通常三到五次迭代就能找到一个合适的值比如某台1兆瓦样机上λ整定到0.8附近。另外提醒一句λ不是越大越好。λ过大意味着代价函数几乎只看中点电压电流跟踪会被牺牲体现在动态响应变慢、谐波增大。整定的本质是在两个目标之间找平衡点而不是把某一个压到极致。4. 延迟补偿与计算量从仿真模型变成实时控制器的两道坎模型能跑通、代价函数会写了剩下的就是工程化的两件大事一拍延迟怎么补、计算量怎么降。这两件事不解决MPC在实物上基本无法正常工作。4.1 一拍延迟为什么致命两步预测具体怎么做只要用过数字控制器就会理解采样、计算、输出不是瞬间完成的。控制器通常在k时刻采样经过A/D转换、坐标变换、枚举预测、代价比较真正把开关状态更新到驱动电路已经是k1时刻了。等于说k时刻算出的最优开关状态实际在k1时刻才生效系统白白多了一个周期的滞后。对于并网电流这种快速变化的变量这一拍滞后会导致相位滞后谐波和稳态误差都会显著增加。解决方法是经典的两步预测也叫延迟补偿。思路是在k时刻先用当前施加的开关状态预测出k1时刻的起始点再从这个起始点出发枚举27个候选开关状态预测它们各自对应的k2时刻系统状态最后用k2时刻的状态计算代价函数。实际执行时k时刻输出给驱动电路的是上一拍已经选好的最优状态而本拍计算的新最优状态要到k1时刻才更新。核心伪代码长这样# FCS-MPC主循环含一拍延迟补偿伪代码 for each_control_period: sample(i1, i2, eg, udc, uc1, uc2) # 同步采样 state_now get_current_applied_state() # 当前正在作用的开关状态 x_k1 Ad * x_hat Bd * v(state_now) Gd * eg # 先预测一拍作为补偿起点 best_score float(inf) for sw in switch_states: # 27种候选状态 x_k2 Ad * x_k1 Bd * v(sw) Gd * eg # 预测到k2拍 score current_error(x_k2, i_ref) lam * midpoint_error(x_k2) if score best_score: best_score, best_sw score, sw apply_to_gate_driver(best_sw) # 下一拍才真正生效注意第二步的电网电压eg在k到k2之间当作常数处理实际电网频率很低这种近似完全成立。两步预测虽然让计算量翻倍但带来的控制性能提升是决定性的。我在示波器上对比过补偿前后的网侧电流波形THD差距可以达到2到3个百分点。4.2 全枚举27种状态的计算负担和候选集筛选如果控制周期是100微秒全枚举27个状态、每个状态两次矩阵乘加运算在常见的150兆赫兹浮点DSP上大约要消耗40到60微秒。听起来似乎来得及但要考虑到锁相环、外环、保护逻辑、通讯也要占用时间片而且如果未来还要在代价函数里加开关频率限制项或共模电压项函数评估还会更重。所以降计算量基本是所有MPC工程落地的必修课。我常用的两个降计算量思路。第一种是候选集截断。先根据当前参考电流矢量在空间矢量平面的位置大致判断目标电压落在哪个60度大扇区只对这个扇区附近的电压矢量做候选集通常是7到9个计算量直接降到原来的三分之一。这个做法在动态突变瞬间可能会漏掉全局最优但实测影响很小因为漏掉的往往是距离很远的备选代价函数值本来就差。第二种思路是粗筛加精筛。第一轮用不含中点项、不考虑延迟补偿的简化代价函数对数个候选状态快速比较保留前5名。第二轮再用完整代价函数对保留的5个状态重新计算选出最终状态。由于简化代价函数的排序和完整版比较接近这个策略在工程上非常实用能把两步预测的27乘2次评估降到约10次以内。我把这套逻辑用在了样机上控制周期甚至能做到50微秒为死区补偿和故障保护留出了余量。4.3 传感器配置与LCL谐振的工程取舍预测模型里需要的状态变量是逆变器侧电流i1、网侧电流i2、电容电压uc。传感器装得越全模型越准但成本越高、安装越麻烦。LCL滤波器的电容电压与电网电压接近如果电网电压已经采样可以直接把电网电压近似当作电容电压使用吗从稳态看误差不大但动态过程中忽略了电容电流和电感压降会造成预测误差。在要求高的场合建议增加电容电压采样。还有一个隐性问题FCS-MPC基于模型直接控制网侧电流如果LCL模型参数因为温升、电感饱和发生了变化或电网阻抗有波动模型的预测精度下降系统可能重新激发出LCL谐振频段的振荡。工程上的补救措施主要有两条一是保留额外的电容电流有源阻尼支路与MPC并行补偿二是在预测模型里引入观测器比如降阶龙贝格观测器或卡尔曼滤波器在线估计电容电压或网侧电流提高模型对参数变化的适应能力。我自己的样机加了卡尔曼观测器后同样的MPC参数在电网阻抗变化40的时候电流THD基本保持稳定。这算是我最推荐的一笔投入。5. 从仿真到样机我踩过的坑和一些现场经验这一章聊的是仿真和实验的落差。MPC的论文大多止步于仿真波形完美但真正接上示波器、接上电网试验台架之后你会发现最麻烦的问题根本不是算法本身。5.1 仿真里一切正常为什么一上实机就炸我第一次把连续系统仿真改成离散化代码时犯过一个低级错误Simulink里面用的是变步长连续模型一个控制周期里的多个采样点系统输出平滑但DSP里控制周期是固定的而且所有计算必须在一个周期内完成。如果计算超时控制周期抖动相当于额外引入随机扰动这在LCL谐振频率附近会被放大成振荡。解决方法是先把整个MPC在离散定步长仿真理清步长和实际控制周期设为一致确保仿真波形正常后再上代码。第二个常见问题是坐标变换的参考基准。仿真里理想电网三相平衡锁相环一步到位。实机上电网电压有畸变、有相角跳变如果PLL的带宽调得过低参考电流的相位就会滞后MPC电流再准参考本身歪了并网功率也会跟着歪。我建议把PLL带宽设为300到500赫兹并在软件里对电网电压做前馈滤波防止谐波污染参考相位。5.2 死区、采样噪声与开关频率不固定的连锁反应NPC三电平每相四个开关管为了防止直通必须加入死区时间一般在2到4微秒。死区会让实际输出电压与理想开关状态不一致尤其在电流过零附近产生电压误差导致电流波形出现过零畸变。传统SVPWM可以靠死区补偿表修正MPC同样需要补偿。常见的做法是在发出开关状态前根据当前相电流方向修正占空比补偿量或者把死区时间纳入预测模型的输入电压修正项。我这里用了一种相对省事的方式在预测电压v中减去死区修正量实测效果明显轻载下的过零畸变肉眼可见地减小。采样噪声在MPC里比在PI控制里更值得重视。因为MPC用当前采样值预测未来状态高频采样噪声会被直接放大到误差通道。我建议硬件上用隔离型A/D转换器并加模拟低通滤波软件上在同步采样点取多次平均。要注意的是滤波器引入的延迟要尽量小否则又抵消了MPC动态响应快的优势。5.3 启动冲击、参考突变的应对和过流保护兜底FCS-MPC因为每一步都在寻找最优开关状态动态响应极快但如果参考电流发生大幅突变预测控制很容易给出足够大的电压矢量导致实际电流尖峰超过功率器件耐受值。启动时刻尤其危险因为初始电流为零而参考电流可能是满载。我的处理方案是参考电流加S形斜坡限制通常设定爬坡时间为10毫秒以上同时把电流偏差项做饱和处理当误差超过额定值一定比例时代价函数值直接设为一个超大数强制避免选择会进一步推高电流的状态。说白了就是在代价函数里加一个隐式约束优先保证不发散再追求最优性。另外MPC没有独立调制器一旦驱动信号异常保护电路必须独立于算法工作。我在样机上额外做了硬件过流保护和直流母线过压保护响应时间在微秒级和算法无关。原理上MPC是软保护硬件保护是硬兜底两者缺一不可。我自己从一开始对MPC将信将疑到后来把它当作三电平并网逆变器多目标控制的默认选项这中间确实走了一些弯路。如果现在有人问我从零开始做LCL型NPC并网逆变器的FCS-MPC我大概率会建议他先认真把离散化矩阵算准、把延迟补偿写好这两个地基打牢后面加中点电压、加观测器、降计算量都是水到渠成的事。至于那些示波器上才看得到的坑多烧几次实验板就全都记住了。