☰
NPC三电平中点电位平衡:最优零序电压注入法仿真复现全解析
2026/10/24 4:32:04 网站建设 项目流程

做三电平仿真的人,基本都绕不开NPC拓扑的中点电位问题。最近我按一篇顶刊论文的思路,把“基于最优零序电压注入法的二极管钳位型NPC三电平中点电位平衡”完整复现了一遍。这篇博文我会把这个策略从数学原理、Simulink搭模、参数整定到波形验证的完整链路拆开讲透。适合两类人看:一类是刚接触NPC三电平、想搞懂中点电位平衡物理本质的研究生;另一类是已经在做三电平工程应用、想优化现有平衡策略的工程师。即使你手上没有原论文,跟着这篇内容也能搭出可运行的仿真模型。

1. NPC三电平中点电位问题:从物理根源到零序电压注入思路

1.1 中点电位为什么会失衡

二极管钳位型三电平逆变器(NPC)的结构核心是两个直流电容串联,中点O引出作为第三电平。理想情况下,两个电容各承担母线电压的一半,输出相电压能在P、O、N三个状态之间平滑切换。但实际运行中,中点电位会持续偏离Vdc/2,这不是器件误差造成的偶然现象,而是拓扑本身的结构性问题。

问题出在中点电流上。每个开关周期内,只要某相桥臂输出O状态,负载电流就会流经中点。三个桥臂的O状态占空比不同,流过中点的电荷量也就不为零,这些电荷在两个电容之间重新分配,导致分压失衡。负载不平衡时更严重,三相参考波不再对称,中点电荷偏差积累,电压差会越来越大。

中点电位失衡的后果很直接:输出相电压波形畸变,低次谐波增加;开关管承受的电压不再均匀,接近外侧的器件容易出现电压应力过高;电容电压不平衡还会导致保护误动作,长时间运行甚至可能击穿器件。所以中点电位平衡不是锦上添花的功能,而是NPC逆变器可靠运行的前提条件。

1.2 传统平衡方案有哪些短板

早期工程上最常用的是滞环控制:检测两个电容电压差,一旦超过阈值,就通过查表调整SVPWM中小矢量或中矢量的作用时间,人为改变流过中点的平均电流。原理很好理解,但缺点也很明显,滞环动作是离散的,响应天然带抖动,平衡效果受调制比和负载功率因数影响较大。

后来出现了虚拟矢量法,通过在同一扇区内合成虚拟中矢量来避免中点电流波动。效果确实好,但计算量明显上升,而且需要预先构造开关状态序列,实现起来比较繁琐,调制比范围也受到一定限制。

我做了个简单的方案对比,方便直观判断:

方案控制量优点缺点
滞环中点平衡小矢量作用时间查表思路直观,实现简单开关频率不固定,动态响应一般
虚拟矢量法空间矢量组合方式中点电压波动小计算量大,实现繁琐
零序电压注入法连续零序电压调制域内解析求解,动静态性能均衡需要较精确的中点电流模型

这些传统方案本质都在控制中点电流,但控制量是离散的。如果能直接在调制波上加一个连续可调的零序电压,把平衡过程纳入连续控制框架,很多离散逻辑带来的问题就都规避掉了。

1.3 为什么零序电压注入能成为主线

零序电压注入法的第一优势在线电压不敏感。三相参考波同时叠加同一个零序电压,线电压完全不变,负载电流也不变,变的只有每相开关状态的占空比分配。也就是说,零序电压可以在不影响输出品质的前提下,调节三个桥臂O状态的作用时间组合,由此控制中点电流。

第二优势是可以解析求解。中点电流与零序电压之间是分段线性关系,给定一个期望的中点电流值,能在一个开关周期内反解出对应的最优零序电压,不需要查表、不需要扇区判断,和数字控制天然契合。这也是顶刊论文选择这条技术路线的主要原因。

2. 原理拆解:中点电流模型与最优零序电压的解析求解

2.1 中点电流与零序电压的显式关系

先把调制波归一化到[-1,1]区间。设某相参考波为vj*,加入零序电压u0后,实际调制波变成:

$$ v_j' = v_j^* + u_0 $$

在NPC三电平SPWM中,每相桥臂在一个开关周期内输出P、O、N三种状态。若vj'>0,P状态占空比为vj',O状态占空比为1-vj';若vj'<0,N状态占空比为|vj'|,O状态占空比为1-|vj'|。两种情况统一起来,O状态占空比就是:

$$ d_{jO} = 1 - |v_j^* + u_0| $$

重点来了。只有O状态导通时,负载电流才会流经中点O。以流入中点为参考方向,一个开关周期内的平均中点电流可以写成:

$$ i_{NP}(u_0) = -\sum_{j=a,b,c} d_{jO} \cdot i_j = -\sum_{j=a,b,c} \left(1 - |v_j^* + u_0|\right) i_j $$

这里的负号约定与三相电流正方向有关,不同文献定义可能相反,做仿真时需要通过方向试验确认,但推导结构本身不受影响。

这个式子看起来简单,却包含一个关键特点:|vj*+u0|在u0=-vj*处有拐点,因此iNP(u0)是零序电压的分段线性函数。分段线性意味着不需要复杂的非线性求解,每个区间内都可以直接用直线方程处理。

2.2 分段线性求逆:最优注入值怎么算

所谓最优零序电压,就是在当前开关周期内,给定一个期望中点电流iNP_ref,反解出满足方程的u0值。因为iNP(u0)是分段线性的,反解过程非常直接:把零序电压的可行区间内所有拐点找出来并按大小排序,形成若干连续小区间;在每个小区间内,中点电流与u0呈线性关系,直接解直线方程即可。

具体步骤拆开是这样:

  1. 计算零序电压边界。u0必须保证三相调制波都在[-1,1]内,所以: $$ u_{min} = -1 - \min(v_a^, v_b^, v_c^) $$ $$ u_{max} = 1 - \max(v_a^, v_b^, v_c^) $$
  2. 找出所有落在[u_min, u_max]内的拐点,即u0 = -vj*的点。
  3. 按顺序切分出连续区间,逐一检查目标中点电流是否落在该区间能实现的范围。
  4. 找到可行区间后,用线性插值求出精确的u0值。

如果所有区间都无解,说明本周期零序电压已经饱和,只能选择边界中使中点电流误差更小的一端。这个兜底逻辑在过调制工况下特别重要,后面仿真参数整定章节会展开说。

这里说一句“最优”的含义:所谓最优,并不是玄学意义上的全局最优化,而是在保证线电压不受影响、调制波不越界的前提下,精确获得期望中点电流所需的最小零序修正量。它比滞环控制“只推方向”要精准得多。

2.3 目标中点电流由闭环生成:从电压差到指令

期望中点电流iNP_ref从哪里来,答案是一个简单的电压闭环。检测两个电容电压,计算差值ΔVc = Vc1 - Vc2,通过PI控制器输出中点电流指令:

$$ i_{NP_ref} = K_p \Delta V_c + K_i \int \Delta V_c , dt $$

这个指令送到零序电压求解函数,反解出u0后叠加到三相参考波上,就构成了完整的闭环。PI输出的连续指令与零序电压的连续解算框架天然匹配,这是方案能稳定工作的关键。

需要特别强调的是,PI输出的电流方向和模型中的中点电流正方向必须一致。如果方向反了,整个闭环会变成正反馈,中点电压不仅不平衡,还会剧烈发散。这个问题我会在第四章专门讲验证方法。

3. Simulink模型搭建实战:从主电路到核心算法函数

3.1 顶层架构与模块选型

模型分成三层。主电路层用Simscape Electrical自带的NPC三电平桥模块,比手动搭四个IGBT加二极管可靠得多,中点引出和钳位二极管都内置好了。直流侧用两个电容串联,注意标定初始电压为Vdc/2。负载用三相星形RL负载,不加中线,这样零序电压不会在负载侧形成电流通路,符合实际应用场景。

控制层负责生成参考波和计算零序电压。如果只是为了验证中点平衡算法,开环正弦给定就够用,三相正弦源的幅值就是调制比m。这样做的好处是波形干净,便于观察零序注入对中点电流的影响。外层再加闭环控制不影响平衡算法的验证逻辑。

PWM层负责把叠加零序后的调制波转换成开关脉冲。这里不要直接用两电平的PWM模块,三电平SPWM用的是两层叠载波逻辑,具体见3.3节。

3.2 核心算法函数:零序电压计算的MATLAB实现

我一开始也想照搬论文里的闭式公式,但后来发现直接用通用断点扫描法反而更稳,因为它不依赖固定的扇区表,三相参考波即使不对称也能正常工作。在Simulink里用一个MATLAB Function模块实现,代码如下:

function uO = calcU0(vref, Iphase, iNP_ref, uMin, uMax) % vref: 三相归一化参考电压 [va; vb; vc],不含零序 % Iphase:三相负载电流 [ia; ib; ic] % iNP_ref: 中点电流期望值,正方向与模型标定一致 % uMin, uMax: 零序电压可行区间 % 输出 uO:本周期最优零序电压 breaks = [uMin, uMax]; % 收集落在可行区间内的斜率拐点 for k = 1:3 b = -vref(k); if b > uMin && b < uMax breaks = [breaks, b]; end end breaks = unique(sort(breaks)); % 逐段检查目标中点电流是否可行 for m = 1:length(breaks) - 1 uL = breaks(m); uR = breaks(m + 1); iL = midCurrent(vref, Iphase, uL); iR = midCurrent(vref, Iphase, uR); if (iL - iNP_ref) * (iR - iNP_ref) <= 0 % 线性插值求根 if abs(iR - iL) < 1e-9 uO = 0.5 * (uL + uR); else uO = uL + (uR - uL) * (iNP_ref - iL) / (iR - iL); end uO = min(max(uO, uMin), uMax); return; end end % 无解时,选择边界中使中点电流误差更小的一侧 errL = abs(midCurrent(vref, Iphase, uMin) - iNP_ref); errR = abs(midCurrent(vref, Iphase, uMax) - iNP_ref); if errL < errR uO = uMin; else uO = uMax; end end function iNP = midCurrent(vref, Iphase, uO) va = vref(1) + uO; vb = vref(2) + uO; vc = vref(3) + uO; ia = Iphase(1); ib = Iphase(2); ic = Iphase(3); iNP = -((1 - abs(va)) * ia + (1 - abs(vb)) * ib + (1 - abs(vc)) * ic); end

代码逻辑分三块:构造断点区间、逐段找解、无解兜底。每一段内容都不复杂,但有两个细节值得注意。第一,插值前要判断斜率是否接近零,否则会出现除零错误;第二,函数入口和出口都做了限幅处理,防止注入电压越界导致调制波超出[-1,1]。

调用时注意信号维度。Simulink里需要把三相参考电压和三相电流分别用Mux捆成3×1向量,再作为函数输入,函数内部按向量处理。

3.3 调制波重构、PWM比较与死区处理

三电平SPWM不能像两电平那样直接用一个三角载波比较,正确做法是上下两层叠载波:上载波范围[0,1],下载波范围[-1,0]。每相调制波vj'与两层载波分别比较:

  • vj' > 上载波,该相输出P状态;
  • vj' < 下载波,该相输出N状态;
  • 其余情况输出O状态。

这样一组比较器加逻辑判断就能生成P/O/N状态。在Simulink里可以用两个Relay模块加一个多路开关搭出来。这个逻辑虽然简单,但很多人第一次搭会直接用单载波,结果PWM波形完全不对。

死区处理也要跟上。NPC三电平每相四个开关管,上下桥臂互补对之间都要留死区,否则会出现直通短路。仿真中死区时间取1~2微秒即可,用Simulink的On/Off Delay模块实现。死区虽然只影响微秒级时间尺度,但对中点电流平均值的精度有不可忽略的影响,尤其是轻载工况,不能省略。

采样时刻对齐是另一个关键。零序电压更新时刻必须与三角载波同步,建议在每个载波周期的谷底触发采样并更新u0,然后在一个开关周期内保持恒定。如果零序电压在一个载波周期内多次变化,调制波会出现高频抖动,波形难看不说,还会产生额外的谐波分量。

3.4 一套可直接启动仿真的参数表

模型搭好后,最头疼的是不知道参数从哪开始调。我这里给出一组我实测能跑出稳定结果的初始参数,先在这组参数上跑通,再根据自己课题调整:

参数取值说明
直流母线电压 Vdc400 V上下电容各200V
直流侧电容 C1/C2各1000 uF先出效果再调小
三相负载 R/L10 Ω / 5 mH星形连接
基波频率50 Hz三相正弦给定
载波频率5 kHz三角波
调制比 m0.8离过调制区有裕量
PI参数Kp=0.05, Ki=5方向验证后再细调
仿真步长1e-5 s离散求解器
死区时间1e-6 s互补管间死区

这套参数的容错空间比较大。电容用1000uF可以让中点电压波动明显,但又不会快到让PI跟不上;载波频率5kHz既能保证仿真速度,又能体现谐波改善效果。跑通后再按自己的电压等级和功率等级等比例缩放。

4. 仿真参数整定与实操避坑心得

4.1 直流侧电容选型与初始状态处理

电容容值决定两个电容之间的电荷转移阻抗。电容越大,同样的中点电流扰动造成的电压波动越小,稳态纹波自然更小,但动态响应会变慢,电容成本和体积也会上升。我测试时把1000uF换成470uF,中点电压波动峰峰值大概翻了一倍,但PI参数也需要跟着调整。如果只想验证算法逻辑,先用大电容是最省心的。

初始状态这一步特别容易忽略。两个电容的初始电压如果没有设置,Simulink默认从0开始,开通瞬间会出现巨大的充电电流,中点电压的初始偏差会让PI控制器一开始就饱和。正确做法是把两个电容的初始电压都设为Vdc/2 = 200V,让系统从一个物理上合理的平衡点启动。

4.2 平衡环PI方向验证与增益整定

方向验证是整定过程中最值得花五分钟的地方。PI输出是电流指令,但它到底是“流入中点为正”还是“流出为正”,取决于你模型里的电流方向定义。把代码里所有正负号看一遍容易绕晕,更高效的做法是直接做开环方向实验。

具体操作这样:把PI控制器暂时断开,给iNP_ref一个固定的负值(比如-1),跑一小段仿真看Vc1-Vc2的变化方向。如果给负的电流指令能让上电容电压下降,说明当前模型方向匹配正确;如果方向相反,把PI输入误差从(Vc1-Vc2)改成(Vc2-Vc1)即可。这一步只要五分钟,能省掉后面两小时查符号的功夫。

PI参数整定遵循先比例后积分的顺序。首先把Ki设为0,只加Kp,从小到大慢慢加,观察中点电压波形是否振荡。Kp太小,平衡速度不够,中点电压会长期偏离平衡点;Kp太大,整个平衡环会出现高频振荡,调制波也跟着抖动。找到一个波形不过冲又有明显收敛速度的Kp后,再加Ki消除稳态误差。

Ki的作用是解决“平衡到一定程度就不动了”的问题。由于负载恒定时中点电流也存在周期性脉动,纯比例控制会留下一个小的静态偏差,积分项可以把偏差压到接近零。但Ki过大同样会引发低频振荡,我的经验是Ki从Kp的50到100倍开始试,逐步增大直到稳态纹波不再改善为止。

4.3 采样时刻对齐与仿真步长选择

零序电压是离散更新的,采样时刻直接影响控制效果。如果采样时刻与PWM载波不同步,相当于在一个开关周期内插入了相位抖动的采样信号,输出波形会出现杂散边带,仿真波形看起来像蒙了一层毛玻璃。

正确做法是在三角波谷底生成一个触发脉冲,用它驱动采样保持模块,把三相参考电压、三相电流和电容电压同步采样,再送入calcU0函数计算零序电压。整个开关周期内保持该值不变,下一个载波周期再更新。这样处理之后,调制波干净很多,中点电压包络也比不同步时规整。

仿真步长方面,固定步长取载波周期的百分之一左右比较合适。5kHz载波对应周期200us,步长取2us到10us都能跑,先用10us调算法,确定结果后再加密到2us看精细波形。如果步长太大,PWM比较事件会被错过,中点电流平均值计算失真,平衡效果自然好不了。

4.4 注入电压限幅与过调制兜底逻辑

零序电压不是想注入多少就注入多少,它必须保证三相实际调制波都在[-1,1]范围内。超出范围的调制波在PWM比较时会被截断,产生非线性畸变,这个限幅逻辑必须放在算法的最前端和最末端。

在过调制或者负载极端不平衡时,目标中点电流可能超出了当前零序电压能够实现的范围。此时函数会走到无解分支,把注入电压钳位在边界上。这里有一个容易踩的坑:无解分支返回边界值后,外面还要再钳位一次,确保u0确实落在[u_min,u_max]内。我最初写代码时忽略了入口钳位,导致过调制工况下参考波仍然越界,输出波形出现削顶平台。

兜底逻辑还有一个细节:边界处误差比较用的是“电流误差更小”,而不是简单固定选左边界或右边界。因为在某些扇区,单边边界可能让误差更大,导致平衡速度变慢。实测下来,动态工况下选择误差更小的边界,收敛速度大约能提升20%~30%。

5. 波形验证与效果评估:怎么看这套方案到底行不行

5.1 稳态波形判读:调制波、中点电压与线电压

模型跑通后,第一件事看调制波。叠加零序电压后的三相调制波不再是纯正弦,而是类似马鞍形或不规则平台形的波形,这是正常的,说明零序注入确实在起作用。如果调制波在某段出现明显的突变或峰值超过±1,说明限幅逻辑没有生效,优先检查边界计算。

第二件事看两个电容电压波形。平衡算法正常投入时,Vc1和Vc2会围绕200V上下镜像波动:一个高的时候另一个低,两者差值的包络平稳且周期等于基波周期的三分之一。这个三分之一周期特征对应三相断点在一个完整工频周期内出现的规律,是判断算法是否真正在工作的一个重要标志。

第三件事看输出线电压FFT。取线电压波形做频谱分析,关注低次谐波和开关频率边带。中点电位失衡时,输出会带有明显的三倍频分量和不对称边带;平衡后这些分量显著下降。我测试的一组参数下,谐波含量相比无平衡控制时有明显改善,波形毛刺也规整了很多。

5.2 动态工况下的收敛表现

稳态验证通过后,一定要做动态工况测试。最简单的方式是在仿真中给负载加一个阶跃:0.3s时从满载切换到半载,观察中点电位是否能在短时间内回到平衡带内。

在我实测的一组参数下,负载突变瞬间,中点电压会出现一个短暂的偏移尖峰,最大偏差在2V左右,随后在两个工频周期内被拉回到0.5V以内的波动带。响应速度主要受Kp影响,Ki负责最后的稳态收敛。如果收敛时间明显拉长,检查是不是采样不同步或PI输出被饱和限幅了。

动态测试还要覆盖参考波突变的场景,比如调制比从0.4跳到0.8。调制比越高,中点电流的可控范围越小,平衡难度越大。高调制比下如果算法仍能保持平衡,说明方案在工程应用范围内有足够裕量。

5.3 三种方案横向对比:纹波、THD与复杂度

我另外搭了两个对照组:一组完全不加平衡控制,另一组用常规滞环查表修正。这样对比更直观。某次典型仿真结果如下:

方案中点电压波动(峰峰值)输出线电压THD动态响应实现复杂度
无平衡控制约±8V较高无最简单
滞环查表修正约±3V中等有迟滞抖动中等
最优零序电压注入约±1V以内明显改善快,无超调略高但易实现

这个对比说明两个问题。第一,滞环方案能做到基本可用,但控制精度受阈值限制,动态工况下容易在两个阈值之间反复切换,产生额外的低频抖动;第二,零序电压注入法把中点电流当成连续被控量,理论上限更高,动态表现也更平滑。

5.4 判定算法生效的三条标准

做仿真验收时,我习惯用三条标准快速判断算法是否真的生效,而不只是波形“看起来差不多”。

第一,中点电压的直流偏差应被压到接近零,而不是仅仅减小纹波。如果波形在某一侧长期偏高,说明PI积分项没起作用或符号有误。

第二,中点电压波动包络应呈现规律的三倍工频周期特征。如果包络中出现随机跳变或拍频,说明采样不同步或限幅逻辑有问题。

第三,输出线电压谐波应明显改善,尤其是三倍频分量和不对称边带。如果谐波反而变差,优先检查调制波是否在PWM比较阶段被截断。

这三个标准可以快速定位算法失效的方向,不用对着波形猜来猜去。

6. 常见问题与排查实录:我踩过的那些坑

6.1 高频问题速查表

把仿真中常见的现象、原因和处理方法整理成了一张表,排查问题时可以直接对照:

现象可能原因处理建议
中点电压发散不收敛PI符号方向反了做方向验证,交换误差顺序
调制波在载波周期内剧烈抖动采样时刻未与载波同步改为载波谷底触发采样
中点电压纹波偏高电容太小或PI带宽低加大电容,按先比例后积分顺序整定
输出波形出现拍频毛刺仿真步长过大步长设为载波周期的1/100以内
过调制区算法失效零序电压无可行域用边界最小误差兜底,并做限幅
启动瞬间电流冲击大电容初始电压不对称初始化Vc1=Vc2=Vdc/2
稳态存在恒定偏差积分项失效或饱和检查Ki,确认PI输出未到限幅

这张表覆盖了我复现过程中遇到的大部分问题,最后一项“PI输出饱和”尤其容易被忽略。当PI输出超过函数能够实现的范围时,积分项会一直累积,出现较大的稳态偏差,需要在PI后面加一个与函数可行范围匹配的饱和度处理。

6.2 三个值得复盘的具体案例

第一个案例是PI输出被当成零序电压直接用。最初搭模型时,我想当然地认为PI输出就是u0,直接叠加到三相调制波上,结果中点电压波动确实比无控制时小了,但对负载阶跃的响应非常迟钝。后来重新看原理才意识到,PI输出是期望中点电流,必须经过零序电压求解函数反解后才能得到实际的u0。这是两类完全不同的物理量,不能混淆。

第二个案例是载波同步问题。第一次跑动态仿真时,中线点电压波形上有明显的锯齿状抖动,我一度以为是PI参数没调好,不断试数也无济于事。后来把零序电压的更新时刻从连续更新改成“载波谷底触发、全周期保持”之后,波形立刻干净了。问题本质是PWM比较与零序更新的时间基准不一致,产生了类似采样混叠的效果。

第三个案例是过调制工况下的削顶。调制比调到0.95时,输出线电压波形顶部出现明显的平台,像被切了一刀。查代码发现零序电压求解的无解分支返回边界值后,没有再对调制波进行钳位,导致实际调制波超出1并进入过调制区。在函数出口统一做了一次u0的min/max钳位后,平台消失了。这个坑说明限幅不是只做一次的事,应该在链路的每个关键节点都检查一遍。

6.3 可以继续深入的几个扩展方向

这套算法往工程走有几个方向可以继续做。第一,把零序电压注入的视角与SVPWM统一起来——两者本质是同一件事的不同表现形式,零序电压注入相当于在连续域内实现了SVPWM的零矢量分配优化,两种视角可以相互验证。第二,把模型推广到ANPC、T型拓扑等其他三电平结构,只需要修改中点电流与开关状态的映射关系,整体求解框架不用变。第三,配合载波层叠调制做单周期内两次更新,进一步提升动态响应速度。

如果做硬件在环或者嵌入式实现,把MATLAB Function代码改写成C语言也不困难,函数本身没有查表和复杂逻辑,只有排序、线性插值和限幅,非常适合跑在定点DSP上。我当时把断点扫描部分优化成c代码后,单次调用耗时比用浮点仿真的预期快了一个数量级以上。这也是我推荐这个方案做工程落地的重要原因——它不是一个只存在于仿真里的理论花样。

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

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

立即咨询