做三电平NPC逆变器这几年,我越来越觉得中点电位是绕不过去的一道坎。无论是做并网变流器、电机驱动还是储能PCS,只要拓扑选了三电平二极管钳位型NPC,中点电位漂移和低频振荡就一定会找上门。最近我在复现一篇IEEE顶刊上关于“最优零序电压注入”的中点电位平衡策略,想法很直接:与其靠PI参数一点点试平衡效果,不如在每个载波周期内直接求出一个最优的零序电压值,让中点电流趋近于零。整套方法在Matlab/Simulink里验证下来,效果比常规SPWM、甚至比经典SVPWM冗余小矢量分配都干净,尤其在中高压大功率场景下,开关频率低、电容容量受限,这种解析式平衡策略的优势非常明显。
这篇博文我会从原理讲到仿真,把NPC拓扑的失衡机理、零序电压为什么能平衡中点、最优解怎么求、仿真模型怎么搭,到实际调试中遇到的那些坑,全部展开。内容偏工程和技术复现,适合正在做三电平变流器控制、写毕业论文电力电子方向,或者想把手头NPC项目的中点电压纹波压下去的工程师参考。如果你之前只见过“PI调节零序分量”那种经验做法,这篇能帮你把背后的数学逻辑补完整。
1. 中点电位问题为什么值得花大力气搞
1.1 NPC三电平拓扑的基本工作逻辑
二极管钳位型三电平NPC拓扑,单相桥臂由4个开关管、4个续流二极管和2个钳位二极管组成,直流侧上下两个电容串联,形成正母线P、中点O、负母线N三个电平。以A相为例,通过控制4个开关管的通断组合,A相输出端可以被钳位到直流母线正端、中点和负端三个不同的电位,分别对应P、O、N三种状态,每个状态下各有2个开关管导通:
- 输出P状态:S1和S2导通,S3和S4关断,输出电压为+Udc/2
- 输出O状态:S2和S3导通,S1和S4关断,输出电压为0
- 输出N状态:S3和S4导通,S1和S2关断,输出电压为-Udc/2
由于每相输出电压有三种状态,三相组合理论上有27种开关状态。二极管钳位拓扑最大的好处是开关管耐压只需母线电压的一半,输出电平数多,谐波含量低,电磁干扰也比两电平好,所以在中高压变频器、轨道交通牵引、海上风电并网这些工况里非常常见。但代价就是拓扑里多了一个“中点”,这个点一旦电位不稳,整套系统都会跟着遭殃。
1.2 中点电位为什么会漂移
中点电位的本质是直流母线上下两个电容的电压分配关系。理想情况下Uc1等于Uc2,各占Udc/2,中点电位就是零。但实际运行中,只要有一个开关周期内流入或流出中点的电流平均值不为零,上下电容的电荷量就会失衡,中点电位就开始偏移。造成这种情况的来源有很多:
- 三相调制波不对称,导致P状态和N状态的占空比分配不均
- 负载不对称,三相电流的瞬时值不再满足严格的对称关系
- 上下电容参数不一致,或者电容老化导致容量偏差
- 开关管导通压降、死区时间等非理想因素引入附加的不平衡分量
- 功率因数较低时,中点电流的基波分量增大,振荡加剧
用一个更加数学化的表达,定义开关函数Sx为1、0、-1分别对应P、O、N三种状态,那么中点电流io满足:
io = -(Sa·Ia + Sb·Ib + Sc·Ic)
注意这里的电压和电流方向以及符号定义,不同文献略有差异,但物理本质一致:如果是三相平衡且没有零序通路时,三相电流之和为零,可中点电流未必为零,因为Sa、Sb、Sc三相开关状态不可能永远保证加权和为零。只要开关状态组合在某些扇区产生中点电流,电容电压就会变化。也就是说,中点电位失衡不是偶发故障,而是NPC拓扑的“结构性宿疾”。
1.3 不处理会有什么后果
中点电位不平衡直接带来的问题就是功率器件电压应力不均。上桥臂开关管承受的电压变成Uc1,下桥臂承受变成Uc2,如果偏差持续加大,某一侧开关管可能超过额定耐压,直接击穿。电气上还有个更隐蔽的问题:输出线电压会出现低次谐波,尤其是3次、6次这类零序相关分量,导致电机转矩脉动增大,并网电流谐波超标。
在工程现场我见过最夸张的情况是,一台三电平变频器满载运行时没有做中点平衡控制,中点电位偏移到超过母线电压的10%,结果一段时间后直流母线电容鼓包,IGBT模组烧毁。所以中点电位的平衡不仅仅是一个“控制精度”问题,它直接关系到系统的可靠性。
2. 零序电压注入为什么能平衡中点
2.1 从调制波角度理解零序电压
三相调制波叠加一个相同的分量,就是零序电压注入,公式非常简单:
ua' = ua + uz ub' = ub + uz uc' = uc + uz
关键在于,零序电压只改变三相调制波的共模电平,不会影响线电压(因为线电压是两相之差,共模分量被抵消),所以负载上的基波电压完全不受影响。但从PWM调制的角度看,三相调制波整体抬升或降低之后,每一相与三角载波的交点发生变化,P状态和N状态的占空比分配改变了。也就是说,零序电压不影响“输出的电压大小和相位”,却能影响“每个开关周期内三相各状态的时间分配”,这个特性正好拿来调节中点电流。
可能有人会问:既然零序电压不影响线电压,那它是不是随便加都可以?理论上是,但工程上要受到调制约束。叠加零序之后,三相调制波不能超过三角载波的幅值范围,否则进入过调制区,输出波形就会失真。因此uz有一个可行的取值范围,任何零序注入方法的第一步都是确定这个范围。
2.2 一个开关周期内中点电流的平均值
研究平衡策略不能只看瞬时的io,因为PWM的开关频率远高于基波频率,我们需要的是一个载波周期内流入中点的电荷量(或者说平均中点电流)。把开关函数在一个开关周期内做平均,用占空比来近似,那么一个开关周期内的平均中点电流可以写成:
io_avg ≈ -(Da·Ia + Db·Ib + Dc·Ic)
这里的Da、Db、Dc是各相P状态相对于O状态、以及O状态相对于N状态的等效占空比。对于采用同相层叠双载波的三电平PWM,在不发生钳位时,占空比和调制波之间存在线性关系,可以认为Dx正比于注入零序后的调制波ux'。
把ux' = ux + uz带入,能得到一个有意思的结论:当三相调制波都处于线性调制区内、没有发生饱和钳位时,三相占空比之和为(ua+ub+uc)+3uz。这时如果三相负载电流对称恒有Ia+Ib+Ic=0,那么uz乘以电流和这一项等于零。也就是说,在没有钳位的情况下,叠加零序电压并不会改变中点电流平均值。真正让零序注入起作用的,其实是调制波被限制在±1以内产生的“钳位效应”。
2.3 钳位效应才是零序电压起作用的关键
当某个调制波uk'叠加uz之后正好跨出线性区边界,比如大于+1或者小于-1,这一相在整个载波周期内就会固定输出P状态或N状态,这一相的占空比不再随uz变化。剩余两相仍然保持线性调制,它们的占空比随uz线性变化。此时三相电流之和为零的约束依然成立,但是“钳位相”的电流贡献变成了固定值,剩下两相电流之和恰好等于负的钳位相电流,于是中点电流平均值就变成了关于uz的线性函数,斜率就与钳位相的电流相关。
用大白话说,只有让某一相进入“饱和区”,三相PWM的不对称性才会表现出来,零序电压才能对中点电流产生实质性的推拉作用。这个发现解释了为什么很多经验做法里,只是机械地叠加一个PI计算出来的零序量,有时候平衡效果好,有时候完全没反应——因为uz的取值范围不在能使调制波进入钳位的区间,或者三相电流刚好较小,产生的调节能力很弱。
2.4 与SVPWM之间的等效关系
研究过三电平SVPWM的朋友应该知道,传统SVPWM实现中点平衡是靠切换正负小矢量的作用时间。小矢量对中点电流的影响相反,正小矢量让中点电位朝一个方向移动,负小矢量朝另一个方向移动,通过调整两者在一个载波周期里的时间占比,就能控制电荷量。而零序电压注入思路实际上是在载波PWM的框架下,通过改变三相调制波的共模分量来确定参考电压矢量在空间矢量图中的精确位置,它的本质与SVPWM中调整小矢量时间分配是一致的。
所以经典SVPWM可以理解为一种特殊的零序电压注入方法。但SVPWM实现起来要判断扇区、查表、算矢量作用时间,比较繁琐;而直接做载波PWM加零序电压计算,从工程实现角度更简单,尤其适合在FPGA或DSP里实时执行,灵活性和扩展性都好得多。这也是顶刊论文很多都在“零序电压注入”框架下展开的原因。
3. 最优零序电压注入:把平衡问题变成一个求最值问题
3.1 确定零序电压的可行域
要实现最优注入,先得清楚uz能取哪些值。回到三相调制波ua、ub、uc,叠加uz之后,每一相都必须落在三角载波的线性调制范围内,即[-1, +1]区间。这是一组不等式:
-1 ≤ ua + uz ≤ 1 -1 ≤ ub + uz ≤ 1 -1 ≤ uc + uz ≤ 1
也就是说,uz必须同时大于等于所有(-1-ux)里的最大值,同时小于等于所有(1-ux)里的最小值。下界是uz_min = max(-1-ua, -1-ub, -1-uc),上界是uz_max = min(1-ua, 1-ub, 1-uc)。这个可行区间反映了当前时刻调制波的裕量。当三相调制波比较均衡时,可行区间较大;当某一相调制波接近边界时,可行区间会收窄。
3.2 把目标函数建起来
最优零序电压注入的核心目标,是在可行域内选择一个uz,使得在这个载波周期内流入中点的电荷量最小。如果把中点电荷变化量表示成:
ΔQ = -io_avg(uz) · Ts
那么Min|io_avg(uz)|就等价于让每个开关周期内中点电荷变化最小。由于前面已经说明,当三相调制波都在线性区时io_avg和uz无关,只有当某一相或两相进入饱和区时,io_avg才随uz变化,所以io_avg(uz)整体是一个关于uz的分段线性函数,并且是连续的。
既然是分段线性函数,最小值一定出现在两种位置:一个是某个线性段的端点(即钳位边界),另一个是某个线性段内部io_avg等于零的点。所以整个求解过程不需要用优化迭代算法,只需要解析地找几种候选解,再检查是否落在可行域内,就可以获得全局最优的uz。
3.3 解析式的具体推导思路
在实际推导时,先根据三相调制波叠加uz之后与上下边界±1的交点,把可行区间分成若干个子区间。在每个子区间内,每一相的状态是确定的(比如A相饱和为P,B、C相线性调制),此时io_avg(uz)的表达式是线性的:
io_avg(uz) = -[Ia·Da(uz) + Ib·Db(uz) + Ic·Dc(uz)]
由于Da、Db、Dc中饱和相的占空比是常数±1,线性项只来自未饱和相,斜率就是未饱和相电流的某种组合。令该表达式为零,解出候选uz*,如果这个候选值落在当前子区间内,那它就是该子区间的最优解;如果不在,就取该子区间的边界。把所有子区间的候选解和端点解代入io_avg,取绝对值最小的那个,就是全局最优零序电压。
实际编程实现时不需要真的去解复杂的方程,因为三相电流和调制波在每个采样时刻都是确定的,最多只需要判断几次不等式的分支,三五个条件分支就能求出uz。这也是这个方法很适合数字控制器的原因——计算量极小,没有迭代,没有矩阵求逆,十几个周期指令就能完成。
3.4 离散化与闭环校正
上面推导出的最优uz是“让中点电流最小”的开环最优解。理论上如果每个开关周期都能精确做到中点电流为零,中点电位就会自然稳定。但实际系统中存在死区、电容参数偏差、电流采样误差等扰动,所以还需要叠加一个轻量的闭环校正。比较常见的做法是:
uz_final = uz_opt + kp·(Uc1 - Uc2) + ki·∫(Uc1 - Uc2)dt
这里的最优解负责“大部分平衡工作”,PI部分负责消除模型误差和硬件不对称带来的残余偏差。和纯PI零序注入相比,这种混合方式的PI参数不需要调得很激进,系统的稳定性和动态响应都要好很多。我实测下来,只要最优解部分逻辑正确,PI的kp在0.05量级就足以把稳态偏差压到几乎为零,不需要像纯PI那样小心翼翼地去调参数防振荡。
4. 仿真模型怎么搭
4.1 仿真平台和参数选择
我用的仿真环境是Matlab/Simulink加Simscape Electrical,主电路用Simscape元件搭建,控制逻辑用普通Simulink模块和Matlab Function实现。如果你更习惯PLECS,也可以完全照搬这套逻辑,PLECS在开关模型仿真速度上更快,但Simulink生态下的信号处理模块更方便,适合做控制策略验证。
这里给一组可以复现的仿真参数,供参考:
| 参数 | 数值 |
|---|---|
| 直流母线电压 Udc | 200V |
| 上下电容 C1、C2 | 1000μF |
| 负载电阻 R | 10Ω |
| 负载电感 L | 5mH |
| 载波频率 fc | 5kHz |
| 基波频率 f | 50Hz |
| 调制比 m | 0.8 |
| 功率因数 | 约0.8(感性) |
| 仿真步长 | 1μs定步长 |
功率等级不需要拉得太高,仿真目的是验证控制算法,低压平台已经能体现所有关键波形特征。把母线电压设到200V而不是几千伏,纯粹是为了调试方便、结果直观,不影响算法验证的结论。
4.2 主电路和PWM生成逻辑
主电路按经典NPC结构搭:直流电压源接上电容和下电容,中点引出;三相桥臂各用4个IGBT/二极管组合和2个钳位二极管;负载用星接阻感负载,注意负载中性点不要和直流母线中点直接连接,否则会改变中点电流路径,导致验证结果失真。
PWM调制采用同相层叠双载波方案。两个三角载波,一个幅值在[0, +1],另一个幅值在[-1, 0],两者同相位。以A相为例,当ua'大于等于0时,与上半部分载波比较,输出P或O;当ua'小于0时,与下半部分载波比较,输出O或N。将输出三态信号转换成4路门极信号时,按P/O/N状态表查表输出即可,在仿真中可以忽略死区,但如果后面要做硬件在环,就需要加入死区逻辑,其结果会对中点电流有一个可预测的附加扰动,这正是前面说要加PI闭环的原因。
4.3 最优零序电压计算模块的实现
这个模块是整个仿真的核心。我建议用Matlab Function写,输入是三相调制波ua、ub、uc(在载波PWM之前、未叠加零序的参考电压),三相负载电流Ia、Ib、Ic,以及上下电容电压Uc1、Uc2;输出是最优uz,叠加到三相参考信号上。
计算逻辑按三步实现:
- 根据三相调制波计算uz的下界uz_min和上界uz_max
- 在可行域内找出让io_avg绝对值最小的候选uz,这一步利用分段线性特性,通过少量分支判断完成
- 将得到的最优uz叠加到一个可选PI调节器上,输出最终的uz_final
为了便于调试,我建议把计算过程中间变量,比如可行域边界、候选解、对应的io_avg值,都引出到示波器观察。首版调试时最容易出问题的地方就在第二步,很多人把公式推导对了,但在判断“哪个候选解落在哪个子区间”时边界条件写错,结果uz总是在边界跳变,输出波形出现不该有的毛刺。
4.4 验证对比:看波形和指标
模型搭好之后,至少要做三组对比仿真:
- 第一组:不叠加任何零序电压,即纯SPWM,观察中点电压波形
- 第二组:叠加固定的PI调节零序电压,观察平衡效果
- 第三组:叠加最优零序电压计算模块,观察平衡效果
在我这组参数下,纯SPWM的中点电压会呈现明显的低频振荡,峰峰值大概在直流母线电压的5%左右,而且因为是感性负载,振荡频率接近基波,看起来就是一条上下波动的曲线。PI零序注入能把振荡压到2%左右,但动态过程有超调,PI参数调不好还会放大振荡。最优零序注入方案在中点电压进入稳态后,波动基本控制在0.3%以内,而且从启动到进入稳态只需要几个基波周期,动态响应明显更快。
除了看中点电压,还要看输出线电压和负载电流波形。最优零序注入的线电压波形依然是标准的三电平五段式PWM波形,谐波含量没有恶化。用Powergui的FFT工具分析负载电流THD,三组方案差距不大,都在合理范围内,这说明平衡控制没有牺牲输出电能质量。
5. 常见问题与调试心得
5.1 中点电压振荡反而变大
这个现象我见过好几次,尤其在使用PI零序注入方案时容易发生。究其原因,是PI调节器的极性搞反了。中点电流的符号定义不同,从Uc1流向中点还是从中点流向Uc2,对电容电压的效果正好相反。如果电流传感器的方向、开关函数定义、电容电压差符号三者之间没有统一,PI输出叠加到uz上的极性就可能反,结果变成“越调越不平衡”。
排查方法很简单:把PI增益设成0,只保留最优零序电压计算,看中点电压是否能自然收敛;如果能收敛,再逐步增加PI增益;如果一加PI就发散,十有八九是极性反了。另外还要检查一下上下电容电压采样是否有偏置,实际仿真中直流电压源的接地参考点选择也会影响Uc1和Uc2的读数。
5.2 最优零序电压输出跳变剧烈
如果uz波形出现很尖锐的跳变,但没有明显规律,大概率是在可行域端点处的候选解取舍逻辑有问题。由于io_avg(uz)是分段线性连续函数,两个子区间交界处的最优值应当是连续的,假如程序里漏掉了某个子区间,或者不等式边界用了严格大于而不是大于等于,就会出现解在边界附近来回跳的情况。
调试时把我的建议做法是:把uz_min、uz_max、分区点、每个候选解都分别画出来,再看最终选定的uz是否始终落在可行域内、是否连续。如果发现两段之间的uz不连续,检查子区间划分条件,重点看三相调制波与±1边界交点的排序问题。
5.3 仿真步长和解算器对结果的影响
这类含开关器件的仿真,时间步长和求解器配置对结果影响很大。我建议使用定步长求解器,步长设在载波周期的百分之一以下。比如载波频率5kHz,开关周期200μs,步长1μs,一个开关周期内有200个仿真步长,这样既能看清PWM细节,又不至于太慢。如果步长过大,载波比较的精度会下降,uz计算模块里的占空比近似也不再准确,中点电压波形会出现额外的纹波,看起来像是算法失效。
变步长求解器在这种开关电路里容易出现频繁的步长收缩和扩张,算得很慢,而且某些中间步长下的比较结果可能造成锯齿状波形,不太适合做波形精读。建议直接锁死定步长,离线验证够用。
5.4 从仿真到实验的几个注意点
仿真里用的理想开关器件没有导通压降、没有死区,实验样机则完全不同。死区会改变实际输出脉冲宽度,相当于给调制波加了一个扰动,这个扰动对中点电流的影响在小功率等级下不可忽略。所以仿真调好的PI增益,到实验台上可能要重新整定。最优零序电压计算部分可以原样移植到DSP里,它本身是解析公式,逻辑简单,实时性完全没问题。
电容参数实测定比标称值偏差更大,建议在控制里把Uc1和Uc2都用ADC真实采样,而不是用理想分压关系替代。另外电流采样噪声对最优解计算的斜率有直接影响,现场调试时给采样信号加一个一阶低通滤波,截止频率设在开关频率附近,能明显改善uz的稳定性。
我在实际使用中的体会是,这套最优零序电压注入策略最值得称赞的地方,是它把“平衡中点电位”这个听起来很工程的问题,变成了一个形式优美的解析求最值问题。只要理解了分段线性的来源,仿真代码其实非常短,但是它能解决的问题范围覆盖了从低调制比到高调制比、从纯阻性负载到低功率因数工况。如果你已经在做NPC三电平的项目,不妨把这个思路加到你的PWM调制模块里,对比一下和原来PI零序注入的差异,大概率会和我一样,回不去老方法了。