三电平矢量表达式MATLAB实现

1. 通用计算公式 (General Formula)

对于任意开关状态组合 SaSbScS_a S_b S_cSaSbSc(其中 Sx∈{P,O,N}S_x \in \{P, O, N\}Sx∈{P,O,N}),其对应的空间矢量 V⃗\vec{V}V 通用计算公式为:

V⃗=23(Va⋅ej0+Vb⋅ej2π3+Vc⋅ej4π3) \vec{V} = \frac{2}{3} \left( V_a \cdot e^{j0} + V_b \cdot e^{j\frac{2\pi}{3}} + V_c \cdot e^{j\frac{4\pi}{3}} \right) V =32(Va⋅ej0+Vb⋅ej32π+Vc⋅ej34π)

其中相电压 VxV_xVx 与开关状态的映射关系为:

  • P (Positive) : Vx=+Udc2V_x = +\frac{U_{dc}}{2}Vx=+2Udc
  • O (Zero) : Vx=0V_x = 0Vx=0
  • N (Negative) : Vx=−Udc2V_x = -\frac{U_{dc}}{2}Vx=−2Udc

代入后可简化为系数形式:
V⃗=Udc3(ka⋅ej0+kb⋅ej2π3+kc⋅ej4π3) \vec{V} = \frac{U_{dc}}{3} \left( k_a \cdot e^{j0} + k_b \cdot e^{j\frac{2\pi}{3}} + k_c \cdot e^{j\frac{4\pi}{3}} \right) V =3Udc(ka⋅ej0+kb⋅ej32π+kc⋅ej34π)
(其中 kx∈{1,0,−1}k_x \in \{1, 0, -1\}kx∈{1,0,−1} 对应 {P,O,N}\{P, O, N\}{P,O,N})


2. 完整分类对照表 (序号 | 名称 | 矢量表达式 | 开关状态)

序号 名称 (分类) 矢量表达式 (极坐标) 矢量表达式 (代数形式) 对应开关状态 (冗余状态)
0 零矢量 000 000 PPP, OOO, NNN
1 小矢量 Udc3ej0\frac{U_{dc}}{3} e^{j0}3Udcej0 Udc3\frac{U_{dc}}{3}3Udc POO, ONN
2 小矢量 Udc3ejπ3\frac{U_{dc}}{3} e^{j\frac{\pi}{3}}3Udcej3π Udc3(12+j32)\frac{U_{dc}}{3}(\frac{1}{2} + j\frac{\sqrt{3}}{2})3Udc(21+j23 ) PPO, OON
3 小矢量 Udc3ej2π3\frac{U_{dc}}{3} e^{j\frac{2\pi}{3}}3Udcej32π Udc3(−12+j32)\frac{U_{dc}}{3}(-\frac{1}{2} + j\frac{\sqrt{3}}{2})3Udc(−21+j23 ) OPO, NON
4 小矢量 Udc3ejπ\frac{U_{dc}}{3} e^{j\pi}3Udcejπ −Udc3-\frac{U_{dc}}{3}−3Udc OPP, NOO
5 小矢量 Udc3ej4π3\frac{U_{dc}}{3} e^{j\frac{4\pi}{3}}3Udcej34π Udc3(−12−j32)\frac{U_{dc}}{3}(-\frac{1}{2} - j\frac{\sqrt{3}}{2})3Udc(−21−j23 ) OOP, NNO
6 小矢量 Udc3ej5π3\frac{U_{dc}}{3} e^{j\frac{5\pi}{3}}3Udcej35π Udc3(12−j32)\frac{U_{dc}}{3}(\frac{1}{2} - j\frac{\sqrt{3}}{2})3Udc(21−j23 ) POP, ONO
7 中矢量 Udc3ejπ6\frac{U_{dc}}{\sqrt{3}} e^{j\frac{\pi}{6}}3 Udcej6π Udc3(32+j12)\frac{U_{dc}}{\sqrt{3}}(\frac{\sqrt{3}}{2} + j\frac{1}{2})3 Udc(23 +j21) PON
8 中矢量 Udc3ejπ2\frac{U_{dc}}{\sqrt{3}} e^{j\frac{\pi}{2}}3 Udcej2π jUdc3j\frac{U_{dc}}{\sqrt{3}}j3 Udc OPN
9 中矢量 Udc3ej5π6\frac{U_{dc}}{\sqrt{3}} e^{j\frac{5\pi}{6}}3 Udcej65π Udc3(−32+j12)\frac{U_{dc}}{\sqrt{3}}(-\frac{\sqrt{3}}{2} + j\frac{1}{2})3 Udc(−23 +j21) NPO
10 中矢量 Udc3ej7π6\frac{U_{dc}}{\sqrt{3}} e^{j\frac{7\pi}{6}}3 Udcej67π Udc3(−32−j12)\frac{U_{dc}}{\sqrt{3}}(-\frac{\sqrt{3}}{2} - j\frac{1}{2})3 Udc(−23 −j21) NOP
11 中矢量 Udc3ej3π2\frac{U_{dc}}{\sqrt{3}} e^{j\frac{3\pi}{2}}3 Udcej23π −jUdc3-j\frac{U_{dc}}{\sqrt{3}}−j3 Udc ONP
12 中矢量 Udc3ej11π6\frac{U_{dc}}{\sqrt{3}} e^{j\frac{11\pi}{6}}3 Udcej611π Udc3(32−j12)\frac{U_{dc}}{\sqrt{3}}(\frac{\sqrt{3}}{2} - j\frac{1}{2})3 Udc(23 −j21) PNO
13 大矢量 2Udc3ej0\frac{2U_{dc}}{3} e^{j0}32Udcej0 2Udc3\frac{2U_{dc}}{3}32Udc PNN
14 大矢量 2Udc3ejπ3\frac{2U_{dc}}{3} e^{j\frac{\pi}{3}}32Udcej3π 2Udc3(12+j32)\frac{2U_{dc}}{3}(\frac{1}{2} + j\frac{\sqrt{3}}{2})32Udc(21+j23 ) PPN
15 大矢量 2Udc3ej2π3\frac{2U_{dc}}{3} e^{j\frac{2\pi}{3}}32Udcej32π 2Udc3(−12+j32)\frac{2U_{dc}}{3}(-\frac{1}{2} + j\frac{\sqrt{3}}{2})32Udc(−21+j23 ) NPN
16 大矢量 2Udc3ejπ\frac{2U_{dc}}{3} e^{j\pi}32Udcejπ −2Udc3-\frac{2U_{dc}}{3}−32Udc NPP
17 大矢量 2Udc3ej4π3\frac{2U_{dc}}{3} e^{j\frac{4\pi}{3}}32Udcej34π 2Udc3(−12−j32)\frac{2U_{dc}}{3}(-\frac{1}{2} - j\frac{\sqrt{3}}{2})32Udc(−21−j23 ) NNP
18 大矢量 2Udc3ej5π3\frac{2U_{dc}}{3} e^{j\frac{5\pi}{3}}32Udcej35π 2Udc3(12−j32)\frac{2U_{dc}}{3}(\frac{1}{2} - j\frac{\sqrt{3}}{2})32Udc(21−j23 ) PNP

3. 关键数据总结

  • 总状态数 : 33=273^3 = 2733=27 种开关组合。
  • 唯一矢量数 : 19 个 (1个零矢量 + 6个小矢量 + 6个中矢量 + 6个大矢量)。
    • 注:小矢量有冗余(每个矢量对应2种开关状态),零矢量有3种状态,中矢量和大矢量无冗余(各对应1种状态)。
  • 幅值规律 :
    • 小矢量 (Small) : ∣V⃗∣=13Udc≈0.333Udc|\vec{V}| = \frac{1}{3} U_{dc} \approx 0.333 U_{dc}∣V ∣=31Udc≈0.333Udc
    • 中矢量 (Medium) : ∣V⃗∣=13Udc≈0.577Udc|\vec{V}| = \frac{1}{\sqrt{3}} U_{dc} \approx 0.577 U_{dc}∣V ∣=3 1Udc≈0.577Udc
    • 大矢量 (Large) : ∣V⃗∣=23Udc≈0.667Udc|\vec{V}| = \frac{2}{3} U_{dc} \approx 0.667 U_{dc}∣V ∣=32Udc≈0.667Udc
  • 角度分布 :
    • 小矢量与大矢量角度重合 (0∘,60∘,...0^\circ, 60^\circ, \dots0∘,60∘,...)。
    • 中矢量位于两者中间 (30∘,90∘,...30^\circ, 90^\circ, \dots30∘,90∘,...)。

这个表格可以直接用于编写空间矢量调制(SVM)算法的代码查找表或进行理论推导在这里插入代码片。

MATLAB实现见下

matlab 复制代码
    % 清除环境
    clc; clear; close all;

    %% 1. 参数定义
    Udc = 1; % 归一化直流母线电压 (设为1方便观察比例)
    
    % 开关状态映射: P=1, O=0, N=-1 (对应电压 +Udc/2, 0, -Udc/2)
    % 注意:公式系数会自动处理 Udc/2 到 Udc/3 的转换
    states = {'P', 'O', 'N'};
    values = [1, 0, -1]; 
    
    %% 2. 生成所有 27 种组合并计算矢量
    sv_list = struct();
    idx = 0;
    
    fprintf('=================================================================================\n');
    fprintf('序号 | 名称   | 幅值 (归一化) | 角度 (度) | 矢量表达式 (极坐标)      | 开关状态\n');
    fprintf('---------------------------------------------------------------------------------\n');

    for ia = 1:3
        for ib = 1:3
            for ic = 1:3
                idx = idx + 1;
                
                % 获取当前开关状态的数值 (k_a, k_b, k_c)
                ka = values(ia);
                kb = values(ib);
                kc = values(ic);
                
                % 获取开关状态字符 (e.g., 'P', 'O', 'N')
                sa = states{ia};
                sb = states{ib};
                sc = states{ic};
                switch_str = [sa, sb, sc];
                
                % --- 核心计算公式 ---
                % V = (2/3) * (Va + Vb*e^(j2pi/3) + Vc*e^(j4pi/3))
                % 其中 Vx = kx * (Udc/2)
                % 代入后: V = (Udc/3) * (ka + kb*e^(j2pi/3) + kc*e^(j4pi/3))
                
                alpha = 0;
                beta  = 2*pi/3;
                gamma = 4*pi/3;
                
                V_complex = (Udc/3) * (ka * exp(1j*alpha) + ...
                                       kb * exp(1j*beta)  + ...
                                       kc * exp(1j*gamma));
                
                mag = abs(V_complex);
                ang = angle(V_complex); % 弧度
                ang_deg = rad2deg(ang);
                if ang_deg < 0, ang_deg = ang_deg + 360; end
                
                % --- 分类逻辑 (基于幅值容差) ---
                tol = 1e-6;
                if mag < tol
                    type_name = '零矢量';
                    type_id = 0;
                elseif abs(mag - Udc/3) < 0.01
                    type_name = '小矢量';
                    type_id = 1;
                elseif abs(mag - Udc/sqrt(3)) < 0.01
                    type_name = '中矢量';
                    type_id = 2;
                elseif abs(mag - 2*Udc/3) < 0.01
                    type_name = '大矢量';
                    type_id = 3;
                else
                    type_name = '未知';
                    type_id = -1;
                end
                
                % 存储数据
                sv_list(idx).id = idx;
                sv_list(idx).name = type_name;
                sv_list(idx).mag = mag;
                sv_list(idx).ang_deg = ang_deg;
                sv_list(idx).V = V_complex;
                sv_list(idx).switch = switch_str;
                
                % 格式化输出到命令行
                % 构造极坐标字符串
                if mag < tol
                    polar_str = '0';
                else
                    polar_str = sprintf('%.3f Udc ∠%d°', mag/Udc, round(ang_deg));
                end
                
                fprintf('%4d | %-6s | %10.4f    | %8.1f  | %-24s | %s\n', ...
                    idx, type_name, mag/Udc, ang_deg, polar_str, switch_str);
            end
        end
    end
    fprintf('=================================================================================\n');
相关推荐
xyq20242 小时前
jEasyUI 创建 XP 风格左侧面板
开发语言
赫瑞2 小时前
Java中的最长公共子序列——LCS
java·开发语言
于先生吖2 小时前
零基础开发国际版同城出行平台 JAVA 顺风车预约系统实战教学
java·开发语言
代码雕刻家2 小时前
2.22.StringBuffer类的常见用法、
java·开发语言
明月(Alioo)2 小时前
Python 并发编程详解 - Java 开发者视角
java·开发语言·python
JAVA+C语言2 小时前
C++ STL map 系列全方位解析
开发语言·c++
福赖2 小时前
《C#反射机制》
开发语言·c#
小白小宋2 小时前
PRACH 前导序列生成详解与Matlab实现
5g·matlab·信息与通信·信号处理