4. SVPWM调制技术:空间矢量原理、扇区判断、作用时间计算、七段式与五段式SVPWM、死区补偿
各位同学,咱们今天聊SVPWM。说实话,这是整个矢量控制里最“硬核”的部分之一。我当年刚接触这个的时候,看着那一堆电压矢量和扇区图,脑子里全是问号。但等你真正搞懂了,你会发现——这东西其实很巧妙。
4.1 空间矢量原理:从三相到两相,再到旋转
先说说为什么要有SVPWM。咱们电机里通的是三相正弦交流电,对吧?但控制器里处理的是数字量,是0和1。怎么用开关管的通断,去模拟出一个连续旋转的磁场?这就是SVPWM要干的事。
说白了,SVPWM的核心思想是:用八个基本电压矢量,去合成任意方向、任意大小的目标电压矢量。
哪八个?三相逆变器有六个开关管,上管导通为1,下管导通为0。三个桥臂的组合,一共2³=8种状态。其中两个是零矢量(000和111),剩下六个是非零矢量,它们把空间分成了六个扇区。
关键点:这六个非零矢量,幅值都是(2/3)*Vdc,方向互差60度。它们围成一个正六边形。而咱们想要的,是六边形内切圆里的任意矢量——也就是能输出最大不失真正弦波的区域。
我在项目里遇到过一个问题:一开始没注意这个内切圆半径,结果调制度设高了,输出波形直接畸变。嗯,后来才意识到,最大不失真电压幅值只有Vdc/√3。
4.2 扇区判断:目标电压落在哪?
好,现在咱们有了目标电压矢量Uref(从电流环算出来的)。第一步,得知道它落在哪个扇区。怎么判断?看它在αβ坐标系下的分量。
我习惯用下面这个方法,简单粗暴:
// 扇区判断,输入Ualpha, Ubeta
// 定义三个中间变量
B1 = Ubeta;
B2 = (sqrt(3)/2)*Ualpha - 0.5*Ubeta;
B3 = -(sqrt(3)/2)*Ualpha - 0.5*Ubeta;
// 根据正负号得到扇区号
Sector = 0;
if(B1 > 0) Sector += 1;
if(B2 > 0) Sector += 2;
if(B3 > 0) Sector += 4;
// 查表得到实际扇区(1~6)
// 这个映射关系跟你的坐标系定义有关,我一般用:
// Sector值: 1->扇区II, 2->扇区VI, 3->扇区I, 4->扇区IV, 5->扇区III, 6->扇区V
你想想看,为什么用这三个式子?其实就是在判断Uref相对于六个边界矢量的位置。正负号一组合,六个扇区就分出来了。
我的小技巧:实际代码里,我会把sqrt(3)/2预计算成常数0.8660254,避免每次计算开方。嵌入式上能省一点是一点。
4.3 作用时间计算:T1、T2怎么来?
知道扇区之后,就要算两个相邻非零矢量的作用时间了。原理很简单——伏秒平衡。目标矢量乘以PWM周期,等于两个相邻矢量分别乘以各自作用时间,再相加。
以扇区I为例(Uref在U4(100)和U6(110)之间):
// 先算中间变量X, Y, Z
X = Ubeta * Tpwm / Vdc;
Y = (sqrt(3)/2*Ualpha + 0.5*Ubeta) * Tpwm / Vdc;
Z = (-sqrt(3)/2*Ualpha + 0.5*Ubeta) * Tpwm / Vdc;
// 根据扇区查T1, T2
switch(Sector) {
case 1: T1 = Z; T2 = Y; break; // 扇区I
case 2: T1 = Y; T2 = -X; break; // 扇区II
case 3: T1 = -Z; T2 = X; break; // 扇区III
case 4: T1 = -X; T2 = Z; break; // 扇区IV
case 5: T1 = X; T2 = -Y; break; // 扇区V
case 6: T1 = -Y; T2 = -Z; break;// 扇区VI
}
// 过调制处理
if(T1 + T2 > Tpwm) {
T1 = T1 * Tpwm / (T1 + T2);
T2 = T2 * Tpwm / (T1 + T2);
}
这里有个坑,我踩过——过调制处理。当T1+T2超过PWM周期时,必须等比例缩小。否则算出来的占空比会超过100%,逆变器直接炸给你看。我曾经在调试台上就遇到过,MOS管瞬间冒烟...从那以后,过调制判断我写得比谁都认真。
4.4 七段式与五段式SVPWM
算完T1、T2,剩下的时间就是零矢量(T0 = Tpwm - T1 - T2)。怎么分配零矢量?这就引出了两种经典模式。
七段式SVPWM
每个PWM周期内,矢量顺序是:零矢量 → 非零1 → 非零2 → 零矢量 → 非零2 → 非零1 → 零矢量。一共七段。
优点:谐波含量低,电流波形好。
缺点:开关次数多,损耗大。
以扇区I为例,七段式的开关顺序是:000 → 100 → 110 → 111 → 110 → 100 → 000。
五段式SVPWM
只插入一次零矢量,顺序是:非零1 → 非零2 → 零矢量 → 非零2 → 非零1。一共五段。
优点:开关次数减少1/3,损耗低。
缺点:谐波含量高,电流纹波大。
我个人习惯:对电流环性能要求高的场合,用七段式;对效率要求高的场合,用五段式。比如做电动工具,电池供电,我肯定选五段式,省电才是王道。
| 对比项 | 七段式SVPWM | 五段式SVPWM |
|---|---|---|
| 每周期开关次数 | 6次 | 4次 |
| 开关损耗 | 高 | 低(降低约33%) |
| 电流谐波 | 低 | 高 |
| 适用场景 | 高性能伺服、精密控制 | 电动工具、家电、低功耗设备 |
4.5 死区补偿:不得不面对的现实
理论讲完了,咱们聊聊现实。实际逆变器里,上下管不能同时导通,否则就是直通短路。所以要在开关信号里插入一段“死区时间”——上下管都关断。
但死区会带来问题:输出电压失真、电流波形畸变、低频时尤其明显。你想想看,本来该输出的电压,因为死区被“吃掉”了一部分,能不歪吗?
怎么补偿?我常用的方法是基于电流极性的死区补偿:
// 死区补偿,根据电流方向调整占空比
// Tdead: 死区时间,单位us
// Tpwm: PWM周期,单位us
if(Ia > 0) {
Ta_comp = Ta + Tdead/Tpwm; // 正电流,补偿增加
} else {
Ta_comp = Ta - Tdead/Tpwm; // 负电流,补偿减少
}
// 同理处理B相、C相
注意:电流极性检测在过零点附近容易出错。因为电流很小,噪声干扰大。我曾经在这个问题上吃过亏——过零点附近补偿方向搞反了,结果电流波形反而更差。后来加了滞环判断,才稳定下来。
还有一种更高级的方法——脉冲宽度补偿。不直接改占空比,而是精确调整每个开关沿的时刻。但实现起来复杂一些,一般用在要求很高的场合。
小结
好了,这一章的内容就到这。SVPWM这东西,说难不难,说简单也不简单。关键是要理解它的物理意义——用离散的开关状态,去逼近连续的旋转磁场。扇区判断、时间计算、七段五段、死区补偿,每一步都有它的道理。
下一章咱们聊电流采样和坐标变换的工程实现,到时候我会分享一些ADC触发时序的坑,保证有用。