第二节 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控制器数学模型。你看,结构就这么简单。但简单归简单,调起来可没那么容易。

为什么?因为KpKi不是独立工作的。你调大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控制器知识体系 PI控制器 比例环节 (P) 积分环节 (I) u_p = Kp * e(t) 特点:快速响应,有稳态误差 u_i = Ki * ∫e(t)dt 特点:消除稳态误差,易饱和 数字PI实现 位置式PI(有积分饱和) 增量式PI(无积分饱和)

这张图把比例、积分、数学模型、数字实现串在了一起。你顺着箭头看一遍,应该就能理解PI控制器的全貌了。

2.7 小结

这一节我们讲了:

  • 比例环节:快速响应,但有稳态误差
  • 积分环节:消除稳态误差,但容易饱和
  • PI数学模型:P和I配合使用,先调P再调I
  • 数字PI实现:位置式和增量式,电流环推荐增量式

嗯,基础打牢了,下一节我们就要开始实战了——怎么用代码把PI控制器跑起来,并且调出漂亮的电流波形。到时候我会分享一些我踩过的坑,保证让你少走弯路。