第2章 参考电压矢量合成:伏秒平衡原理
好,咱们正式开始啃SVPWM的核心骨头。
上一章我们聊了什么是空间矢量,以及为什么非要搞出六个扇区。这一章,我要带你彻底搞明白一个关键问题:给定一个任意方向、任意长度的参考电压矢量,怎么用六个固定的开关矢量把它拼出来?
说白了,就是“巧妇难为无米之炊”里的那个“炊”。你手里只有六个方向(基本矢量)和两个零矢量,但你要合成一个任意方向的矢量。怎么办?
答案就是四个字:伏秒平衡。
2.1 伏秒平衡:SVPWM的底层逻辑
这个概念其实不复杂。你想想看,一个电压矢量作用在电机绕组上,会产生磁链。电压乘以时间,就是伏秒积,它直接决定了磁链的变化量。
伏秒平衡原理讲的是:在一个开关周期内,用相邻基本矢量分别作用一段时间,它们产生的总伏秒积,应该等于参考矢量连续作用整个周期所产生的伏秒积。
核心公式(伏秒平衡):
Uref · Ts = Ux · Tx + Uy · Ty + U0 · T0
其中:
- Uref:参考电压矢量
- Ts:开关周期(PWM周期)
- Ux、Uy:相邻的两个基本非零矢量
- Tx、Ty:两个基本矢量的作用时间
- U0:零矢量(U0或U7)
- T0:零矢量作用时间
这个公式看着简单,但它是整个SVPWM的基石。我在做第一个电机驱动项目时,就是死磕这个公式,才把波形调顺的。
2.2 相邻矢量作用时间计算
好,公式有了,怎么算时间?
我们以参考矢量落在第I扇区为例。这个扇区的相邻矢量是U4(100)和U6(110)。
计算步骤其实就三步:
- 分解参考矢量:把Uref投影到U4和U6的方向上。
- 列伏秒平衡方程:α轴和β轴分别列方程。
- 解方程:求出T4和T6。
具体推导过程我直接给你结果,这是最常用的公式:
第I扇区作用时间公式:
T4 = (√3 · Ts · |Uref| / Udc) · sin(π/3 - θ)
T6 = (√3 · Ts · |Uref| / Udc) · sin(θ)
T0 = Ts - T4 - T6
其中:
- Udc:直流母线电压
- θ:参考矢量在扇区内的角度(0~60°)
- |Uref|:参考矢量的模长
嗯,这里要注意:T4 + T6 必须 ≤ Ts。如果算出来大于Ts,说明你过调制了,需要限幅处理。这个我们后面章节会专门讲。
其他五个扇区的公式,其实就是把角度偏移一下。我习惯用一个通用公式来处理所有扇区,避免写六个分支代码。具体做法是:
- 先根据扇区号,把参考矢量角度归一化到0~60°
- 然后用上面第I扇区的公式计算
- 最后根据扇区号,把Tx和Ty映射到对应的基本矢量上
这样做的好处是代码简洁,不容易出错。我曾经在项目里用switch-case写了六个扇区的独立计算,结果调试时发现一个扇区的角度边界算错了,排查了半天……后来就改成统一公式了。
2.3 零矢量分配策略
时间算出来了,但还有个问题:零矢量怎么分配?
零矢量有两个:U0(000)和U7(111)。它们的作用效果一样,但分配方式不同,会直接影响输出波形的谐波含量和开关损耗。
常见的分配策略有三种:
| 策略名称 | 分配方式 | 特点 | 适用场景 |
|---|---|---|---|
| 对称分配 | T0均分给U0和U7 | 谐波最小,波形对称 | 通用场合,最常用 |
| 非对称分配 | T0全部给U0或U7 | 开关次数少,损耗低 | 对效率要求高的场合 |
| 混合分配 | 根据调制深度动态调整 | 兼顾谐波和损耗 | 高性能驱动 |
我个人最常用的是对称分配。为什么呢?因为它产生的PWM波形是中心对称的,谐波主要集中在开关频率的整数倍附近,低频谐波含量低,电机运行更平稳。
避坑指南:
我曾经在一个项目中,为了省事,用了非对称分配(T0全部分给U7)。结果电机在低速运行时噪音特别大,一测电流波形,发现5次、7次谐波明显偏高。后来换成对称分配,问题就解决了。
所以我的建议是:除非你对效率有极致要求,否则默认用对称分配。
2.4 知识体系总览
这一章的内容比较多,我画了一张图帮你梳理整个逻辑链条:
2.5 代码实现示例
理论讲完了,咱们看看代码怎么写。下面是一个计算第I扇区作用时间的C语言函数:
/**
* @brief 计算第I扇区基本矢量作用时间
* @param Uref 参考电压矢量模长 (V)
* @param theta 参考矢量在扇区内角度 (rad), 范围0~π/3
* @param Ts 开关周期 (s)
* @param Udc 直流母线电压 (V)
* @param pT4 输出U4作用时间指针
* @param pT6 输出U6作用时间指针
* @param pT0 输出零矢量作用时间指针
* @return 0: 正常 -1: 过调制
*/
int calc_sector1_times(float Uref, float theta, float Ts, float Udc,
float *pT4, float *pT6, float *pT0)
{
float T4, T6, T0;
float sqrt3 = 1.7320508f;
// 计算T4和T6
T4 = (sqrt3 * Ts * Uref / Udc) * sinf(M_PI/3.0f - theta);
T6 = (sqrt3 * Ts * Uref / Udc) * sinf(theta);
// 检查是否过调制
if ((T4 + T6) > Ts) {
// 过调制,按比例限幅
float scale = Ts / (T4 + T6);
T4 *= scale;
T6 *= scale;
T0 = 0.0f;
*pT4 = T4;
*pT6 = T6;
*pT0 = T0;
return -1; // 返回过调制标志
}
// 正常情况,计算零矢量时间(对称分配)
T0 = Ts - T4 - T6;
*pT4 = T4;
*pT6 = T6;
*pT0 = T0;
return 0;
}
代码要点:
- 过调制检测一定要做,否则电机电流会畸变
- 限幅时保持T4和T6的比例不变,这样矢量方向不变
- 零矢量时间T0均分给U0和U7,各占T0/2
好了,这一章的内容就到这里。伏秒平衡是SVPWM的魂,时间计算是骨架,零矢量分配是血肉。把这三块吃透了,后面的调制深度计算、过调制处理,你学起来会轻松很多。