3、电机驱动核心:电压源逆变器(VSI)拓扑、SVPWM调制原理、死区效应及补偿方法

各位同学,今天我们聊点真正硬核的东西——电机驱动的心脏。说白了,就是怎么把直流电变成交流电,让电机转起来。

我个人习惯把逆变器比作“电力电子界的翻译官”。它把电池或直流母线里那种单调的直流电,翻译成电机听得懂的交流电。翻译得不好,电机就抖、就响、就发热。翻译得好,电机就能安静、高效地转。

3.1 电压源逆变器(VSI)拓扑:三相桥的“骨架”

先看最经典的三相两电平电压源逆变器。这是目前工业界应用最广的拓扑,没有之一。

结构上,它由六个开关管(IGBT或MOSFET)和六个反并联二极管组成。上桥臂三个,下桥臂三个,组成三个半桥。每个半桥输出一相电压。

我在项目中遇到过一个问题:有同事把上下桥臂的驱动信号搞反了,结果一上电就炸管。嗯,这里要注意——上下桥臂绝对不能同时导通,否则就是直通短路,瞬间冒烟。

核心要点:

  • 每个桥臂只有两种状态:上管导通(1)或下管导通(0)
  • 三相共 2³ = 8 种开关状态
  • 其中6个有效矢量,2个零矢量(000和111)

你想想看,这8个状态在空间里画出来,就是六个扇区。这就是SVPWM的基础。

三相电压源逆变器拓扑与开关状态 Vdc+ Vdc- Q1 Q3 Q5 Q2 Q4 Q6 A相 B相 C相 开关状态: 100(矢量1) → 110(矢量2) → 010(矢量3) → 011(矢量4) → 001(矢量5) → 101(矢量6)

3.2 SVPWM调制原理:从“开关”到“正弦波”

SVPWM,全称是空间矢量脉宽调制。名字听着唬人,其实原理很直观。

我们想要的是一个旋转的电压矢量。但逆变器只能输出8个离散的矢量,怎么办?

答案是:用相邻的两个有效矢量和零矢量,通过时间加权平均,合成任意方向和大小的电压矢量。这就是“伏秒平衡”原则。

我记得刚入行时,师傅跟我说:“SVPWM的本质就是查表+算时间。” 后来我自己做项目,发现确实如此。

我的经验:

SVPWM相比SPWM,直流电压利用率提高了约15%。这意味着同样的电池电压,电机能跑更快。我在做飞轮储能项目时,就靠这个多榨出了5%的转速余量。

具体实现步骤,我总结为三步:

  1. 判断扇区:根据参考电压矢量Uα、Uβ,判断它在哪个扇区
  2. 计算作用时间:算出两个相邻矢量和零矢量的作用时间T1、T2、T0
  3. 生成PWM波:根据时间分配,生成七段式或五段式PWM波形

下面给出一段我常用的扇区判断代码,C语言写的,简洁实用:

// 扇区判断函数
int svpwm_sector_calc(float Ualpha, float Ubeta) {
    float U1 = Ubeta;
    float U2 = -0.5f * Ubeta + 0.866f * Ualpha;
    float U3 = -0.5f * Ubeta - 0.866f * Ualpha;
    
    int sector = 0;
    if (U1 > 0) sector |= 1;
    if (U2 > 0) sector |= 2;
    if (U3 > 0) sector |= 4;
    
    return sector;
}

这段代码我用了快十年,从DSP移植到MCU,从定点数改到浮点数,一直很稳定。你想想看,就三行判断,搞定扇区识别,多清爽。

3.3 死区效应:理想很丰满,现实很骨感

前面我说过,上下桥臂不能同时导通。但实际中,开关管有开通和关断时间,不可能瞬间切换。

所以,我们必须在上下管切换时,插入一段“死区时间”——两个管子都关断。这就是死区(Dead Time)。

死区是必要的,但它会带来副作用。我把它总结为三个问题:

  • 电压畸变:死区导致输出电压基波幅值降低,波形出现“平顶”
  • 电流谐波:低次谐波增加,电机发热加剧
  • 转矩脉动:低速时尤其明显,电机可能“一抖一抖”的

避坑指南:

我曾经在一个高速电机项目中,死区时间设了3μs,结果电机在500Hz运行时电流波形严重畸变,系统直接过流保护。后来发现,死区时间占开关周期的比例太大了。高速运行时,死区效应会被放大,必须做补偿。

3.4 死区补偿方法:把“坑”填上

死区补偿的思路,说白了就是“预测电流方向,修正PWM脉宽”。

为什么跟电流方向有关?因为死区期间,电流通过续流二极管续流,输出电压取决于电流方向。电流为正时,输出被拉低;电流为负时,输出被抬升。

常用的补偿方法有几种:

补偿方法 原理 优缺点
电流极性检测法 检测相电流方向,补偿对应脉宽 简单,但电流过零时容易误判
平均电压补偿法 根据死区时间计算平均电压误差,叠加到参考电压 实现方便,但动态响应慢
脉冲宽度修正法 在PWM比较值上直接加减补偿量 精度高,适合高速场合

我个人最常用的是脉冲宽度修正法。在DSP的PWM模块里,直接修改比较寄存器的值。代码实现如下:

// 死区补偿:根据电流方向修正PWM比较值
void deadtime_compensate(float ia, float ib, float ic, 
                         uint16_t *cmpA, uint16_t *cmpB, uint16_t *cmpC) {
    uint16_t dt_comp = (uint16_t)(DEADTIME / PWM_PERIOD * TIMER_MAX);
    
    if (ia > 0) *cmpA += dt_comp;  // 电流正,补偿增加
    else        *cmpA -= dt_comp;  // 电流负,补偿减少
    
    if (ib > 0) *cmpB += dt_comp;
    else        *cmpB -= dt_comp;
    
    if (ic > 0) *cmpC += dt_comp;
    else        *cmpC -= dt_comp;
}

这里有个坑——电流过零检测。当电流接近零时,噪声容易导致极性误判,补偿反而会引入更大的畸变。我的做法是加一个滞环比较器,电流绝对值小于某个阈值时,不补偿。

总结一下:

VSI是骨架,SVPWM是灵魂,死区补偿是细节。骨架要结实,灵魂要纯净,细节要到位。这三样做好了,电机驱动就成功了一大半。

好了,这一节的内容就到这里。记住,理论要落地,代码要调试,经验要积累。下次见。


专注资料整理