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、伺服控制都会轻松很多。下一章,我们聊聊更高级的——无传感器控制,那才是真正考验工程师水平的地方。