4、直流电机闭环控制:PID控制原理、速度环设计、电流环设计、双闭环仿真

好,咱们今天聊点硬核的。前面几章我们把开环控制、电机模型都摸透了,但说实话,开环控制在实际工程里就是个“睁眼瞎”。你给个电压,电机转多快?负载一变,转速掉多少?你完全不知道。所以,闭环控制才是真正让电机“听话”的关键。

我个人习惯把闭环控制比作“老司机开车”。你眼睛看着路(反馈),手握着方向盘(控制器),脚踩着油门(执行器)。路况一变,你马上调整。PID控制器,就是那个帮你做“调整决策”的大脑。

4.1 PID控制原理:从“拍脑袋”到“精准拿捏”

PID,比例-积分-微分。名字听着唬人,其实道理很朴素。

  • P(比例):看现在。误差大,我就使劲调;误差小,我就轻轻调。简单粗暴,但容易调过头,产生超调。
  • I(积分):看过去。如果一直有稳态误差(比如目标1000转,实际只有980转),积分项就会慢慢累积,把这点误差“吃掉”。
  • D(微分):看未来。误差变化快了,它提前“踩刹车”,抑制超调,让系统更稳。

你想想看,这三个分量配合好了,电机就能又快又稳地到达目标转速。

核心公式(位置式PID):

u(k) = Kp * e(k) + Ki * Σe(i) + Kd * [e(k) - e(k-1)]

其中:
u(k) — 当前控制量(比如PWM占空比)
e(k) — 当前误差(目标值 - 实际值)
Kp, Ki, Kd — 三个待整定的系数

我在项目中遇到过最典型的例子:一个粉丝的云台电机,P给大了,云台像“抽风”一样来回震荡;P给小了,又软绵绵的,推一下才动一下。这就是典型的P参数没调好。

我的调试口诀:

先调P,让系统动起来;再加D,把震荡压下去;最后加I,消除静差。

千万别一上来三个参数一起调,那是给自己挖坑。

4.2 速度环设计:让电机“稳如老狗”

速度环,说白了就是控制电机转速。我们通常用编码器测速,得到实际转速,然后跟目标转速做差,丢给PID算出一个控制量。

这里有个坑,我刚开始做的时候踩过。编码器测速有噪声,尤其是低速时,测出来的转速一跳一跳的。你直接把这种“脏数据”喂给PID,控制器就会跟着乱跳,电机反而抖得更厉害。

避坑指南:

我曾经在调试一个AGV小车的驱动轮时,速度环怎么调都抖。后来发现是编码器采样周期太短,导致速度反馈噪声太大。解决办法:加一个一阶低通滤波器,把高频噪声滤掉。代码里就一行:

speed_filtered = 0.95 * speed_filtered + 0.05 * speed_raw;

就这么简单,效果立竿见影。

速度环的带宽通常设计得比较低(几十到几百赫兹),因为机械系统响应慢。你想想看,电机从0加速到1000转,怎么也得几十毫秒吧?所以速度环的PID参数,Kp和Ki可以大一些,Kd一般用得少,因为速度反馈本身就有惯性。

4.3 电流环设计:电机的“内功心法”

电流环,控制的是电机绕组里的电流。电流跟转矩成正比(对于永磁同步电机和直流电机都是如此),所以电流环本质上就是转矩环。

电流环是电机控制的最内环,响应速度要求最快。它的采样频率通常很高(10kHz-20kHz),因为电流变化快,你控制慢了,电流就可能冲上去烧管子。

我个人习惯,电流环只用PI控制,不用D。为什么?因为电流采样噪声大,微分项会把噪声放大,导致控制量毛刺多,反而影响系统稳定性。

电流环PI参数整定经验:

参数 作用 典型值范围(以10kHz采样为例)
Kp 决定电流响应速度 0.1 - 1.0
Ki 消除稳态电流误差 0.01 - 0.1

注意:这些值跟你的母线电压、电机相电阻、电感都有关系,实际调试时要以示波器看到的电流波形为准。

4.4 双闭环仿真:让理论“跑”起来

好了,理论讲完了,咱们来点实际的。双闭环,就是外环(速度环)套内环(电流环)。速度环的输出,作为电流环的目标值。电流环的输出,直接控制PWM。

我建议用Simulink或者Python做仿真。这里给一个简单的Python伪代码框架,帮你理解双闭环的执行流程:

# 双闭环控制主循环
while True:
    # 1. 读取反馈
    speed_actual = read_encoder_speed()
    current_actual = read_current_sensor()
    
    # 2. 速度环(外环)
    speed_error = speed_target - speed_actual
    current_target = speed_pid.update(speed_error)  # 输出是电流目标值
    
    # 3. 电流环(内环)
    current_error = current_target - current_actual
    voltage_output = current_pid.update(current_error)  # 输出是电压控制量
    
    # 4. 限幅保护
    voltage_output = clamp(voltage_output, -MAX_VOLTAGE, MAX_VOLTAGE)
    
    # 5. 输出PWM
    set_pwm(voltage_output)
    
    # 6. 等待下一个控制周期
    delay(CONTROL_PERIOD)

你看,逻辑非常清晰。速度环慢,电流环快。一般电流环的执行频率是速度环的5-10倍。比如速度环1kHz,电流环就跑到10kHz。

仿真时的注意事项:

  • 先单独调好电流环,再调速度环。电流环调不好,速度环就是空中楼阁。
  • 仿真时给电机加一个阶跃负载(比如突然增加摩擦力),看看速度环能不能快速恢复。这才是检验双闭环性能的试金石。
  • 限幅一定要做!电流环的输出限幅,就是限制你给电机的最大电压。速度环的输出限幅,就是限制你允许的最大电流。这两个限幅是保护电机和驱动器的最后一道防线。

我记得有一次帮一个学生调他的平衡车项目,他的电流环没加限幅,结果一启动,电流直接冲到30A,MOS管瞬间冒烟。嗯,从那以后,我写代码第一件事就是加限幅。

重要提醒:

双闭环的积分饱和问题。当速度环输出被限幅时,积分项还在继续累积,导致限幅解除后,控制量需要很长时间才能降下来,造成超调。解决办法:积分分离或抗饱和积分。代码实现很简单:

if (abs(speed_error) < INTEGRAL_THRESHOLD):
    integral += speed_error * Ki
else:
    integral = 0  # 误差太大时,停止积分

这个小技巧,能让你的系统响应快一倍,超调小一半。

好了,这一章的内容就到这里。双闭环是电机控制的基石,搞懂了它,后面学FOC、伺服控制都会轻松很多。下一章,我们聊聊更高级的——无传感器控制,那才是真正考验工程师水平的地方。