3. SVPWM基础:空间矢量调制原理、扇区判断、基本电压矢量合成、死区时间配置
好,咱们进入SVPWM的世界。说实话,我刚接触电机控制那会儿,看到SVPWM的矢量图和各种公式,头都是大的。但后来我发现,这东西说白了就是一种让电机转得更顺、电压利用率更高的调制方式。比传统的SPWM(正弦脉宽调制)强在哪?电压利用率能提高15%左右,谐波也更小。
今天这一章,我带你把这几个核心问题啃下来:空间矢量到底是个啥?怎么判断扇区?怎么合成想要的电压?还有那个让人头疼的死区时间,到底该怎么配。
3.1 空间矢量调制原理
先说说空间矢量的概念。你想想看,三相电机里,A、B、C三相电压是随时间正弦变化的。但如果我们把这三相电压看作一个在复平面上旋转的矢量,事情就简单多了。
这个旋转矢量的长度,就是相电压的幅值,它的旋转速度就是电角频率。SVPWM的核心思想,就是用逆变器能产生的有限个开关状态,去逼近这个旋转的参考电压矢量。
逆变器有6个开关管,上桥臂3个,下桥臂3个。同一桥臂上下不能同时导通,所以一共有2³ = 8种开关状态。其中6种是有效矢量,2种是零矢量(全部上通或全部下通)。
关键点:SVPWM不是直接控制每相电压的大小,而是控制一个合成矢量在空间中的位置和长度。这个合成矢量在复平面上转一圈,电机就转一个电周期。
我在项目里调试第一版SVPWM时,发现电机噪音特别大。后来查了半天,发现是扇区判断的边界条件写错了,导致矢量跳变。嗯,这种坑踩过一次就记住了。
3.2 扇区判断
参考电压矢量在复平面上旋转,我们需要知道它当前落在哪个扇区。六个扇区,每个60度,怎么判断?
我习惯用三值法。先根据α-β坐标系下的分量Uα和Uβ,计算三个中间变量:
// 计算三个参考值
Vref1 = Uβ
Vref2 = (√3/2)*Uα - (1/2)*Uβ
Vref3 = -(√3/2)*Uα - (1/2)*Uβ
然后根据这三个值的符号,查表得到扇区号:
| Vref1 | Vref2 | Vref3 | 扇区 |
|---|---|---|---|
| >0 | >0 | <0 | I |
| >0 | <0 | <0 | II |
| >0 | <0 | >0 | III |
| <0 | <0 | >0 | IV |
| <0 | >0 | >0 | V |
| <0 | >0 | <0 | VI |
其实还有一种更直接的方法,用Uα和Uβ的反正切算角度,然后除以60度取整。但反正切计算在MCU上比较慢,我一般用上面的查表法,快得很。
小技巧:扇区判断的边界条件要注意处理等于0的情况。我曾经因为没处理Uβ=0时的边界,导致扇区在边界处来回跳,电机一顿一顿的。建议把大于0和大于等于0统一处理,或者加个死区。
3.3 基本电压矢量合成
知道扇区之后,就要用这个扇区相邻的两个基本电压矢量来合成参考矢量了。比如参考矢量在扇区I,就用U₀(100)和U₆₀(110)来合成。
合成公式其实很简单,就是伏秒平衡原理:
T = Ts * (Uref / Udc) * sin(60° - θ) / sin(60°)
T1 = Ts * (Uref / Udc) * sin(θ) / sin(60°)
T0 = Ts - T - T1
其中:
- Ts:PWM周期
- Uref:参考电压矢量幅值
- Udc:母线电压
- θ:参考矢量在扇区内的角度(0~60°)
- T、T1:两个基本矢量的作用时间
- T0:零矢量作用时间
实际代码里,我一般会把sin(60°)和1/sin(60°)提前算好存成常量,省得每次算。另外,Uref/Udc这个比值不能超过1/√3,否则就过调制了。过调制时电机电流会畸变,我遇到过一回,电机啸叫得厉害。
注意:当Uref/Udc > 1/√3时,进入过调制区。此时需要对T和T1进行等比例缩放,保证T + T1 ≤ Ts。否则PWM周期会溢出,导致开关管异常导通。
零矢量的分配也有讲究。我习惯用七段式SVPWM,就是把零矢量拆成两段,分别放在周期开头和结尾。这样开关次数均匀,谐波小。五段式虽然开关次数少,但谐波大一些,对电机轴承不好。
3.4 死区时间配置
死区时间,说白了就是防止同一桥臂上下管直通的那段空白时间。IGBT或MOSFET关断需要时间,如果上管还没完全关断,下管就导通了,那就炸管了。
死区时间怎么设?我一般按这个流程来:
- 查器件手册:找到开关管的关断延迟时间(toff)和开通延迟时间(ton)。死区时间至少要大于toff - ton。
- 留余量:在理论值基础上加50%~100%的余量。比如理论需要1μs,我设2μs。
- 实测验证:用示波器看桥臂中点电压,确保没有直通尖峰。
我常用的死区时间范围:
| 开关管类型 | 典型死区时间 | 说明 |
|---|---|---|
| MOSFET(低压) | 200ns ~ 500ns | 开关速度快,死区可以小 |
| IGBT(中压) | 1μs ~ 3μs | 关断拖尾电流,死区要大 |
| SiC MOSFET | 100ns ~ 300ns | 开关极快,但要注意振铃 |
警告:死区时间不是越大越好。死区太大,会导致输出电压畸变,电流波形变差,电机噪音增大,甚至引起转矩脉动。我曾经为了保险把死区设到5μs,结果电机低速时抖得跟筛糠似的。
死区补偿也是个话题。简单说,就是根据电流方向,在PWM占空比里加一个修正量,抵消死区造成的电压误差。我一般用软件补偿法,在电流过零点附近做个查表修正。这个后面章节会细讲。
3.5 SVPWM核心流程总览
我把整个SVPWM的流程画了张图,你看一眼就明白了:
这张图把SVPWM的六个步骤串起来了。从输入Uα、Uβ开始,到最终输出带死区的PWM波形,每一步都有讲究。我个人觉得,最容易出问题的是第三步和第四步——作用时间计算和过调制处理。很多新手在这里栽跟头。
3.6 实战中的几个坑
最后,我把自己踩过的坑总结一下,你写代码时注意:
- 扇区边界抖动:参考矢量刚好落在扇区边界时,扇区号来回跳。加个滞环或者滤波能解决。
- 过调制处理不当:T + T1 > Ts时,如果不做等比例缩放,PWM周期会乱,严重时烧管子。
- 死区补偿方向搞反:电流方向判断错了,补偿反而让波形更差。我建议用三相电流采样值直接判断方向,别用估算的。
- PWM更新时机:一定要在PWM周期溢出中断里更新比较值,别在主循环里随时写。否则会出现半周期更新,波形不对称。
我的习惯:每次写完SVPWM代码,先用开环测试——给一个固定的Uα、Uβ,看三相PWM波形对不对。没问题了再上闭环。这样能快速定位是算法问题还是硬件问题。