4. 三电平空间矢量调制(SVM)算法实现

三电平NPC变流器的空间矢量调制,核心任务是把参考电压矢量 Vref 在一个控制周期 Ts 内,用三个相邻的基本矢量按时间加权合成出来。与两电平SVM相比,三电平的矢量数量从8个增加到27个,扇区划分也从6个大扇区细化为6个大扇区×每个大扇区6个小三角形,共36个小区域。算法实现的关键就在于:先判断 Vref 落在哪个小三角形,再选三个顶点矢量,解出各自作用时间,最后排成七段式对称序列驱动12个开关管。

一、坐标系选择与扇区判断

工程上通常先把三相参考电压 Va、Vb、Vc 经Clarke变换到α-β平面。为便于扇区判断,常采用60°坐标系(g-h坐标系)或直接使用α-β坐标。这里以α-β平面为例说明判断逻辑。

三电平基本矢量按长度分为四类:零矢量(3个,位于原点)、小矢量(6对,长度 Vdc/3)、中矢量(6个,长度 √3·Vdc/3)、大矢量(6个,长度 2Vdc/3)。六个大矢量把平面分成6个60°大扇区,编号Ⅰ~Ⅵ,从0°开始逆时针排列。

大扇区判断可用参考角 θ = atan2(Vβ, Vα),归一化到 [0, 2π) 后,N = floor(θ / 60°) + 1 即得大扇区号。更实用的做法是直接用 Vα、Vβ 与三条边界线 Vβ=0、Vβ=√3Vα、Vβ=-√3Vα 的符号关系判断,避免三角函数运算,适合DSP定点实现。

进入大扇区后,还要判断落在哪个小三角形。以扇区Ⅰ(0°~60°)为例,内部被小矢量、中矢量、大矢量分割成6个小三角形,编号1~6。判断依据是两条辅助线:一条是小矢量端点连线,另一条是中矢量端点连线。常用判据为:

若 Vβ ≤ √3·Vα 且 Vβ ≤ -√3·(Vα - Vdc/3)  → 小三角形1
若 Vβ ≥ √3·(Vα - Vdc/3) 且 Vβ ≤ √3·Vα  → 小三角形2
...(其余按边界不等式依次判断)

实际代码中,把 Vα、Vβ 归一化到以 Vdc/3 为单位的标幺值后,判据变成简单的线性不等式比较,每个控制周期只需十几次加减和比较,实时性很好。

三电平SVM:扇区判断与矢量合成关系 Ⅰ Ⅱ Ⅲ Ⅳ Ⅴ Ⅵ Vref O 扇区Ⅰ内小三角形划分 1 2 3 4 5 6 大矢量 中矢量 小矢量 参考矢量

二、矢量合成与作用时间计算

确定小三角形后,取该三角形的三个顶点矢量 V1、V2、V3,根据伏秒平衡原理:

V1·T1 + V2·T2 + V3·T3 = Vref·Ts
T1 + T2 + T3 = Ts

以扇区Ⅰ小三角形2为例,三个顶点通常是小矢量 V1(如100/211)、中矢量 V2(210)、大矢量 V3(200)。把矢量写成α-β分量,得到两个方程加一个时间约束,共三个未知数,可直接解出:

T1 = Ts·(1 - 2m·sinθ)
T2 = Ts·(2m·sin(θ+60°) - 1)
T3 = Ts·(1 - 2m·sin(θ-60°))

其中 m = |Vref| / (Vdc/√3) 为调制比,θ 为参考矢量在当前大扇区内的相对角度。实际实现时,更通用的做法是直接用三个顶点矢量的α-β坐标构成2×2矩阵求逆,得到 T1、T2,再由 T3 = Ts - T1 - T2 补足。这样代码只需维护一张“小三角形编号→三个顶点矢量编号”的查找表,避免为每个小三角形单独推导公式。

需要注意:小矢量存在冗余开关状态(如100和211对应同一矢量),选择哪一个会影响中点电流方向。工程上常根据中点电压偏差 ΔVnp 的符号,动态选择对中点电压有修正作用的那一组小矢量,这就是三电平SVM的中点平衡控制。

三、七段式序列设计

得到三个作用时间后,需要把它们排成一个控制周期内的开关序列。七段式的核心思想是:以零矢量开头和结尾,中间对称安排各矢量,使每个开关周期内开关次数最少,且输出波形半周期对称,谐波性能好。

以扇区Ⅰ小三角形2为例,三个矢量为小矢量 V1、中矢量 V2、大矢量 V3,七段式序列为:

V0 → V1 → V2 → V3 → V2 → V1 → V0
T0/2  T1/2  T2/2  T3  T2/2  T1/2  T0/2

其中 T0 = Ts - T1 - T2 - T3 为零矢量总时间,平均分给首尾两段。这样每个周期内每相桥臂最多开关一次,开关损耗低。

实际DSP实现时,通常不直接生成七段序列,而是计算三个比较寄存器 CMPR1、CMPR2、CMPR3 的翻转时刻。以三角载波为基准,把各段时间的累加值写入比较寄存器,硬件自动产生对称PWM。具体做法是:先算 Ta = T0/4,Tb = Ta + T1/2,Tc = Tb + T2/2,再根据当前扇区和矢量分配关系,把这三个值映射到A、B、C三相的比较寄存器。映射关系由“小三角形编号→三相开关状态”表决定,这张表是三电平SVM实现中最容易出错的地方,建议用离线脚本生成后直接查表。

实现要点:扇区判断用线性不等式而非三角函数;作用时间用查表+矩阵求逆而非逐区推导;七段式用比较寄存器翻转时刻实现而非软件逐段切换;小矢量选择要结合中点电压偏差做动态修正。

四、一个可参考的实现流程

下面给出一个适合DSP或FPGA实现的算法流程,参数以 Vdc=800V、Ts=100μs、f=50Hz 为例:

  1. 采样三相参考电压,Clarke变换得到 Vα、Vβ,并归一化到 Vdc/3 为基准的标幺值。
  2. 用 Vβ 与 ±√3Vα 的符号关系判断大扇区 N(1~6)。
  3. 把 Vα、Vβ 旋转到扇区Ⅰ的局部坐标,用三条边界不等式判断小三角形编号 k(1~6)。
  4. 查表得到三个顶点矢量编号及其α-β坐标,解出 T1、T2、T3,并做饱和限幅:若 T1+T2+T3 > Ts,按比例缩放。
  5. 根据中点电压偏差 ΔVnp 选择小矢量的冗余状态。
  6. 计算 Ta、Tb、Tc,查“小三角形→三相比较寄存器”表,写入PWM模块。
  7. 每个控制周期重复上述过程,并监测中点电压,若持续偏大则调整小矢量选择策略。

判断算法是否正确,最直接的方法是观察线电压波形:三电平SVM应输出五电平线电压,且中点电压在半个工频周期内基本平衡。若中点电压持续单向偏移,通常是小矢量选择逻辑或作用时间分配有误;若线电压出现异常跳变,则多半是扇区判断或比较寄存器映射表出错。