【foc思考】为什么svpwm要不停变换占空比
您的问题非常关键!动态调整占空比是SVPWM(和FOC)的核心难点。下面我用最直白的语言和具体例子,带您彻底理解这个过程:
1. 先看一个直观类比:调光灯
想象您用PWM控制一盏LED灯:
- 固定占空比(如50%)→ 灯保持恒定亮度。
- 动态调整占空比(如从10%逐步增加到90%)→ 灯会渐亮,亮度连续变化。
SVPWM同理:通过动态调整三相PWM的占空比,让电机“看到”的是一个连续变化的正弦波电压,而不是固定电压。
2. 动态占空比如何生成?
步骤1:FOC算法给出目标电压
FOC算法会计算电机当前需要的电压矢量 ( V_\alpha ) 和 ( V_\beta )(在α-β坐标系下)。
例如:
- 转子位置在30°时,可能需要:
( V_\alpha = 0.8 ), ( V_\beta = 0.5 )
步骤2:SVPWM计算占空比
根据 ( V_\alpha ) 和 ( V_\beta ),SVPWM会:
- 判断扇区(将电压矢量分解到6个基本矢量中)
- 计算作用时间(决定各相占空比)
具体计算示例(简化版):
假设:
- 当前电压矢量在第1扇区
- 计算得到:
- U相占空比 = 70%
- V相占空比 = 40%
- W相占空比 = 10%
步骤3:实时更新PWM寄存器
STM32会立即更新定时器的CCR值:
TIM1->CCR1 = 7000; // U相占空比70%(假设ARR=10000)
TIM1->CCR2 = 4000; // V相占空比40%
TIM1->CCR3 = 1000; // W相占空比10%
关键点:
➤ 下一个PWM周期(如100μs后),FOC会根据新的转子位置重新计算,占空比再次变化!
3. 动态调整的全过程图示
时间点 | 转子角度 | U相占空比 | V相占空比 | W相占空比
-------+----------+----------+----------+----------
t1 | 0° | 50% | 20% | 30%
t2 | 30° | 70% | 40% | 10%
t3 | 60° | 30% | 80% | 20%
...
最终电机感受到的是平滑的三相正弦电压
4. 为什么必须动态调整?
固定占空比的问题
如果占空比固定(例如U=50%, V=50%, W=50%):
- 电机只会收到恒定电压,无法形成旋转磁场。
- 电机要么不动,要么抖动(类似LED灯常亮)。
动态调整的优势
- 合成旋转磁场:通过快速切换占空比,让电机内部的磁场“看起来”在连续旋转。
- 降低噪音和振动:正弦波比方波更平滑,电机运行更安静。
5. STM32中的实现关键代码
// FOC控制循环(例如在定时器中断中运行)
void FOC_Loop() {
// 1. 读取编码器获取转子角度
float angle = Get_Encoder_Angle();
// 2. FOC算法计算Vα和Vβ
Clarke_Park_Transform(&V_alpha, &V_beta, angle);
// 3. SVPWM计算三相占空比
SVPWM_Calc(V_alpha, V_beta, &duty_U, &duty_V, &duty_W);
// 4. 更新PWM占空比
TIM1->CCR1 = (uint16_t)(duty_U * TIM1->ARR);
TIM1->CCR2 = (uint16_t)(duty_V * TIM1->ARR);
TIM1->CCR3 = (uint16_t)(duty_W * TIM1->ARR);
}
6. 常见问题解答
Q1:占空比变化频率有多快?
A1:与PWM频率相同(例如10kHz时,每秒更新10,000次)。
Q2:如何保证三相协调变化?
A2:SVPWM算法会确保三相占空比始终满足 ( U + V + W = 0 )(无中线电流)。
Q3:动态调整会不会导致CPU负载过高?
A3:STM32的硬件PWM和DMA可以辅助计算,实际CPU开销很小(<5%)。
总结
- 动态占空比是SVPWM的灵魂,通过实时调整每相PWM的CCR值,合成正弦波电压。
- 每次PWM周期(微秒级)都会重新计算占空比,响应电机需求。
- STM32通过定时器+中断/DMA高效实现这一过程。
理解了这一点,您就掌握了电机矢量控制的核心!如果仍有疑问,欢迎继续讨论具体实现细节。