第4章:开环控制与闭环控制
这一章我们来聊聊控制领域最基础、也最绕不开的两个概念——开环和闭环。说实话,我刚入行那会儿,觉得这玩意儿太简单了,不就是有没有反馈嘛。但真正做项目才发现,这里面的门道深着呢。你想想看,一个电机转得稳不稳,能不能扛住负载突变,全看你对这两个概念的理解深度。
4.1 开环控制策略
开环控制,说白了就是「我发指令,你执行,我不看你干得怎么样」。在无刷直流电机里,最典型的开环应用就是——六步换相法。
我记得刚做第一个BLDC项目时,为了省成本,直接用了开环驱动。代码写起来确实爽,不需要处理霍尔信号,也不需要算反电动势。直接给三相桥臂发固定的PWM占空比,然后按顺序切换导通相就行。
// 开环六步换相示例(伪代码)
void open_loop_commutation(void) {
static uint8_t step = 0;
switch(step) {
case 0: // AB导通
AH_ON; BL_ON;
break;
case 1: // AC导通
AH_ON; CL_ON;
break;
// ... 省略中间步骤
case 5: // BC导通
BH_ON; CL_ON;
break;
}
step = (step + 1) % 6;
// 换相频率由定时器决定,跟实际转子位置无关
}
但问题很快就来了。电机空载时跑得挺好,一加上负载,转速直接往下掉。为什么?因为开环控制不知道转子实际位置,它只管按固定频率换相。负载一大,转子跟不上换相速度,就失步了。
我曾经在做一个风机项目时,为了省霍尔传感器,坚持用开环控制。结果电机在低速启动时抖得像筛糠一样,最后不得不加了个启动检测逻辑。记住:开环控制只适合对精度要求极低、负载变化小的场景,比如简单的风扇、水泵。
开环控制也有它的优点:实现简单、成本低、不需要传感器。但代价就是——你永远不知道电机实际在干什么。说白了,就是「盲人摸象」。
4.2 闭环控制架构
闭环控制就聪明多了。它加了个「眼睛」——反馈环节。电机转没转到位,反馈回来,控制器再调整输出。这样就能做到「指哪打哪」。
典型的BLDC闭环控制架构长这样:
| 层级 | 功能 | 反馈信号 | 典型周期 |
|---|---|---|---|
| 位置环 | 控制转子角度/位置 | 编码器/霍尔 | 1-10ms |
| 速度环 | 控制电机转速 | 速度计算值 | 0.5-2ms |
| 电流环 | 控制相电流 | ADC采样值 | 50-200μs |
我个人的习惯是,先搭电流环,再往上搭速度环,最后才是位置环。为什么?因为电流环是「地基」,它响应最快,决定了整个系统的动态性能。
你想想看,如果电流环都抖得不行,速度环和位置环再怎么调也是白搭。就像盖房子,地基没打好,上面装修得再漂亮也没用。
4.3 速度环与电流环的基本概念
4.3.1 电流环
电流环,也叫「内环」。它的任务很简单——让实际电流紧紧跟随目标电流。在BLDC里,我们通常控制的是q轴电流(转矩电流)和d轴电流(励磁电流)。
电流环的典型结构:
// 电流环PI控制器(简化版)
typedef struct {
float Kp; // 比例系数
float Ki; // 积分系数
float integral; // 积分累加
float limit; // 输出限幅
} PI_Controller;
float PI_Update(PI_Controller *pi, float target, float actual) {
float error = target - actual;
pi->integral += error * pi->Ki;
// 抗积分饱和
if(pi->integral > pi->limit) pi->integral = pi->limit;
if(pi->integral < -pi->limit) pi->integral = -pi->limit;
float output = error * pi->Kp + pi->integral;
// 输出限幅
if(output > pi->limit) output = pi->limit;
if(output < -pi->limit) output = -pi->limit;
return output;
}
嗯,这里要注意一点:电流环的采样频率一定要够快。我一般设置在10kHz以上,也就是100μs一次。如果采样频率太低,电流波形会失真,电机噪音也会变大。
我在做伺服驱动器时,遇到过电流环震荡的问题。后来发现是积分系数设太大了。我的调试口诀是:「先调P,让系统响应快但不震荡;再加I,消除稳态误差」。P和I的比例,我一般从10:1开始试。
4.3.2 速度环
速度环是「外环」,它坐在电流环上面。速度环的输出,就是电流环的目标值。说白了,速度环告诉电流环:「我需要多大的转矩,你帮我实现」。
速度环的反馈信号怎么来?常见的有两种:
- 霍尔传感器:通过计算霍尔跳变的时间间隔,估算转速。精度一般,但成本低。
- 编码器:通过M法、T法或M/T法测速。精度高,但贵。
我个人的习惯是,如果要求不高,用霍尔就够了。但如果是做位置控制,必须上编码器。
速度环的PI参数整定,跟电流环不太一样。速度环的响应慢一些,所以积分系数可以适当大一点。但要注意——速度环的积分饱和是个大坑。
我曾经在一个项目中,电机启动时速度环积分疯狂累加,导致输出饱和。等电机真正转起来后,积分值还很大,结果速度超调得一塌糊涂。后来加了积分限幅和条件积分,才解决问题。记住:速度环一定要做抗积分饱和处理。
4.3.3 速度环与电流环的配合
这两个环是串联工作的。速度环的输出限幅,决定了电流环能获得的最大目标电流。这个限幅值怎么设?
- 如果设得太小,电机加速慢,响应迟钝。
- 如果设得太大,电流环可能过载,烧MOS管。
我一般这样设:先查电机手册,找到额定电流。然后速度环输出限幅设为额定电流的1.5倍。这样既保证加速性能,又留了安全余量。
你想想看,如果速度环输出限幅设成额定电流的3倍,那电机一加速,电流直接飙到30A,MOS管可能瞬间就炸了。嗯,这个坑我踩过,不骗你。
4.4 开环 vs 闭环:怎么选?
最后总结一下我的选择原则:
| 场景 | 推荐方案 | 理由 |
|---|---|---|
| 低成本风扇 | 开环 | 负载稳定,不需要高精度 |
| 水泵 | 速度闭环 | 负载变化大,需要恒速 |
| 机器人关节 | 位置+速度+电流三环 | 需要精确的位置和力矩控制 |
| 无人机螺旋桨 | 速度闭环 | 响应快,抗风扰 |
说白了,开环是「省心但不省力」,闭环是「费力但省心」。具体选哪个,看你的项目需求。我个人建议,只要成本允许,尽量上闭环。因为开环控制的不确定性,有时候会让你调试到怀疑人生。
好了,这一章就到这里。下一章我们聊聊更具体的——FOC控制中的坐标变换,那才是真正烧脑的东西。