电流环PI控制器基础
做FOC控制,电流环是内环,也是整个系统响应速度的根基。而电流环的核心,就是PI控制器。说白了,PI控制器就是根据当前的误差,算出一个修正量,让实际电流跟上你的目标电流。
这一节我们不讲虚的,直接看PI的数学原理、数字实现方式,以及那些容易让你掉坑里的细节——比如积分饱和。
PI控制器的数学原理
先看连续域的表达式:
u(t) = Kp * e(t) + Ki * ∫ e(τ) dτ
这里面:
- e(t) —— 目标值与实际值的误差
- Kp —— 比例系数,决定响应速度
- Ki —— 积分系数,消除稳态误差
- u(t) —— 控制器输出,也就是给电机的电压指令
比例项是“当下”的误差,误差大就输出大,响应快。但光有比例项会有静差,比如你让电机转1000转,它可能只到980转就停了。这时候积分项就起作用了——它把过去的误差累加起来,慢慢把输出往上推,直到误差消失。
关键理解:比例项管“快不快”,积分项管“准不准”。两者配合,才能让电流又快又准地跟踪目标。
模拟PI与数字PI的区别
模拟PI是用运放和电容电阻搭出来的,连续时间工作。数字PI是在MCU里用定时中断,每隔一个采样周期算一次。区别在哪?
| 对比项 | 模拟PI | 数字PI |
|---|---|---|
| 实现方式 | 硬件电路 | 软件代码 |
| 采样时间 | 连续 | 离散(固定周期Ts) |
| 积分方式 | 电容充电 | 累加求和 |
| 参数调整 | 换电阻电容 | 改代码里的Kp/Ki值 |
| 温漂问题 | 明显 | 无 |
| 灵活性 | 低 | 高(可加限幅、抗饱和) |
我个人习惯用数字PI。原因很简单——改参数不用动烙铁。而且数字PI可以很方便地加入各种保护逻辑,比如限幅、抗积分饱和,这些在模拟电路里做起来很麻烦。
位置式与增量式PI算法
数字PI有两种常见实现形式:位置式和增量式。很多人搞混,我帮你理清楚。
位置式PI
直接模拟连续PI的离散化形式:
u(k) = Kp * e(k) + Ki * Ts * Σ e(i) (i从0到k)
特点:
- 输出u(k)是完整的控制量
- 需要累加所有历史误差
- 积分项容易饱和
- 如果输出限幅,积分项需要同步处理
增量式PI
只计算当前输出相对于上一次输出的变化量:
Δu(k) = Kp * [e(k) - e(k-1)] + Ki * Ts * e(k)
u(k) = u(k-1) + Δu(k)
特点:
- 输出是增量,累加得到最终控制量
- 不需要存储所有历史误差
- 积分饱和问题相对轻一些
- 执行器带积分特性时(如步进电机),增量式更自然
我的建议:做FOC电流环,位置式用得更多。因为电流环输出直接是电压指令,需要完整的控制量。增量式更适合位置环或速度环,尤其是输出接积分型执行器的时候。
积分饱和与抗积分饱和
这是PI控制器里最容易踩的坑。我曾经在一个项目里,电机启动时电流超调直接触发过流保护,查了两天才发现是积分饱和搞的鬼。
积分饱和怎么发生的?
你想想看:电机启动时,目标电流和实际电流差距很大。积分项拼命累加,输出很快就顶到限幅值了。但此时误差仍然很大,积分项还在继续累加——虽然输出已经被限幅,但积分项内部的值(我们叫它“积分累加器”)还在涨。
等到实际电流追上目标时,这个巨大的积分累加器需要很长时间才能“泄放”掉。结果就是:输出长时间饱和,电流严重超调,系统振荡甚至失控。
注意:积分饱和不是“有没有限幅”的问题,而是“限幅后积分项是否同步停止累加”的问题。很多新手加了输出限幅就以为万事大吉,其实积分累加器还在后台疯长。
抗积分饱和怎么做?
常用的方法有几种:
- 积分限幅法:给积分累加器单独设一个上限,不让它无限增长。
- 积分冻结法:当输出达到限幅值时,停止积分项的更新。
- 反向积分法:输出饱和时,只允许积分项往“退出饱和”的方向累加。
- 条件积分法:只有误差在某个范围内才进行积分。
我个人最常用的是“积分冻结法”,实现简单,效果也够用。代码大概长这样:
// 位置式PI + 抗积分饱和(积分冻结)
float PI_Controller(float target, float actual, float Kp, float Ki, float Ts)
{
float error = target - actual;
float output;
// 比例项
float p_out = Kp * error;
// 积分项(先计算)
integral += Ki * Ts * error;
// 输出 = 比例 + 积分
output = p_out + integral;
// 输出限幅
if (output > OUTPUT_MAX) {
output = OUTPUT_MAX;
// 积分冻结:把积分项拉回到限幅后的值减去比例项
integral = output - p_out;
} else if (output < OUTPUT_MIN) {
output = OUTPUT_MIN;
integral = output - p_out;
}
return output;
}
这段代码的关键在于:输出限幅后,把积分累加器重新计算为“限幅后的输出减去比例项”。这样积分项就不会在饱和时继续累加,退出饱和也很快。
避坑指南:我曾经在调试一个500W的伺服电机时,没加抗积分饱和,结果电流环在启动时反复振荡,电机嗡嗡响。加上积分冻结后,启动波形干净利落。所以——电流环PI一定要加抗饱和,这不是可选项,是必选项。
本章知识结构
下面这张图帮你把PI控制器的核心脉络串起来:
嗯,这一节的内容就这些。从数学原理到数字实现,从位置式到增量式,再到积分饱和这个老大难问题——每一步都是做电流环绕不开的。把这些基础打牢,后面调参数的时候你心里就有底了。