3. SVPWM 矢量作用时间计算:基本电压矢量、伏秒平衡原理、作用时间公式推导
这一节,咱们来啃 SVPWM 里最核心的硬骨头——矢量作用时间怎么算。
说实话,我刚接触 SVPWM 那会儿,看到一堆公式和矢量图,头都大了。后来在调试一个伺服驱动器时,电机低速抖得像筛糠一样,我才意识到:作用时间算不准,什么高级算法都是白搭。
今天我就把这块掰开了讲。你跟着我的思路走,保证能搞明白。
3.1 基本电压矢量:SVPWM 的“积木块”
先说说基本电压矢量是什么。
SVPWM 的核心思想,就是用 8 个固定的开关状态,去合成任意方向、任意大小的电压矢量。这 8 个状态里,有 6 个是非零矢量,2 个是零矢量。
6 个非零矢量(V1~V6): 幅值都是 2/3·Vdc,方向互差 60°,把整个平面分成 6 个扇区。
2 个零矢量(V0、V7): 幅值为 0,就是三个上桥全通或全断。
我习惯把这 6 个非零矢量想象成“积木块”。你要合成一个目标矢量,就在它所在的扇区里,用相邻的两个“积木块”去拼。说白了,就是线性组合。
| 基本矢量 | 开关状态 (A,B,C) | 幅值 | 角度 |
|---|---|---|---|
| V0 | (0,0,0) | 0 | — |
| V1 | (1,0,0) | 2/3·Vdc | 0° |
| V2 | (1,1,0) | 2/3·Vdc | 60° |
| V3 | (0,1,0) | 2/3·Vdc | 120° |
| V4 | (0,1,1) | 2/3·Vdc | 180° |
| V5 | (0,0,1) | 2/3·Vdc | 240° |
| V6 | (1,0,1) | 2/3·Vdc | 300° |
| V7 | (1,1,1) | 0 | — |
嗯,这里要注意:零矢量虽然幅值为 0,但它在调节作用时间时非常关键。没有它,你没法平滑地控制电压大小。
3.2 伏秒平衡原理:SVPWM 的“天平”
接下来是伏秒平衡。这个词听起来高大上,其实道理很简单。
你想想看,在一个 PWM 周期 Ts 里,我们想让电机绕组上得到的平均电压等于目标矢量 Uref。那怎么实现呢?
就是用基本矢量分别作用一段时间,让它们的“电压 × 时间”加起来,等于目标矢量的“电压 × 时间”。
伏秒平衡公式:
Uref × Ts = Vx × Tx + Vy × Ty + V0 × T0
其中 Tx、Ty 是两个相邻非零矢量的作用时间,T0 是零矢量作用时间。
并且:Tx + Ty + T0 = Ts
说白了,这就是一个“天平”。左边放目标矢量的伏秒积,右边放基本矢量的伏秒积。两边相等,就平衡了。
我在项目中遇到过一个问题:有人把伏秒平衡理解成简单的面积相等,忽略了矢量方向。结果算出来的时间完全不对,电机根本转不起来。记住,这是矢量合成,不是标量相加。
3.3 作用时间公式推导:一步步来
好,现在咱们来推导公式。我以第一扇区为例,其他扇区同理。
假设目标矢量 Uref 落在第一扇区,相邻的两个基本矢量是 V1(0°)和 V2(60°)。
第一步,把 Uref 分解到 V1 和 V2 的方向上:
Uref × cos(θ) = (Tx/Ts) × |V1| + (Ty/Ts) × |V2| × cos(60°)
Uref × sin(θ) = (Ty/Ts) × |V2| × sin(60°)
第二步,代入 |V1| = |V2| = 2/3·Vdc,cos(60°) = 1/2,sin(60°) = √3/2:
Uref × cos(θ) = (Tx/Ts) × (2/3·Vdc) + (Ty/Ts) × (2/3·Vdc) × 1/2
Uref × sin(θ) = (Ty/Ts) × (2/3·Vdc) × √3/2
第三步,解这个方程组,得到 Tx 和 Ty:
Tx = (√3 × Ts × Uref / Vdc) × sin(60° - θ)
Ty = (√3 × Ts × Uref / Vdc) × sin(θ)
第四步,零矢量时间 T0 = Ts - Tx - Ty。
注意: 当 Tx + Ty > Ts 时,说明目标矢量超出了 SVPWM 的线性调制范围(即过调制)。这时候需要对 Tx 和 Ty 进行等比例缩小处理,否则波形会失真。
我曾经在调试高速段时忽略了这一点,结果电流波形出现严重削顶,电机噪音大得吓人。后来加了过调制处理,问题才解决。
其他扇区的公式,只是角度偏移的问题。你只要把 θ 换成相对于该扇区起始矢量的角度,公式结构完全一样。
3.4 知识体系总览
下面这张图,把整个计算流程串起来了。你一看就明白。
3.5 实际应用中的几点提醒
公式推导完了,但纸上得来终觉浅。我再说几个实际调试中容易踩的坑。
- 浮点精度问题: 在单片机里算 sin 和 cos,如果直接用浮点库,速度会很慢。我建议提前建好正弦表,查表计算,能省不少 CPU 时间。
- 扇区边界处理: 当 θ 正好在扇区边界上时,比如 0° 或 60°,sin(0°) = 0,会导致某个矢量的作用时间为 0。这是正常的,代码里要处理好边界情况,别除零。
- 零矢量分配策略: T0 可以全部分给 V0,也可以全部分给 V7,或者两者各分一半。不同的分配方式会影响开关损耗和谐波含量。我一般用七段式 SVPWM,把 T0 均分给 V0 和 V7,谐波性能最好。
我的个人习惯: 在代码里,我会把 Tx、Ty 的计算结果先放大 1000 倍,用整数运算,最后再归一化。这样既避免了浮点运算的慢速,又保证了精度。你试试看,效果不错。
好了,这一节的内容就到这儿。你只要把基本矢量、伏秒平衡、公式推导这三块吃透,SVPWM 的核心就算拿下了。后面咱们再聊怎么把这些时间值转换成实际的 PWM 占空比。