news 2026/9/8 7:34:00

非零电压空间矢量为何是2Udc/3?从逆变器拓扑到SVPWM公式全解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
非零电压空间矢量为何是2Udc/3?从逆变器拓扑到SVPWM公式全解析

第一次读到“非零电压空间矢量的幅值为2Udc/3”这句话时,我盯着书看了很久:状态100的时候,A相上桥臂导通、B/C相下桥臂导通,A相相对母线负极确实是Udc,B/C相是0,凭什么合成出来的空间矢量只有2Udc/3,而不是Udc或者Udc/2?后来做SVPWM的扇区判断、作用时间计算,发现所有公式里都藏着这个系数,但很多资料都是一句话带过,默认你懂。这个坑我踩了挺久,所以专门写一篇把这个问题从头到尾掰开揉碎讲清楚:从逆变器拓扑、空间矢量定义,到非零矢量的完整复数推导,再到这个2/3到底如何影响电压利用率,以及实际代码和仿真里怎么验证它。适合正在学SVPWM、做FOC但被这个系数卡住的人,也适合想彻底搞懂空间矢量而不是只背公式的工程师。

1. 从“相电压只有两个值”说起:逆变器拓扑决定了什么

1.1 三相两电平逆变器的开关状态与相电压

要理解2Udc/3,第一步必须回到硬件拓扑本身。标准三相两电平电压源逆变器(VSI)有六个开关管,每相桥臂分上下两个,互补导通。直流母线电压为Udc,以直流母线负极N为参考点,任意一相的输出电压只有两个离散值:下管导通时输出0V,上管导通时输出Udc。这就是“两电平”三个字的由来——输出电平数不是3也不是6,而是一相两个,三相组合出8种开关状态。

这8种状态里,6种是“有非零电压差”的非零状态,2种是三相输出全部接同一母线(要么全上管导通,要么全下管导通)的零状态。常见的命名方式是三位二进制:1代表该相上管导通,0代表下管导通。于是有了100、110、010、011、001、101六个非零状态,加上000和111两个零状态。

但注意一个关键概念:上面说的0V和Udc是相对母线负极的“桥臂输出电压”,而不是电机相电压。电机三相绕组往往是星形接法,中性点电压并不是固定的0,它会随着开关状态浮动。真正决定电机每一相绕组两端电压的,是逆变器输出端相对于“虚拟中点”的电位。这个虚拟中点可以理解为直流母线电压的中点,也就是把Udc一分为二,每相上管导通时相电压为+Udc/2,下管导通时相电压为-Udc/2。

以状态100为例,A相上管导通,所以A相相对虚拟中点是+Udc/2;B相和C相下管导通,都是-Udc/2。三相相对虚拟中点的电压是:

  • Ua = +Udc/2
  • Ub = -Udc/2
  • Uc = -Udc/2

这组电压值,才是下面做空间矢量合成时的输入。很多教程用“相对母线负极”的0和Udc去套公式,虽然最后零序分量会被抵消、结果一样,但中间过程容易把人绕晕。我建议从一开始就建立“相对虚拟中点”的视角,后面的推导会顺很多。

1.2 为什么直觉上总觉得应该是Udc/2或Udc

知道了相电压只有±Udc/2,很多人的第一反应是:既然A相是+Udc/2,B、C相是-Udc/2,那空间矢量大小是不是最多Udc/2?还有人说,A相上管接通了直流母线正端,B、C相接负端,那“压差”不是Udc吗?为什么合成出来只有2Udc/3?

这两种直觉都有道理,但都忽略了一个核心前提:空间矢量不是把三相电压简单代数相加,而是把三相处在空间上互差120°的绕组方向上的电压投影到复平面,再做复数和。三个人从三个方向拉一辆车,不是把三个人的力直接加起来,还要考虑力的方向夹角;三相绕组的电压合成也是同样的道理。

另外,为什么不是“Ua + Ub + Uc”三个数直接相加?因为三相电压在时间上、空间上都有相位差。空间矢量公式里,第二相要乘以旋转因子e^(j2π/3),第三相乘以e^(j4π/3),这个旋转因子就是绕组在空间上互差120°的数学表达。三相电压本身又存在120°的时间相位差,两个因素叠加,结果自然不是直观的加减法。

搞清楚这个前提,就可以正式看空间矢量的定义了。

2. 空间矢量合成的两条关键约定

2.1 电压空间矢量的定义与等幅值变换

电压空间矢量的标准定义是:

Us = (2/3) × (Ua + Ub·e^(j2π/3) + Uc·e^(j4π/3))

这里的Ua、Ub、Uc是三相相电压瞬时值,e^(j2π/3)和e^(j4π/3)代表120°和240°的旋转因子。括号里把三相电压做了带方向的合成,最前面的2/3则是“等幅值变换”系数。

为什么偏偏是2/3?我们可以验证一下。假设三相完全对称的正弦电压:

  • Ua = Um·cos(ωt)
  • Ub = Um·cos(ωt - 120°)
  • Uc = Um·cos(ωt + 120°)

把这三路电压代入上面的公式,利用欧拉公式展开后,括号里的结果正好等于(3/2)·Um·e^(jωt)。再乘以系数2/3,得到的就是Um·e^(jωt)。合成矢量的模长恰好等于相电压的幅值Um。

这就是2/3这个系数的真实来历:它不是一个物理损耗系数,也不是什么经验修正,而是为了满足“合成矢量的模 = 相电压幅值”这条约定而人为引入的归一化系数。没有这个2/3,算出来的矢量长度会变成1.5Um,虽然也能做控制,但调制比、电流环增益全都得另算一套,非常别扭。用了2/3之后,你用示波器看到的相电压幅值,和你在SVPWM里给的参考矢量长度,直接就是同一个数,调试时心智负担小很多。

2.2 为什么不用等功率变换或系数1

矩阵变换里还有另外一个常用系数√(2/3),来自等功率变换。它的出发点是保证变换前后功率不变。三相三线制系统里,等幅值变换和等功率变换之间就差一个√3的关系,具体到速度环、电流环PI参数整定时,用哪套变换就必须配哪套反馈系数,不能混着用。

SVPWM领域几乎默认用等幅值变换,也就是2/3系数。原因有二:一是上面说的,合成矢量模长等于相电压幅值,直观;二是扇区判断、作用时间公式都是在等幅值变换的坐标系下推导出来的,你用√(2/3)的坐标系去套,公式里的系数就全对不上了。

至于系数取1(也就是不加系数),我见过一些从“旋转坐标系”反推空间的教材这么写过,但那只为了推导方便。真实工程里,用2/3的等幅值变换是绝对主流,ST、TI的电机库也都是这么写的。

三种系数做个对比:

变换方式系数k三相对称正弦时合成矢量模长SVPWM扇区/时间公式兼容性典型应用
等幅值变换2/3Um(等于相电压幅值)完全兼容,公式直接可用FOC、SVPWM绝大多数实现
等功率变换√(2/3)0.816·Um需要额外换算系数功率计算、并网控制
不加系数11.5·Um不兼容,公式需要整体缩放数学推导、理论分析

3. 手推一遍非零矢量:U4(100)的完整计算

3.1 逐项代入复数运算的详细过程

有了定义和前提,现在把状态100完整推一遍。输入是:

  • Ua = +Udc/2
  • Ub = -Udc/2
  • Uc = -Udc/2

代入空间矢量公式:

Us(100) = (2/3) × [(Udc/2) + (-Udc/2)·e^(j2π/3) + (-Udc/2)·e^(j4π/3)]

把Udc/2作为公因子提出来:

Us(100) = (2/3) × (Udc/2) × [1 - e^(j2π/3) - e^(j4π/3)]

重点来了,中括号里这三个复数是什么关系?e^(j2π/3)是单位圆上120°位置的点,e^(j4π/3)是单位圆上240°位置的点。它们在复平面上是对称的,直接相加的结果是-1:

e^(j2π/3) + e^(j4π/3) = cos120° + j·sin120° + cos240° + j·sin240° = (-1/2 + j·√3/2) + (-1/2 - j·√3/2) = -1

所以中括号里的结果:

1 - e^(j2π/3) - e^(j4π/3) = 1 - (-1) = 2

代回去:

Us(100) = (2/3) × (Udc/2) × 2 = (2/3) × Udc

计算完毕。状态100的合成空间矢量,幅值就是2Udc/3,方向在A相轴线方向,也就是复平面的0°方向。

展开复指数的那一步,其实用欧拉公式算也行。我习惯先记住一个结论:1 + e^(j120°) + e^(j240°) = 0,这是三相对称系统的数学本质——三个互差120°的单位向量叠加为零。用它做题会快很多。

3.2 六个非零矢量的统一表达式与几何分布

状态100推通了,其余五个非零矢量原理一模一样,只是哪一相取+Udc/2不同。把结果直接列出来:

开关状态对应相电压(相对虚拟中点)空间矢量方向空间矢量幅值
100+Udc/2, -Udc/2, -Udc/22Udc/3
110+Udc/2, +Udc/2, -Udc/260°2Udc/3
010-Udc/2, +Udc/2, -Udc/2120°2Udc/3
011-Udc/2, +Udc/2, +Udc/2180°2Udc/3
001-Udc/2, -Udc/2, +Udc/2240°2Udc/3
101+Udc/2, -Udc/2, +Udc/2300°2Udc/3

六个非零矢量在复平面上形成了正六边形的六个顶点,外接圆半径就是2Udc/3。它们统一可以写成:

Uk = (2Udc/3)·e^(j·k·π/3),k取0到5

看到这个图形你就能理解,为什么SVPWM线性调制区的极限是“六边形内切圆”,而不是外接圆。因为在一个开关周期内,参考电压矢量只能由相邻两个非零矢量和零矢量线性组合而成,能不失真合成的范围,就是六边形内部。而能持续平滑旋转的圆矢量,内切于六边形的圆是最大圆,半径是(2Udc/3)·cos30° = Udc/√3。这个数后面还要用到。

3.3 零矢量的含义:为什么幅值恰为0

两个零状态,000和111。000时三相相对虚拟中点都是-Udc/2,111时三相都是+Udc/2。代进公式看看000:

Us(000) = (2/3) × (-Udc/2) × [1 + e^(j2π/3) + e^(j4π/3)]

中括号里是1 + (-1) = 0,整体乘出来为0。111同理。

物理意义很容易理解:000或111状态下,三相输出要么全部接同一侧母线,要么全部接负母线,三相绕组两端没有电压差,电机相电压为零,自然合成不出任何空间矢量。

零矢量虽然“零”,却是SVPWM不可或缺的配角。一个开关周期里,非零矢量只管“方向”和“幅度”的一部分,剩余时间必须由零矢量补齐,合成矢量的平均值才能等于参考值。同时,零矢量怎么分配,直接决定了PWM波形的对称性、开关次数和电流纹波大小。经典7段式SVPWM把零矢量拆成000和111各一段时间,就是为了让波形对称、开关次数更少。

4. 2/3Udc到底影响了什么:从伏秒平衡到调制深度

4.1 扇区判断与作用时间计算中它藏在哪里

很多读者在推导SVPWM作用时间时会发现一个有趣的现象:公式里好像看不到2/3了。以第一扇区为例,参考电压Uref由U4(100)和U6(110)合成,伏秒平衡方程是:

Uref × Ts = U4 × T1 + U6 × T2 + U0 × T0

把U4和U6都换成2Udc/3的模长,分别在α轴和β轴方向列两个方程:

Uref·cosθ·Ts = (2Udc/3)·T1 + (2Udc/3)·cos60°·T2 Uref·sinθ·Ts = (2Udc/3)·sin60°·T2

解这个二元一次方程组,2Udc/3在等式两边的相消过程中被约掉了,最终得到:

T1 = √3·Ts·(Uref/Udc)·sin(π/3 - θ) T2 = √3·Ts·(Uref/Udc)·sinθ

所以从形式上看,作用时间公式里确实没有直接出现2/3。但这不代表2/3不重要——它定义了调制比的边界。参考矢量最大能取多大,完全受限于由2Udc/3半径的六边形内切圆。换句话说,2/3决定了你能用多大的Uref,公式里的Uref/Udc这个比值上限也被它卡死。

实际操作中,代码里一般用Uα、Uβ结合Udc计算中间变量X、Y、Z,再根据扇区查表取T1、T2。这里面没有显式的2/3常数,原因是公式已经从伏秒平衡里消掉了,但在做标幺化或者手动算最大调制比时,2/3就会重新出现。

4.2 线性调制区边界与SVPWM电压利用率优势

SVPWM最吸引人的一点就是电压利用率高。刚才已经算过,六边形内切圆的半径是:

Umax = (2Udc/3)·cos30° = Udc/√3 ≈ 0.577Udc

也就是说,在线性调制区内,SVPWM能输出的最大相电压基波幅值可以到Udc/√3。而传统SPWM,也就是正弦波和三角波直接比较的那种方式,最大相电压基波幅值只有Udc/2。

两者一对比:

调制方式最大相电压基波幅值最大线电压基波幅值相对SPWM提升
传统SPWMUdc/2√3·Udc/2 ≈ 0.866Udc基准
SVPWMUdc/√3 ≈ 0.577UdcUdc+15.47%

同样的直流母线电压,SVPWM能把线电压基波推到接近Udc,而SPWM只能到0.866Udc。这个15.47%的提升,正是来自空间矢量的思路:它不再机械地比较三相正弦波和三角波,而是直接控制合成矢量在六边形内旋转,天然利用了零序电压注入的效果。这跟SPWM里人为注入三次谐波来提升调制深度的做法,殊途同归。

理解这件事对选型很有帮助。比如一个额定电压380V的电机,如果母线电压是540V,用SVPWM在线性区就能跑满,但用SPWM可能到不了额定电压,电机会达不到额定转速。很多变频器厂家说“SVPWM比SPWM多榨出15%母线电压”,指的就是这个。

4.3 过调制区里2/3Udc的另一种面孔

当参考矢量幅值超过Udc/√3、进入六边形外接圆和内切圆之间的区域时,就进入了过调制区。这时SVPWM没法在一个开关周期内精确合成参考矢量了,只能“尽力而为”,让实际输出的平均矢量尽量接近参考值。最小相位误差过调制、最小幅值误差过调制这些策略,都是在2Udc/3这个六边形边界上做文章:小过调制时让矢量沿着六边形边沿修正,深度过调制时直接退化为六边形边界附近的方波运行。

极端情况下,当参考矢量接近外接圆半径2Udc/3时,PWM逐渐演变成真正的方波六步运行,此时线电压基波幅值达到理论最大值4Udc/π。这个值跟2/3没有直接关系,但2Udc/3告诉你六边形的外边界在哪里,过调制能走得有多远。

5. 新手最容易踩的三个认知坑

5.1 用线电压去猜合成矢量

状态100时,线电压Uab = Udc,Ubc = 0,Uca = -Udc。初学者一旦看到线电压里有Udc,就试图把空间矢量幅值往Udc上靠,结果怎么也对不上2Udc/3。

原因在于,空间矢量对应的是“相电压在空间上的叠加”,参考点是虚拟中点,而线电压是两个桥臂输出之间的电位差。同一组开关状态下,线电压峰峰值可以到Udc,但三相相电压带方向叠加之后,合成矢量的模正好是2Udc/3。这是两套不同的测量坐标系,不能混着推。

以后再遇到类似问题,心算一个状态就够:比如100状态,相电压是+1/2、-1/2、-1/2,代入公式,几步就能得出2/3。

5.2 把2/3当成效率或损耗

2/3不是效率,不是损耗,也不是“丢了1/3电压”。它是坐标变换的归一化系数和三相空间结构共同作用的结果。三相绕组在空间上互差120°,三路电压做复数叠加时,天然会有一部分分量互相抵消;而2/3系数的作用,是把这个叠加结果重新拉回“相电压幅值”的刻度上。

如果还是觉得别扭,可以换个角度:三相对称正弦电压幅值为Um时,不带2/3的原始叠加结果是1.5Um,这多出来的0.5是被空间角度“吃掉”的。乘上2/3后,矢量幅值回到Um,你读到的才是熟悉的相电压幅值。这是“刻度校准”,不是“能量损失”。

5.3 把等功率变换的系数混进SVPWM公式

等功率变换下,空间矢量定义变成:

Us_powerInvariant = √(2/3) × (Ua + Ub·e^(j2π/3) + Uc·e^(j4π/3))

算出来的非零矢量幅值是√(2/3)·Udc ≈ 0.816Udc,方向不变。这个数跟2Udc/3的0.667Udc差了将近20%,如果拿等功率变换坐标系下的Uα、Uβ去套经典的SVPWM时间公式,算出来T1、T2会整体偏小,调制深度判断也会错误,轻则电流波形畸变,重则过调制失控。

这个坑在移植代码时特别常见。有些同学从一篇论文里抄了扇区判断,从另一篇里抄了时间计算,结果两篇用的坐标变换系数不一致,整个控制系统就跑飞了。我的习惯是在代码注释里明确标注“这里使用等幅值Clark变换,k=2/3”,并且在整个工程里只维护一套坐标变换函数,避免混用。

6. 从公式到代码:在MCU实现中如何验证和落地

6.1 扇区判断与作用时间里的“隐形系数”

常用的SVPWM算法流程是:先由Uα、Uβ计算扇区,再算三个中间变量X、Y、Z,最后根据扇区取值T1、T2并限幅。以STM32上典型实现为例:

// 输入:Ualpha, Ubeta, Udc, Ts // 1. 扇区判断 float v1 = Ubeta; float v2 = (SQRT3 * Ualpha - Ubeta) / 2.0f; float v3 = (-SQRT3 * Ualpha - Ubeta) / 2.0f; int sector = 0; if (v1 > 0) sector += 1; if (v2 > 0) sector += 2; if (v3 > 0) sector += 4; // 2. 中间变量 float X = SQRT3 * Ubeta / Udc * Ts; float Y = (1.5f * Ualpha + SQRT3 / 2.0f * Ubeta) / Udc * Ts; float Z = (-1.5f * Ualpha + SQRT3 / 2.0f * Ubeta) / Udc * Ts; // 3. 按扇区取T1、T2 float T1 = 0, T2 = 0; switch (sector) { case 1: T1 = Z; T2 = Y; break; case 2: T1 = Y; T2 = -X; break; // ... 其余扇区类似 } // 4. 限幅 if (T1 + T2 > Ts) { float scale = Ts / (T1 + T2); T1 *= scale; T2 *= scale; }

这段代码里确实看不到2/3,但整条推导链是从伏秒平衡出发,而伏秒平衡里就隐含了非零矢量幅值为2Udc/3的事实。所以当你调试时发现T1+T2很容易就打到限幅,说明参考矢量已经逼近线性调制区边界,这时回去算一下Uref是否接近Udc/√3,就能验证整个链路是否正确。

6.2 仿真和示波器上怎么验证2/3Udc

最简单的方法不是在MCU上调,而是在仿真软件里验证。以MATLAB/Simulink为例,搭一个逆变器模型,让开关状态固定在100,然后用Clark变换计算Uα、Uβ:

Uα = (2/3)×(Ua - Ub/2 - Uc/2) Uβ = (2/3)×(√3/2)×(Ub - Uc)

代入100状态的相电压Ua=Udc/2、Ub=-Udc/2、Uc=-Udc/2:

Uα = (2/3)×(Udc/2 + Udc/4 + Udc/4) = (2/3)×(Udc) = 2Udc/3 Uβ = (2/3)×(√3/2)×(-Udc/2 + Udc/2) = 0

看到没有,Clark变换里的2/3直接就把100状态的相电压推到了2Udc/3。这比重新算复数公式更直观。在Simulink里用示波器观察这个值,再切换不同开关状态,六个非零矢量会依次呈现2Udc/3的幅值。

如果想在实物上验证,可以给开环SVPWM一个恒定角度参考,让合成矢量刚好落在某两个相邻非零矢量的角平分线上,然后逐渐增大Uref到Udc/√3附近,观察相电流或线电压FFT,会发现基波幅值在Udc/√3处开始出现明显畸变,这就是进入过调制区的标志。

6.3 死区、母线波动和限幅的实际影响

最后提醒几个实际调试的坑。第一,死区时间会吃掉一部分有效输出电压,尤其母线电压低、死区时间长的时候,线电压基波会比理论值低几个百分点,这是正常现象,不是SVPWM公式错了。第二,公式里的Udc必须用ADC实时采样的实际母线电压,而不是额定值或标称值,不然调制深度判断会偏。第三,限幅时如果T1+T2超过Ts,要用等比例缩放而不是粗暴截断,否则合成矢量的方向会偏,电流波形会出现明显畸变。

我自己在实际调试中还加了一个保护:限幅之前预留最小脉宽,把最大的T1+T2限制在Ts减两倍死区时间,这样能保证上下桥臂不会因为占空比过满而失去死区保护。这个细节在教科书里很少提到,但现场跑电机时非常管用。

把2Udc/3彻底想明白之后,再看SVPWM的扇区判断、时间计算、过调制,整个逻辑链都是通的。建议你也花十分钟,用同样的方法把六个非零矢量全部手推一遍。推完你会发现,那些看似死记硬背的公式,其实自己也能推导出来。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/8 7:33:53

智能温控板定制开发全流程解析:从需求量化到硬件算法实战

做了这么多年嵌入式硬件,我最大的感受是:温控项目看着简单,真正做好却极其考验基本功。一个加热棒、一个传感器、一块单片机,谁都能把温度“控制住”,但要做到精度稳定、曲线平滑、批量一致性好,那就完全是…

作者头像 李华
网站建设 2026/9/8 7:33:37

Eclipse配置JSLint插件:安装、配置与排坑完整指南

简介:一套用于Eclipse集成开发环境的JSLint插件资源包,面向需要在IDE中强化JavaScript静态检查、提升代码可维护性的开发者。压缩包共包含2个文件,包括1个js脚本与1个wsf配置文件,核心JSLint.js负责按Crockford规范扫描潜在错误与…

作者头像 李华
网站建设 2026/9/8 7:32:49

NovaNova Studio:Agent驱动的AI图片视频生成与无限画布工作台

看到这个项目标题的时候,我第一反应是:终于在开源社区里有人把这几个东西揉到一起了。做AI绘画和视频创作的朋友应该都有同感——Stable Diffusion出图很强,但只能单张处理;ComfyUI自由度够高,但工作流一复杂就乱成一团…

作者头像 李华
网站建设 2026/9/8 7:32:40

工业AI轻量化落地实战:从目标收敛到边缘部署的完整指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/8 7:32:13

PHPwind 7.5 sp3风格美化插件完整安装与二次定制实战指南

简介:这是一款针对PHPwind 7.5 SP3论坛开发的风格美化插件组合包,面向需要快速提升首页信息密度与视觉效果的站长及二次开发爱好者,可有效解决默认首页布局单调、缺少动态信息聚合与气象/名言展示模块的问题。压缩包共55个文件,体…

作者头像 李华
网站建设 2026/9/8 7:31:52

手写RTOS核心:信号量如何解决任务同步与互斥问题

从LED闪烁异常到信号量:一次真实的任务协作问题上一篇文章我们把任务调度器跑通了,多个任务可以轮转切换,"点灯大师"们也能各自闪烁互不干扰了。但问题是,板子上的场景很快就变得不满足于"独立闪烁"了——我想…

作者头像 李华