第二节 PI控制器基础:比例环节、积分环节、PI控制器数学模型、数字PI实现方式
好,咱们接着聊。上一节我们把FOC的框架搭起来了,你知道了电流环是核心中的核心。那这个核心靠什么来驱动?就是PI控制器。说白了,PI控制器就是电流环的“大脑”,它告诉电机:“哥们儿,你跑偏了,赶紧回来!”
我个人习惯,在讲任何控制器之前,先把它拆成最基础的零件。PI控制器就两个零件:一个叫比例(P),一个叫积分(I)。咱们一个一个看。
2.1 比例环节:简单粗暴的“纠错员”
比例环节,英文叫Proportional,简称P。它的工作方式特别简单:误差越大,输出越大。
你想想看,如果电流目标值是5A,现在实际只有4A,误差是1A。比例环节就会输出一个跟这1A成正比的电压指令,让PWM占空比变大,把电流往上推。误差变成0.5A了,输出就小一半。就这么直接。
数学上就是:
u_p(t) = Kp * e(t)
其中,e(t)是误差,Kp是比例增益。
关键点:比例环节能快速响应,但它有个天生的毛病——稳态误差。什么意思?就是它永远追不到目标值,总会差那么一点点。比如你推一个箱子,力气越大推得越快,但最后停下来时,箱子离目标位置总差个几厘米。这就是比例环节的局限性。
我在项目中遇到过,有一次调一个高速风机,Kp给得很大,电流响应确实快,但电机嗡嗡响,电流波形像锯齿一样。嗯,这就是比例太大导致的震荡。后面我会讲怎么避免。
2.2 积分环节:死磕到底的“老黄牛”
比例环节搞不定的稳态误差,谁来收拾?积分环节。英文叫Integral,简称I。
积分环节的工作方式更有意思:它把过去的误差全部累加起来。只要误差还存在,积分值就会一直增长,输出就会一直增加,直到把误差彻底消除。
数学上:
u_i(t) = Ki * ∫ e(t) dt
你可以把积分想象成一个“记仇本”。每次有误差,它就记一笔。误差持续越久,记的“仇”越多,输出的惩罚就越大。直到误差归零,它才停止记账。
我的经验:积分环节是消除稳态误差的法宝,但也是“双刃剑”。积分太强,系统会变得迟钝,甚至出现“积分饱和”——就是积分值积累得太大,导致系统超调严重。我曾经在一个伺服项目里,积分给大了,电机到位后还往前冲了一大截,差点撞了限位开关。
2.3 PI控制器数学模型:把P和I合在一起
把比例和积分加起来,就是完整的PI控制器:
u(t) = Kp * e(t) + Ki * ∫ e(t) dt
这就是连续域下的PI控制器数学模型。你看,结构就这么简单。但简单归简单,调起来可没那么容易。
为什么?因为Kp和Ki不是独立工作的。你调大Kp,响应快了,但震荡风险增加;你调大Ki,稳态精度好了,但超调和响应速度会受影响。这两个参数就像夫妻俩,得配合好才行。
避坑指南:我曾经犯过一个错误——先调Ki再调Kp。结果怎么调都调不好,系统要么震荡要么响应慢。后来老工程师告诉我,正确的顺序是:先调Kp让系统响应起来,再调Ki消除稳态误差。这个顺序,我到现在都记得。
2.4 数字PI实现方式:从连续到离散
上面讲的都是连续域的数学公式,但我们的单片机是数字系统,只能处理离散的采样点。所以,得把连续PI变成数字PI。
常用的方法有两种:位置式PI和增量式PI。
2.4.1 位置式PI
位置式PI直接模拟连续PI的积分过程,把积分用累加代替:
// 位置式PI实现
float PI_Controller(float target, float actual) {
float error = target - actual;
static float integral = 0.0f;
integral += error * dt; // 累加误差,dt是采样周期
float output = Kp * error + Ki * integral;
// 输出限幅
if(output > MAX_OUTPUT) output = MAX_OUTPUT;
if(output < -MAX_OUTPUT) output = -MAX_OUTPUT;
return output;
}
这个实现很直观,但有个问题:积分饱和。如果输出被限幅了,积分还在累加,等误差反向时,积分值已经很大了,会导致系统反应迟钝。
注意:位置式PI一定要加积分限幅和输出限幅。我见过有人忘了加,结果电机启动时积分疯狂累加,输出直接饱和,电机像疯了一样转。嗯,那场面,挺吓人的。
2.4.2 增量式PI
增量式PI不直接计算输出值,而是计算输出的增量:
// 增量式PI实现
float PI_Controller_Incremental(float target, float actual) {
float error = target - actual;
static float last_error = 0.0f;
float delta_output = Kp * (error - last_error) + Ki * error * dt;
last_error = error;
static float output = 0.0f;
output += delta_output;
// 输出限幅
if(output > MAX_OUTPUT) output = MAX_OUTPUT;
if(output < -MAX_OUTPUT) output = -MAX_OUTPUT;
return output;
}
增量式的优点很明显:没有积分饱和问题,而且输出变化更平滑。我个人的习惯,在电流环这种需要快速响应的场合,更倾向于用增量式PI。
2.5 两种实现方式的对比
| 特性 | 位置式PI | 增量式PI |
|---|---|---|
| 积分饱和 | 容易发生,需额外处理 | 不易发生 |
| 输出变化 | 可能突变 | 平滑 |
| 实现复杂度 | 简单 | 稍复杂 |
| 适用场景 | 位置控制、速度控制 | 电流环、快速响应系统 |
你看,没有绝对的好坏,只有适合不适合。电流环我推荐增量式,位置环用位置式更直观。
2.6 本章知识体系图
下面这张图,把PI控制器的核心逻辑串起来了。你看一遍,应该就能记住整个脉络。
这张图把比例、积分、数学模型、数字实现串在了一起。你顺着箭头看一遍,应该就能理解PI控制器的全貌了。
2.7 小结
这一节我们讲了:
- 比例环节:快速响应,但有稳态误差
- 积分环节:消除稳态误差,但容易饱和
- PI数学模型:P和I配合使用,先调P再调I
- 数字PI实现:位置式和增量式,电流环推荐增量式
嗯,基础打牢了,下一节我们就要开始实战了——怎么用代码把PI控制器跑起来,并且调出漂亮的电流波形。到时候我会分享一些我踩过的坑,保证让你少走弯路。