3、线性调制区分析:调制深度与输出电压的线性关系
做 SVPWM 调制的朋友都知道,咱们最关心的一个问题就是:我到底能输出多高的电压而不失真?
说白了,这就是线性调制区的分析。在这个区域里,调制深度和输出电压是严格的正比关系。你给多少,它就出多少,非常听话。但一旦越界,输出电压就开始“撒谎”了——你指令再往上加,它也不跟着涨了。
我记得刚入行那会儿,调试一台伺服驱动器,电机转速死活上不去。我查了电流环、速度环,甚至怀疑是电流采样坏了。折腾了两天,最后发现是调制深度已经超过了线性区,进入了过调制。嗯,从那以后,我每次做项目都会先算清楚这个边界。
3.1 什么是线性调制区?
线性调制区,指的是调制深度 M 在 0 到某个上限之间时,逆变器输出的基波电压幅值与调制深度成线性关系。
对于 SVPWM 来说,这个上限就是 M = 1.1547(也就是 2/√3)。
为什么会是这个数?
你想想看,SVPWM 用的是六个非零矢量和两个零矢量来合成参考电压矢量。当参考矢量的轨迹刚好内切于六边形时,就达到了线性调制的极限。再往外走,矢量就会超出六边形边界,这时候就需要过调制算法来“硬拉”了。
核心结论:
- 线性区范围:0 ≤ M ≤ 1.1547
- 输出电压与 M 的关系:Vout = M × Vdc / √3
- 最大不失真输出电压:Vout_max = Vdc / √3
3.2 调制深度与输出电压的线性关系
咱们直接上公式。在线性区内,SVPWM 的输出相电压基波幅值为:
V_phase = M × (V_dc / √3)
其中:
- V_phase:相电压基波幅值(V)
- M:调制深度(0 ~ 1.1547)
- V_dc:直流母线电压(V)
这个公式很干净,也很重要。我习惯在代码里直接用它来反算调制深度。比如,我需要输出 200V 的相电压,母线电压是 350V,那 M 就是 200 / (350/√3) ≈ 0.99。嗯,还在线性区内,放心用。
对比一下 SPWM 和 SVPWM 的线性区范围,你就知道 SVPWM 的优势在哪了:
| 调制方式 | 线性区最大 M | 最大相电压幅值 | 直流电压利用率 |
|---|---|---|---|
| SPWM | 1.0 | Vdc / 2 | 50% |
| SVPWM | 1.1547 | Vdc / √3 | 57.7% |
你看,SVPWM 比 SPWM 多出了约 15.47% 的电压输出能力。这个提升在电机高速弱磁区特别宝贵。我在做电动汽车主驱控制器时,就靠这 15% 的余量,把电机的最高转速又往上提了一截。
3.3 最大不失真输出电压的限制
线性区的尽头,就是最大不失真输出电压。超过这个点,输出电压的波形就会开始畸变。
这个限制的物理本质是什么?
其实很简单:逆变器的六个开关管,能合成的最大电压矢量就是六边形的边界。参考电压矢量一旦超出这个边界,你就不可能用纯线性组合来精确合成它了。这时候,要么削波,要么用过调制算法来近似。
注意: 当 M > 1.1547 时,输出电压的基波幅值仍然可以继续增大,但会引入低次谐波。谐波含量会随着 M 的增大而急剧上升。电机铁损、铜损都会增加,严重时可能导致电机过热或转矩脉动。
我曾经在一个风电变流器项目里,为了多榨出 3% 的电压,把调制深度推到了 1.2。结果并网电流的 THD 从 3% 飙到了 8%,直接被电网公司打回来整改。所以,不要轻易挑战线性区的边界,除非你做好了谐波抑制的准备。
3.4 线性区知识体系
下面这张图,把线性调制区的核心逻辑串起来了。我建议你把它存下来,做项目时对照着看。
3.5 实战中的线性区判断
在 C2000 平台上,怎么判断当前是不是在线性区?
我个人习惯用两种方法:
- 查寄存器法:读取 PWM 的比较值寄存器,计算实际的占空比,反推调制深度。
- 查电压法:直接读取 ADC 采样的相电压,跟 Vdc/√3 做比较。
下面这段代码,是我在 TMS320F28379D 上常用的线性区检测逻辑:
// 线性区检测函数
// 输入:调制深度 M(浮点数)
// 返回:0 - 线性区,1 - 过调制区
Uint16 CheckLinearRegion(float32 M)
{
const float32 M_MAX = 1.1547f; // SVPWM 线性区上限
if(M <= M_MAX)
{
return 0; // 线性区,放心输出
}
else
{
return 1; // 过调制区,需要处理
}
}
// 在主循环中调用
float32 M_current = 0.85f; // 假设当前调制深度
if(CheckLinearRegion(M_current) == 0)
{
// 正常执行 SVPWM
SVPWM_Generate(M_current, theta);
}
else
{
// 进入过调制处理
Overmodulation_Handle(M_current, theta);
}
小技巧: 我建议你在代码里加一个线性区裕量判断。比如把 M_MAX 设为 1.1 而不是 1.1547,留出 5% 的余量。这样即使母线电压有波动,也不会一脚踩进过调制区。我在多个项目中都用这个策略,效果很稳。
3.6 避坑指南
最后,分享几个我在项目中踩过的坑:
- 母线电压采样不准:Vdc 是计算 M 的基础。如果采样偏大,算出来的 M 偏小,实际已经过调制了你还不知道。我建议用校准后的 ADC 值,或者加一个硬件分压电阻的温漂补偿。
- 忽略死区影响:死区时间会降低实际输出电压,相当于“吃掉”了一部分调制深度。在高频工况下,这个影响尤其明显。我一般在 M 的计算里加一个死区补偿系数。
- 动态响应时的瞬时过调制:电流环在突加负载时,M 可能会瞬间冲过 1.1547。这时候不要直接切到过调制算法,而是加一个限幅器,把 M 软限制在 1.15 左右。否则转矩会突然抖动。
嗯,线性调制区的内容就这些。记住那个 1.1547 的边界,记住 Vout = M × Vdc / √3 这个公式,你的 SVPWM 实现就成功了一半。