3. 过调制模式一:最小相位误差法,保持矢量角度不变,只调整幅值

好,咱们正式开始聊过调制。这一章我先讲第一种方法——最小相位误差法。

说白了,它的核心思想就一句话:我不管电压矢量的角度怎么偏,我只管把它的幅值拉长,拉到六边形边界上。 角度?不动。相位误差?最小化。

你想想看,传统SVPWM在进入过调制区之后,参考电压矢量会跑到六边形外面去。这时候如果你硬要合成,逆变器根本输出不了那么高的电压。怎么办?最简单的办法就是——把矢量拽回来,拽到六边形的边上,但方向不变。

核心原则:保持矢量角度 θ 不变,仅将幅值 Vref 限制在六边形边界上。

3.1 为什么先讲这个方法?

我个人习惯,讲技术一定要从最简单的入手。最小相位误差法,就是所有过调制算法里最直观、最容易实现的一种。

我记得刚做FOC那会儿,第一次遇到母线电压利用率不够的问题。电机转速一高,电流波形就开始扭曲,噪声也大。我当时第一反应就是——是不是SVPWM饱和了?后来一查,果然是参考电压超出了六边形。

那时候我用的就是最小相位误差法。为什么?因为好调,好验证,不容易出bug。

3.2 算法原理

咱们先回顾一下正常SVPWM的线性区。在线性区,参考电压矢量 Vref 的轨迹是一个圆,完全内切于六边形。这时候调制比 M ≤ 0.9069。

一旦 M > 0.9069,圆就跑出去了。这时候你拿到的 Vref 有一部分在六边形外面。最小相位误差法的做法是:

  1. 计算当前扇区:根据 Vα 和 Vβ 判断参考矢量落在哪个扇区。
  2. 计算六边形边界:根据扇区,算出该角度下六边形边界的幅值 Vmax(θ)。
  3. 限幅:如果 |Vref| > Vmax(θ),则令 |Vref| = Vmax(θ),角度不变。

就这么简单。没有迭代,没有查表,没有复杂的三角函数逼近。

小提示:Vmax(θ) 的计算其实有闭式解。每个扇区边界是一条直线,你只需要根据角度算出直线上的幅值即可。具体公式我后面会贴。

3.3 数学表达

假设参考电压矢量在扇区 I(0° ~ 60°),六边形边界的表达式为:

V_max(θ) = V_dc / (√3 * cos(30° - θ))

其中 θ 是矢量相对于扇区起始边的角度,范围 0° ~ 60°。

那么过调制后的输出电压为:

V_out = V_ref,                 if |V_ref| ≤ V_max(θ)
V_out = V_max(θ) * (V_ref / |V_ref|),   if |V_ref| > V_max(θ)

说白了,就是做一个矢量限幅。角度不变,幅值砍到边界上。

3.4 代码实现

下面我给出一段C语言风格的伪代码。这是我当年在STM32F4上跑过的版本,稍微改改就能用。

// 输入:V_alpha, V_beta (参考电压)
// 输出:V_alpha_lim, V_beta_lim (限幅后的电压)

void svpwm_overmod_min_phase(float V_alpha, float V_beta,
                             float *V_alpha_lim, float *V_beta_lim) {
    float V_ref = sqrtf(V_alpha*V_alpha + V_beta*V_beta);
    float theta = atan2f(V_beta, V_alpha);
    
    // 1. 判断扇区
    int sector = get_sector(theta);
    
    // 2. 计算该扇区边界幅值
    float V_max = calc_boundary_amplitude(theta, sector);
    
    // 3. 限幅
    if (V_ref > V_max) {
        float scale = V_max / V_ref;
        *V_alpha_lim = V_alpha * scale;
        *V_beta_lim = V_beta * scale;
    } else {
        *V_alpha_lim = V_alpha;
        *V_beta_lim = V_beta;
    }
}

注意:这里用了 sqrtf 和 atan2f,计算量稍大。如果要在低成本MCU上跑,建议用查表法或者CORDIC近似。我曾经在STM32F103上试过,直接算的话,10kHz的电流环会吃掉不少CPU时间。

3.5 波形分析

咱们来看看这个方法的输出波形长什么样。

在过调制区,输出电压的轨迹不再是圆,而是六边形的边。具体来说:

  • 低过调制区(0.9069 < M < 0.95):大部分时间矢量还在圆内,只有峰值附近被削平。波形失真不大。
  • 高过调制区(0.95 < M < 1.0):矢量几乎全程都在六边形边上跑。输出电压波形接近六边形,谐波含量明显增加。

我当年做测试的时候,用示波器看过相电压波形。M=0.92的时候,波形还比较正弦;M=0.98的时候,波形顶部明显变平了,像被切了一刀。

3.6 优缺点对比

项目 说明
优点 实现简单,计算量小,相位误差最小
缺点 电压利用率提升有限(最大M=1.0),谐波较大
适用场景 对谐波不敏感、要求快速实现过调制的场合
不适用场景 低噪音要求、高精度电流控制

3.7 避坑指南

我曾经踩过一个坑,说出来你可能不信——扇区边界判断搞错了。

那时候我直接用 atan2 算角度,然后根据角度范围判断扇区。结果在扇区边界附近,由于浮点精度问题,角度会抖动,导致扇区判断来回跳。输出电压一下子跳到另一个扇区的边界上,电流波形出现毛刺。

后来怎么解决的?我加了一个滞回比较器。在扇区边界附近,保持上一次的扇区判断结果,直到角度变化超过一个阈值(比如1°)才切换。问题就解决了。

经验之谈:扇区判断的滞回阈值不要设太大,否则会引入额外的相位延迟。我一般设0.5° ~ 1.5°,具体看你的PWM频率和电机转速。

3.8 本章小结

最小相位误差法,说白了就是「砍幅值,保角度」。它是最简单的过调制方法,适合入门和理解概念。虽然性能不是最优,但作为过调制技术的第一课,它把核心问题讲清楚了——当参考电压超出六边形时,我们该怎么处理。

下一章我会讲第二种方法,那个就稍微复杂一点了。不过别急,先把这一章吃透。

最小相位误差法过调制流程 输入 Vα, Vβ 计算 |Vref| 和 θ 判断扇区 Sector 计算 Vmax(θ) |Vref| > Vmax? 是 限幅:Vout = Vmax 否 保持:Vout = Vref 关键点 角度 θ 全程不变