3、开环强拖启动(I/F控制):原理介绍、V/F曲线设计、电流环配置
3.1 为什么需要开环强拖?
做FOC控制,最头疼的问题之一就是启动。尤其是带重载或者大惯量的负载,直接上闭环,十有八九会抖得像筛子一样,甚至直接反转。
我刚开始做无刷电机驱动那会儿,就踩过这个坑。记得有一次调试一个风机项目,电机一启动就剧烈抖动,电流波形乱成一团。后来才发现,转子位置都没对准,闭环控制根本无从谈起。
说白了,FOC的核心是磁场定向。你连转子在哪儿都不知道,怎么定向?所以,我们需要一个「强行拖起来」的阶段,让电机先转起来,等反电动势足够大了,再切到闭环。
这个阶段,就叫开环强拖启动,也叫I/F控制。
3.2 I/F控制原理
I/F控制,全称是电流-频率控制。它的思路很简单:
- 我不管转子实际在哪儿
- 我直接给一个旋转的电流矢量
- 这个电流矢量会拉着转子跟着转
你想想看,这就像你用手推一个秋千。你不管秋千现在在什么位置,你只管按固定的节奏推它。只要推的力够大,秋千最终会跟上你的节奏。
在I/F控制里,我们给的是电流指令,不是电压指令。电流环会保证实际电流紧紧跟随指令值。这样,即使电机还没转起来,我们也能精确控制转矩电流的大小。
核心要点:I/F控制的关键是让电流矢量超前于转子位置。这个超前角,通常取30°到60°之间。我个人的习惯是取45°,既能保证足够的转矩,又不会让电流过大。
3.3 V/F曲线设计
V/F曲线,说白了就是电压和频率的关系。在开环强拖阶段,我们需要一个平滑的升频曲线。
为什么不能直接给目标频率?
嗯,这里要注意。如果频率跳变太快,电流环会饱和,电机可能直接失步。我见过有人直接把频率从0跳到50Hz,结果电机纹丝不动,电流却飙到了额定值的两倍。
我建议的V/F曲线设计原则:
- 起始频率:通常取5-10Hz。太低的话,反电动势太小,电流环不好控制。
- 升频斜率:根据负载惯量来定。轻载可以快一些,重载要慢一些。我一般取50-100Hz/s。
- 电压补偿:低速时,电阻压降占主导,需要适当提高电压。这就是所谓的「低频补偿」。
下面是我常用的一个V/F曲线参数表:
| 频率范围 | 电压/频率比 | 补偿系数 | 说明 |
|---|---|---|---|
| 0 - 10 Hz | V/F = 1.2 * 额定值 | 1.2 - 1.5 | 需要较大补偿,克服电阻压降 |
| 10 - 30 Hz | V/F = 1.0 * 额定值 | 1.0 | 线性区,正常比例 |
| 30 Hz 以上 | V/F = 0.9 * 额定值 | 0.9 | 弱磁区,防止饱和 |
我的经验:低频补偿不是越大越好。补偿太多,电流会偏大,电机发热严重。我曾经在一个项目中把补偿系数设到了2.0,结果电机还没转起来,MOS管先冒烟了。后来老老实实降到1.3,问题就解决了。
3.4 电流环配置
开环强拖阶段,电流环的配置和闭环时不太一样。主要有几个区别:
- 带宽要低一些:开环时,电机反电动势很小,电流环容易振荡。我一般把带宽设在200-400Hz,比闭环时低一半。
- 积分限幅要小:防止积分饱和。我习惯把积分输出限幅在额定电压的30%以内。
- 电流指令要平滑:不要阶跃给定。可以用斜坡函数,让电流慢慢升上去。
下面是一个电流环配置的代码示例:
// 电流环参数配置
typedef struct {
float Kp; // 比例系数
float Ki; // 积分系数
float integral_max; // 积分限幅
float output_max; // 输出限幅
} CurrentLoopConfig;
// 开环强拖阶段的配置
CurrentLoopConfig open_loop_config = {
.Kp = 0.5, // 比例系数,比闭环时小
.Ki = 0.01, // 积分系数,防止积分饱和
.integral_max = 0.3, // 积分限幅,额定电压的30%
.output_max = 0.8 // 输出限幅,额定电压的80%
};
// 电流环更新函数
void current_loop_update(float target_current, float actual_current) {
float error = target_current - actual_current;
// 比例项
float p_out = open_loop_config.Kp * error;
// 积分项,带限幅
static float integral = 0;
integral += open_loop_config.Ki * error;
if (integral > open_loop_config.integral_max) {
integral = open_loop_config.integral_max;
} else if (integral < -open_loop_config.integral_max) {
integral = -open_loop_config.integral_max;
}
// 总输出,带限幅
float output = p_out + integral;
if (output > open_loop_config.output_max) {
output = open_loop_config.output_max;
} else if (output < -open_loop_config.output_max) {
output = -open_loop_config.output_max;
}
// 应用到PWM
set_pwm_duty(output);
}
避坑指南:我曾经在一个项目中,电流环的积分限幅设得太大,结果电机在开环阶段就出现了明显的振荡。后来检查发现,积分项已经饱和了,导致电流环失去了调节能力。所以,积分限幅一定要根据实际电压来算,不能拍脑袋。
3.5 从开环到闭环的切换
开环强拖不能一直用下去。当电机转速达到一定值后,反电动势足够大了,我们就可以切到闭环控制。
切换的条件通常有两个:
- 转速达到阈值:一般取额定转速的10%-20%。比如额定转速3000rpm,那就在300-600rpm时切换。
- 电流稳定:开环阶段的电流波动要小于某个值。我一般看电流的均方根值,波动小于5%才切换。
切换的时候,要注意平滑过渡。我习惯的做法是:
- 先把电流指令降到额定值的50%
- 然后瞬间切换到闭环模式
- 再慢慢把电流指令恢复到目标值
这样切换,基本不会出现冲击。你想想看,如果直接切换,电流环的输出可能会跳变,导致电机抖动一下。平滑过渡就能避免这个问题。
总结一下:开环强拖启动,说白了就是「先让电机转起来,再谈控制精度」。V/F曲线要平滑,电流环要保守,切换要柔和。做到这三点,启动基本不会出问题。
好了,这一章就讲到这里。下一章我们聊聊「闭环启动的几种策略」,到时候会对比一下不同启动方式的优缺点。