第2章 参考电压矢量合成:伏秒平衡原理

好,咱们正式开始啃SVPWM的核心骨头。

上一章我们聊了什么是空间矢量,以及为什么非要搞出六个扇区。这一章,我要带你彻底搞明白一个关键问题:给定一个任意方向、任意长度的参考电压矢量,怎么用六个固定的开关矢量把它拼出来?

说白了,就是“巧妇难为无米之炊”里的那个“炊”。你手里只有六个方向(基本矢量)和两个零矢量,但你要合成一个任意方向的矢量。怎么办?

答案就是四个字:伏秒平衡。

2.1 伏秒平衡:SVPWM的底层逻辑

这个概念其实不复杂。你想想看,一个电压矢量作用在电机绕组上,会产生磁链。电压乘以时间,就是伏秒积,它直接决定了磁链的变化量。

伏秒平衡原理讲的是:在一个开关周期内,用相邻基本矢量分别作用一段时间,它们产生的总伏秒积,应该等于参考矢量连续作用整个周期所产生的伏秒积。

核心公式(伏秒平衡):

Uref · Ts = Ux · Tx + Uy · Ty + U0 · T0

其中:

  • Uref:参考电压矢量
  • Ts:开关周期(PWM周期)
  • Ux、Uy:相邻的两个基本非零矢量
  • Tx、Ty:两个基本矢量的作用时间
  • U0:零矢量(U0或U7)
  • T0:零矢量作用时间

这个公式看着简单,但它是整个SVPWM的基石。我在做第一个电机驱动项目时,就是死磕这个公式,才把波形调顺的。

2.2 相邻矢量作用时间计算

好,公式有了,怎么算时间?

我们以参考矢量落在第I扇区为例。这个扇区的相邻矢量是U4(100)和U6(110)。

计算步骤其实就三步:

  1. 分解参考矢量:把Uref投影到U4和U6的方向上。
  2. 列伏秒平衡方程:α轴和β轴分别列方程。
  3. 解方程:求出T4和T6。

具体推导过程我直接给你结果,这是最常用的公式:

第I扇区作用时间公式:

T4 = (√3 · Ts · |Uref| / Udc) · sin(π/3 - θ)
T6 = (√3 · Ts · |Uref| / Udc) · sin(θ)
T0 = Ts - T4 - T6

其中:

  • Udc:直流母线电压
  • θ:参考矢量在扇区内的角度(0~60°)
  • |Uref|:参考矢量的模长

嗯,这里要注意:T4 + T6 必须 ≤ Ts。如果算出来大于Ts,说明你过调制了,需要限幅处理。这个我们后面章节会专门讲。

其他五个扇区的公式,其实就是把角度偏移一下。我习惯用一个通用公式来处理所有扇区,避免写六个分支代码。具体做法是:

  • 先根据扇区号,把参考矢量角度归一化到0~60°
  • 然后用上面第I扇区的公式计算
  • 最后根据扇区号,把Tx和Ty映射到对应的基本矢量上

这样做的好处是代码简洁,不容易出错。我曾经在项目里用switch-case写了六个扇区的独立计算,结果调试时发现一个扇区的角度边界算错了,排查了半天……后来就改成统一公式了。

2.3 零矢量分配策略

时间算出来了,但还有个问题:零矢量怎么分配?

零矢量有两个:U0(000)和U7(111)。它们的作用效果一样,但分配方式不同,会直接影响输出波形的谐波含量和开关损耗。

常见的分配策略有三种:

策略名称 分配方式 特点 适用场景
对称分配 T0均分给U0和U7 谐波最小,波形对称 通用场合,最常用
非对称分配 T0全部给U0或U7 开关次数少,损耗低 对效率要求高的场合
混合分配 根据调制深度动态调整 兼顾谐波和损耗 高性能驱动

我个人最常用的是对称分配。为什么呢?因为它产生的PWM波形是中心对称的,谐波主要集中在开关频率的整数倍附近,低频谐波含量低,电机运行更平稳。

避坑指南:

我曾经在一个项目中,为了省事,用了非对称分配(T0全部分给U7)。结果电机在低速运行时噪音特别大,一测电流波形,发现5次、7次谐波明显偏高。后来换成对称分配,问题就解决了。

所以我的建议是:除非你对效率有极致要求,否则默认用对称分配。

2.4 知识体系总览

这一章的内容比较多,我画了一张图帮你梳理整个逻辑链条:

第2章 参考电压矢量合成 · 知识体系 输入:Uref, θ, Ts, Udc 核心原理:伏秒平衡 Uref·Ts = Ux·Tx + Uy·Ty + U0·T0 步骤1:扇区判断 步骤2:Tx, Ty计算 步骤3:零矢量分配 输出:Tx, Ty, T0 及开关序列 关键:Tx+Ty ≤ Ts,否则进入过调制区,需限幅处理 零矢量分配推荐对称分配(T0均分给U0和U7),谐波性能最优

2.5 代码实现示例

理论讲完了,咱们看看代码怎么写。下面是一个计算第I扇区作用时间的C语言函数:

/**
 * @brief 计算第I扇区基本矢量作用时间
 * @param Uref    参考电压矢量模长 (V)
 * @param theta   参考矢量在扇区内角度 (rad), 范围0~π/3
 * @param Ts      开关周期 (s)
 * @param Udc     直流母线电压 (V)
 * @param pT4     输出U4作用时间指针
 * @param pT6     输出U6作用时间指针
 * @param pT0     输出零矢量作用时间指针
 * @return        0: 正常   -1: 过调制
 */
int calc_sector1_times(float Uref, float theta, float Ts, float Udc,
                       float *pT4, float *pT6, float *pT0)
{
    float T4, T6, T0;
    float sqrt3 = 1.7320508f;
    
    // 计算T4和T6
    T4 = (sqrt3 * Ts * Uref / Udc) * sinf(M_PI/3.0f - theta);
    T6 = (sqrt3 * Ts * Uref / Udc) * sinf(theta);
    
    // 检查是否过调制
    if ((T4 + T6) > Ts) {
        // 过调制,按比例限幅
        float scale = Ts / (T4 + T6);
        T4 *= scale;
        T6 *= scale;
        T0 = 0.0f;
        *pT4 = T4;
        *pT6 = T6;
        *pT0 = T0;
        return -1;  // 返回过调制标志
    }
    
    // 正常情况,计算零矢量时间(对称分配)
    T0 = Ts - T4 - T6;
    
    *pT4 = T4;
    *pT6 = T6;
    *pT0 = T0;
    
    return 0;
}

代码要点:

  • 过调制检测一定要做,否则电机电流会畸变
  • 限幅时保持T4和T6的比例不变,这样矢量方向不变
  • 零矢量时间T0均分给U0和U7,各占T0/2

好了,这一章的内容就到这里。伏秒平衡是SVPWM的魂,时间计算是骨架,零矢量分配是血肉。把这三块吃透了,后面的调制深度计算、过调制处理,你学起来会轻松很多。