第4章:直流电机闭环控制——PID控制原理、速度环与电流环设计、PI参数整定方法
各位同学,今天咱们聊点硬核的——直流电机的闭环控制。说实话,我刚入行那会儿,觉得PID就是个黑盒子,调参全靠蒙。后来踩的坑多了,才慢慢摸到门道。这一章,我把这些年积累的经验掰开揉碎了讲给你们听。
4.1 PID控制原理——别被公式吓到
PID控制,说白了就是三个字:比例、积分、微分。你想想看,一个电机要转得稳,得同时管三件事:
- 比例(P):当前偏差有多大,我就给多大劲儿。偏差大,输出大;偏差小,输出小。简单粗暴。
- 积分(I):过去累积的偏差,我得算总账。比如系统一直有静差,积分项会慢慢把输出往上顶,直到误差消失。
- 微分(D):预测未来。偏差变化快了,微分项提前刹车,防止超调。
公式长这样:
u(t) = Kp * e(t) + Ki * ∫e(t)dt + Kd * de(t)/dt
嗯,别盯着公式发呆。我在项目里实际用的时候,直流电机速度环和电流环基本只用PI,很少加D。为什么?因为电机本身有惯性,微分项对噪声特别敏感,搞不好反而震荡。我曾经在一个伺服项目里加了D,结果电机高频抖动,最后乖乖去掉,世界清净了。
核心要点:直流电机控制,PI是主力,D慎用。电流环响应快,速度环响应慢,两者时间尺度差一个数量级。
4.2 速度环与电流环设计——双环嵌套的玩法
实际工程中,我们很少用单环控制。为什么?因为电机启动时电流会瞬间飙升,单环根本压不住。所以主流方案是电流内环 + 速度外环,也叫双环控制。
结构是这样的:
- 速度环(外环):给定目标转速,输出电流参考值。
- 电流环(内环):接收电流参考值,控制PWM占空比,让实际电流跟上。
我个人的习惯是:先调内环,再调外环。电流环调好了,速度环才有好底子。你想想看,如果电流环都抖得像筛子,速度环再怎么调也是白搭。
避坑指南:我曾经在一个项目中,电流环采样频率设得太低,导致电流响应滞后,速度环跟着震荡。后来把电流环频率提到10kHz,速度环1kHz,问题就解决了。记住:内环频率至少是外环的5-10倍。
4.3 PI参数整定方法——Ziegler-Nichols实战
调参是门手艺活。Ziegler-Nichols法是我最常用的方法,简单粗暴有效。分两步走:
第一步:找临界增益
先把积分和微分关掉(Ki=0, Kd=0),只留比例项。然后慢慢增大Kp,直到系统开始等幅震荡。记录此时的Kp值,叫临界增益Ku,震荡周期叫Tu。
我在实验室里干过这事:电机嗡嗡响,示波器上波形开始等幅震荡,心里默数周期。嗯,这时候手要稳,别抖。
第二步:查表算参数
Ziegler-Nichols给出了经验公式:
| 控制器类型 | Kp | Ki | Kd |
|---|---|---|---|
| P | 0.5 * Ku | - | - |
| PI | 0.45 * Ku | 1.2 * Kp / Tu | - |
| PID | 0.6 * Ku | 2 * Kp / Tu | Kp * Tu / 8 |
举个例子:假设你测出Ku=10,Tu=0.1秒,那么PI参数就是:
Kp = 0.45 * 10 = 4.5
Ki = 1.2 * 4.5 / 0.1 = 54
注意,这个Ki是积分系数,不是积分时间。有些教材用积分时间Ti,换算关系是Ki = Kp / Ti。别搞混了,我见过有人把Ki设成54,结果积分饱和,电机直接飞车。
警告:Ziegler-Nichols法给出的参数偏激进,容易超调。实际使用时,我通常会把Kp再降20%-30%,然后微调Ki。记住:参数是死的,系统是活的,最终要靠现场调试。
4.4 代码实现——C语言版PI控制器
理论讲完了,上代码。这是我常用的PI控制器结构体:
typedef struct {
float Kp; // 比例系数
float Ki; // 积分系数
float integral; // 积分累加值
float limit; // 输出限幅
float integral_limit; // 积分限幅(防饱和)
} PI_Controller;
float PI_Update(PI_Controller *pi, float target, float actual) {
float error = target - actual;
float output;
// 比例项
float p_out = pi->Kp * error;
// 积分项(带限幅)
pi->integral += pi->Ki * error;
if (pi->integral > pi->integral_limit)
pi->integral = pi->integral_limit;
else if (pi->integral < -pi->integral_limit)
pi->integral = -pi->integral_limit;
// 总输出
output = p_out + pi->integral;
// 输出限幅
if (output > pi->limit)
output = pi->limit;
else if (output < -pi->limit)
output = -pi->limit;
return output;
}
这段代码里,我特别加了积分限幅。为什么?因为电机启动时误差大,积分项会疯狂累加,等误差变小了,积分项还在高位,导致超调严重。这叫积分饱和,我吃过亏。
经验之谈:积分限幅一般设为输出限幅的50%-80%。比如输出限幅是1000,积分限幅就设500-800。这样既能消除静差,又不会过度饱和。
4.5 实战调参流程——手把手教你
好了,理论、代码都有了,咱们走一遍完整流程:
- 初始化:Kp=0, Ki=0, 输出限幅设好(比如PWM占空比0-1000)。
- 调电流环:给一个固定电流目标,慢慢加Kp,直到电流响应快且不震荡。然后加Ki,消除静差。
- 调速度环:电流环调好后,切换到速度模式。重复步骤2,但目标改成转速。
- 联调:给一个阶跃指令,观察响应。如果超调大,降Kp;如果响应慢,加Ki。
- 微调:带负载测试,看稳态误差和动态响应。我一般会录波形,反复调3-5轮。
嗯,调参是个耐心活。我记得有一次调一个直流无刷电机,从早上调到晚上,最后发现是电流采样有噪声,滤波没做好。所以,先检查硬件,再调软件,这个顺序别搞反了。
小技巧:用示波器看电流波形,如果毛刺多,先加低通滤波。我习惯在电流采样后做一阶低通,截止频率设到电流环带宽的1/5左右。
4.6 总结——记住这三句话
这一章内容不少,但核心就三句话:
- PI够用,D慎加——直流电机控制,PI是主力。
- 先内后外,先硬后软——调参顺序别乱。
- Ziegler-Nichols是起点,不是终点——参数要结合实际微调。
下一章,咱们聊电流采样和PWM生成,那是电机控制的底层功夫。各位回去把PI代码跑一遍,有问题群里问。