第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控制中的坐标变换,那才是真正烧脑的东西。