做电机控制的这几年,我发现一个很普遍的现象:很多朋友把两电平SVPWM调得滚瓜烂熟,但一接触三电平NPC架构,仿真模型就开始各种闹脾气——不是中点电压像过山车一样来回飘,就是扇区判断算错导致电流畸变,再或者调制波切换的时候桥臂直通炸管子。这篇文章就围绕手头这套“永磁同步电机PMSM三电平驱动MATLAB/Simulink仿真模型”展开,把FOC矢量控制的调参逻辑、三电平SVPWM的搭建细节,以及不同调制方式(SPWM、SVPWM、DPWM)在实际仿真里的对比结果一次性讲透。内容偏工程向,适合正在做电机控制器开发、准备从两电平切三电平的工程师,也适合需要快速上手三电平仿真验证算法的学生和科研人员。
1. 为什么非得是“三电平+PMSM”:从两电平方案的三个痛点说起
1.1 器件耐压与谐波的双重限制
在高压大功率交流传动、轨道交通、矿井提升、船舶推进这些场景里,母线电压越做越高。两电平逆变器每相只有一个桥臂,功率器件要直接承受整个直流母线电压,器件选型又贵又难,还得考虑串联均压的问题。我自己在调试某中压变频项目时,母线电压规划到上千伏,两电平方案下IGBT的耐压等级、开关损耗和散热成本一下子就上去了,项目预算也跟着失控。
谐波是另一个绕不开的痛点。两电平逆变器每相输出只有正负两个电平,相电压在正负母线之间大幅跳变,谐波含量高,转矩脉动幅度也大。对于PMSM这种对转矩平稳性要求高的电机,低速重载下的转矩脉动会直接体现在负载端的振动和噪声上,甚至影响整个机械系统的寿命。仿真里把相电流拿去做FFT,两电平方案在低频段的谐波分量经常比三电平高出几个百分点,这是做项目时非常现实的问题。
1.2 三电平到底多了什么
三电平NPC逆变器每相输出P、O、N三种状态,中间多了一个钳位到直流母线中点的电平。同样开关频率下,输出电压的谐波等效效果接近两电平的两倍开关频率。比如开关频率都是10kHz,三电平方案的电流纹波明显更小,配套滤波器的体积也能缩小不少,转矩波动也跟着降下来。
很多人容易误解一点:三电平的“电压利用率”是不是比两电平高?同样的SVPWM调制下,两电平和三电平在线性区的最大调制度都在1.15左右,真正拉开差距的是谐波特性、开关损耗和器件耐压。三电平每个开关管只承受一半母线电压,低压器件就能应付高压应用,这才是在高压场景选它的根本原因。
另外,三电平的中点电位本身就是一个控制自由度。它让系统能通过小矢量冗余状态去调节中点电流,这也是三电平SVPWM比两电平复杂的地方,但也意味着多了一个优化维度。把这一点吃透,后面的中点平衡控制才有抓手。
1.3 这套模型适合谁
这套仿真模型适用的范围大致分三类:
- 刚接触电机控制的学生,想快速理解FOC到底是怎么闭环的,以及三电平NPC和两电平在波形上的区别;
- 已经在做两电平FOC、项目要切换到三电平的工程师,重点看SVPWM扇区判断、死区设置和中点平衡这部分;
- 做光伏逆变器、储能PCS或者中压变频器方案选型的人,需要评估不同调制策略的谐波和损耗表现。
仿真模型最大的好处是:不用动硬件就能把三电平SVPWM的扇区判断、中点平衡、调制波切换这些容易烧板子的问题先在软件里跑清楚。等代码逻辑、参数整定都验证过了,再移植到DSP或者FPGA上,风险和调试周期都会小很多。
2. 仿真模型总体架构与三电平NPC桥臂的搭建
2.1 控制与主电路的分层设计
我搭模型习惯把整体分成三层:功率主电路、控制算法、测量与保护。在Simulink里分别放进三个子系统,方便单独调试。
功率主电路包含直流电源、两个串联的直流母线电容、三电平NPC桥臂、PMSM电机。控制算法层包含坐标变换、速度环PI、电流环PI、SVPWM/SPWM/DPWM调制波生成,以及死区发生器。测量与保护层负责采样三相电流、直流母线上下电容电压、电机转子位置,以及过流和中点电压越限保护逻辑。
主电路有两种搭建选择。一种是Simscape Electrical库里的IGBT桥臂,直观、贴近实际器件,但仿真速度比较慢,尤其是开关频率一高,跑一次几十毫秒的过程要等很久。另一种是平均模型,把三相桥臂等效成可控电压源,不考虑开关过程,跑得快,适合先把闭环逻辑和PI参数调通。我的实际做法是:前期用平均模型验证FOC逻辑和SVPWM代码,确认没问题之后,再换成带开关管的细节模型看谐波、死区影响和开关损耗。这个顺序能省下大量等待时间。
2.2 主电路搭建要点
直流母线部分用两个容量相同的大电容串联,中点引出作为O点,上下电容分别接电压采样,得到Vc1和Vc2。这两个电压值就是中点电位控制的状态反馈,后面SVPWM的小矢量调节要靠它们。
每个桥臂四个IGBT,加上两个钳位二极管接到中点。IGBT的导通压降和损耗参数最好按实际选型填,否则仿真里的损耗和谐波分布跟真机差距会很大。开关信号生成之后,必须先过死区模块再给IGBT,绝对不能直接怼上去,不然同一桥臂上下管直通的风险很高。
PMSM模块我用的Simulink标准库里的永磁同步电机模型,输入是三相电压,输出三相电流和转速、转子位置。注意电机中性点和母线参考地不一定是同一个电位,需要处理好三相线电压的换算,否则波形会偏。
2.3 三电平开关状态与死区时序
每相四个开关管,从上到下记为S1、S2、S3、S4。输出P状态导通S1和S2;O状态导通S2和S3;N状态导通S3和S4。这里有两个绝对不能碰的组合:S1和S3不能同时导通,否则正负母线直通;S2和S4不能同时导通,否则对中点直通。死区的存在就是用来避免这些组合出现的。
三电平死区比两电平复杂。P到O、O到N的切换都需要死区,在死区内负载电流由钳位二极管续流,输出电平暂时不按理论状态走,而是取决于电流方向。这种“电平空洞”会在输出电压里引入低次谐波,严重时相电流削顶。我调试时有个习惯:先把死区设成0,观察理想波形;波形正常后逐步加大死区,对比同一工况下FFT结果的变化,这样能很清楚看到死区对谐波和波形失真的影响。
实际项目里,死区时间一般按开关周期的2%~5%去设,再通过死区补偿算法消除影响。仿真模型里先按这个范围设就行。
3. FOC矢量控制:坐标变换、电流环与速度环的调参逻辑
3.1 两个坐标变换与id=0控制
FOC控制的第一步是Clark变换,把三相电流从abc坐标变到两相静止αβ坐标:
iα = ia iβ = (ia + 2*ib) / √3第二步是Park变换,按转子电角度θe把αβ电流旋转到dq旋转坐标系:
id = iα*cosθe + iβ*sinθe iq = -iα*sinθe + iβ*cosθeθe从电机模块输出的转子机械角乘以极对数得到。有了dq轴电流,电磁转矩可以直接写成:
Te = 1.5 * pp * (ψf*iq + (Ld - Lq)idiq)
对于表贴式PMSM,Ld和Lq基本相等,采用id=0控制最省事,励磁磁链恒定,转矩只受iq控制,线性度非常好。内埋式PMSM可以后面做最大转矩电流比MTPA,但第一版仿真完全没必要,先把id=0跑通,再看实际需求扩展。
3.2 电流环PI参数的一次性计算方法
电流环的被控对象是定子电感和电阻,在dq坐标系下可以近似看成:
G(s) = 1 / (Ls*s + Rs)
忽略反电动势交叉耦合时,把PI控制器设计成让开环传函等于一个纯积分器ωc/s,闭环带宽就约等于ωc。这样倒推出来一组很实用的公式:
Kp = ωc * Ls Ki = ωc * Rs
比如我用的验证电机参数是:Rs = 0.3Ω,Ld = Lq = 1.2mH,开关频率10kHz,电流环带宽取1kHz,即ωc = 2π * 1000 ≈ 6283。那么:
Kp ≈ 7.5 Ki ≈ 1885
写个简单的MATLAB脚本算一下:
Rs = 0.3; Ls = 1.2e-3; fsw = 10e3; fbw = fsw / 10; wc = 2*pi*fbw; Kp = wc * Ls; Ki = wc * Rs; fprintf('Kp = %.2f, Ki = %.2f\n', Kp, Ki);这组参数在Simulink的PID模块里填进Kp和Ki,配合离散化或连续模型都能直接转起来。后续按仿真波形微调:iq阶跃响应超调太大就把Kp适当减小,稳态误差消得慢就把Ki适当加大。这么做基本两三轮就能收敛。
3.3 速度环初调与弱磁边界
速度环是外环,带宽通常取电流环的1/5到1/10。速度对象近似为:
G_v(s) = Kt / (J*s)
转矩常数Kt = 1.5 * pp * ψf。比如电机J = 0.005 kg·m²,Kt = 0.9,期望速度环带宽50Hz,阻尼系数0.707左右,用二阶系统反推:
Kp_v ≈ √2 * ωv * J / Kt ≈ 2.5 Ki_v ≈ ωv² * J / Kt ≈ 55
这个初值进仿真后观察转速阶跃,超调大就减小Kp_v,响应慢就加大Ki_v。速度环这里有个容易被忽略的地方:速度反馈的滤波时间常数也会引入延迟,滤波越大,能用的带宽就越低,参数要往回收一点。
弱磁区间在模型里可以后置。当逆变器输出电压达到调制极限后,转速还想往上走,就需要注入负向id电流来削弱永磁磁场。具体做法是在dq电压限制里加一个电压闭环,实时计算id_ref。这个模块等基础FOC跑通后再加,不影响前面理解FOC主流程。
4. 三电平SVPWM的核心实现:矢量分类、扇区判断与作用时间分配
4.1 从6个矢量到19个基础矢量
两电平每相只有正负两个状态,三相组合出来是8种开关状态,对应6个有效基本矢量和2个零矢量。三电平每相有P、O、N三个状态,27种开关状态按电压合成归类后,得到19个基础矢量:1个零矢量、6个小矢量、6个中矢量、6个大矢量。
关键差异在小矢量有冗余开关状态。比如POO和ONN对应的线电压完全一样,但流过中点的电流方向相反。中矢量和大矢量各只有一种开关状态。这意味着做中点电位平衡时,唯一能调节的资源就是小矢量的冗余状态分配,这是三电平SVPWM和两电平最本质的区别。
4.2 大扇区与子扇区的判断
三电平SVPWM的工程实现路径,我习惯这样走:
先求Vα、Vβ的相角:
θ = atan2(Vβ, Vα)
每60度切一个大扇区,θ落在0°~60°就是第一大扇区,60°~120°是第二大扇区,以此类推。
每个大扇区内部再划分出四个三角形子扇区。参考电压矢量落在哪个三角形,就用这个三角形的三个顶点矢量来合成。判断条件在归一化坐标系下是一组线性不等式,边界和母线电压的若干系数相关。工程上为了防抖,我给边界判断加了1V~2V的滞环,实测波形稳定很多,不会在扇区边界来回跳导致输出毛刺。
大致的代码框架可以这样写:
function [sector, subsector] = svpwm_sector(Va, Vb, Vdc) theta = atan2(Vb, Va) * 180 / pi; if theta < 0 theta = theta + 360; end sector = floor(theta / 60) + 1; % 子扇区判断,这里需要用归一化后的坐标和边界阈值比较 % 返回值 subsector 为 1~4 end具体的子扇区边界阈值需要按母线电压归一化后计算,我在模型里做的是建立24个三角形区域的查找表,用归一化Vref坐标去匹配,避免每次在线解不等式。
4.3 伏秒平衡与作用时间分配
选定参考矢量的三个顶点矢量Vx、Vy、Vz之后,列伏秒平衡方程:
T1Vx + T2Vy + T3Vz = VrefTs T1 + T2 + T3 = Ts
这是一个线性方程组,在Simulink里用矩阵求逆一次就能算出三个作用时间。算完之后把三个开关状态在载波周期内做对称排列,生成PWM波形。
这里还有一个很重要的调节因子α。每个小矢量都有P型(如POO)和N型(如ONN)两种冗余状态,α=0时全部用P型小矢量,α=1全部用N型小矢量,中间值则按比例混用。控制α就能控制中点电流的平均方向,从而调节中点电位。工程上最常见的做法是把ΔV = Vc1 - Vc2 经过一个PI控制器,输出作为α的实时指令,形成中点电位闭环。
我在模型里把α限制在0.1~0.9之间,不推到极端值,否则会出现某一种小矢量占用时间过长、另一些矢量区间无法正常发波的情况,实测限制后稳定性好很多。
5. SVPWM、SPWM、DPWM在仿真里的实际对比
5.1 三种调制的实现差异
SPWM最简单,正弦调制波和三角载波比较。三电平SPWM用两个层叠载波,上载波范围0到1,下载波-1到0,正弦调制波在[-1,1]之间,按比较结果输出P、O、N三个状态。
SVPWM直接计算电压矢量的作用时间,等效于在SPWM调制波里注入合适的零序分量,把正弦波变成马鞍形波,电压利用率从1.0提升到1.15左右。
DPWM是SVPWM的变体,在某些扇区把某相调制波钳位到±1,让该相在60度区间内完全不开关。这样做开关次数减少三分之一,开关损耗显著下降,代价是谐波性能变差一些,电流THD会往上走。
在Simulink里,这三种方式可以统一放到一个“调制波生成”子系统,后面接两层载波比较模块,切换对比非常方便。实际项目里DPWM还有DPWM1、DPWM2、DPWM3等不同版本,区别在于钳位区间的位置选择,仿真阶段先用最基础的版本跑通,再根据应用场景换版本。
5.2 谐波、损耗和电压利用率的实测对比
同一套模型,母线电压600V,开关频率10kHz,带额定负载,取稳态后的相电流做FFT。
SPWM的相电流THD最高,仿真结果大概在5.8%左右;SVPWM降到3.2%;DPWM在SVPWM基础上开关损耗明显下降,THD会回升到3.6%左右。电压利用率方面,SPWM在线性区最大调制度接近1.0,SVPWM和DPWM都能到1.15左右。
| 调制方式 | 直流电压利用率 | 相电流THD(仿真相对值) | 开关损耗 | 中点电压平衡能力 | 实现复杂度 |
|---|---|---|---|---|---|
| SPWM | 约1.0 | 较高 | 各相持续开关 | 较弱 | 低 |
| SVPWM | 约1.15 | 最低 | 各相持续开关 | 强 | 中 |
| DPWM | 约1.15 | 略高于SVPWM | 最低 | 钳位区间受限 | 中 |
这个THD数据是相对值,换电机参数和死区时间会有变化,但趋势是稳定的。SVPWM在三种方案里综合表现最均衡,这也是为什么主流电机驱动都用SVPWM。
5.3 选型取舍
实际怎么选,主要看需求优先级。如果重点是谐波指标和转矩平稳,SVPWM是首选,三电平+SVPWM的组合能把转矩脉动压得非常低,适合精密传动和对噪声敏感的场合。大功率设备发热严重,开关损耗是瓶颈,DPWM更合适,代价是滤波器和噪声表现会变差一些,但散热压力小了很多。SPWM则更适合教学验证,或者在低压小功率、对性能要求不高的场合凑合使用。
母线电压利用率这一点值得单独拿出来说。PMSM在基速区能跑到的最高转速,直接受制于逆变器能输出的最大基波电压。如果母线电压本来就偏紧,想靠更高电压利用率换取速度余量,那SPWM就别纠结了,直接上SVPWM最实际。
6. 仿真调试中反复踩的几个坑
6.1 中点电位像过山车
中点电位漂移是初学三电平最容易撞上的问题。只要负载不对称,或者小矢量的冗余状态分配不合理,Vc1和Vc2之间的差值就会越来越大,输出电压波形跟着畸变,严重时保护逻辑都会误动作。
控制上先用PI闭环把ΔV压住,但增量输出要加限幅和平滑,不要让α指令剧烈跳变。模型里两个母线电容的初始电压一定要都设成Vdc/2,不然启动瞬间会有很大的电容充电冲击电流,波形看起来像炸了一样。
6.2 死区、仿真步长与开关事件的匹配
Simulink里用标准库PMSM搭配PWM驱动时,仿真步长设置非常关键。固定步长建议取1e-6秒或者更小,用ode3算法,否则PWM开关事件会落在两个积分步长之间,波形失真严重。
死区时间也不能乱设,一般不超过载波周期的5%。我试过一次载波周期100微秒、死区设成15微秒,波形直接削顶,谐波爆炸式增长。仿真阶段先零死区跑通,再加死区对比,这样能清楚看到死区引入的影响到底有多大。
6.3 代数环和边界浮点误差
电流环PI输出的Vα、Vβ直接进SVPWM计算模块时,Simulink经常报代数环错误。处理办法是在反馈路径或计算链路上加Memory模块打破代数环。代价是会引入一拍延迟,看起来影响不大,但在高带宽要求下会稍微降低调制性能,可以接受。
扇区边界浮点数判断还有一个隐性坑:参考矢量正好压在线性不等式边界上时,扇区号会来回抖动,输出电流毛刺不断。解决办法我前面提过,给比较阈值留滞环,几伏的宽度就够,实测效果非常明显。
7. 复现这套模型时值得注意的几个小习惯
最后聊几个我自己反复用的小习惯,不一定写进文档,但对提高效率很有帮助。
第一,先把两电平FOC彻底跑通,再往三电平扩展。三电平SVPWM的所有调试难点都叠加在FOC之上,如果两电平的电流环都没调稳,三电平出问题时分不清是FOC参数问题还是SVPWM扇区问题,排查难度翻倍。
第二,每次改动只动一个变量。比如先把SVPWM扇区判断代码换上,保持中点平衡算法不动;确认波形正常了,再去调α调节器。同时改多个模块,出了问题只能从头猜。
第三,FFT分析时,取数据要在系统进入稳态之后再选一个完整的基波周期,而且最好加窗函数,不然频谱泄漏会污染THD数值。
第四,保留不同调制方式的对照组设置。同一工况下,SPWM、SVPWM、DPWM各跑一遍,把相电流畸变、转矩波动、中点电位波动都存下来,做成表格。这样不仅自己判断直观,后面写技术方案或者汇报时也有数据支撑。
这套模型如果按上面的顺序走下来,从平均模型验证算法到开关级模型看波形,通常一周以内就能把三电平FOC的闭环、SVPWM发波和中点平衡全部稳定跑起来。再往后想扩展弱磁、死区补偿或者无感控制,都是在现在这个骨架上加模块的事。