电流环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控制器里最容易踩的坑。我曾经在一个项目里,电机启动时电流超调直接触发过流保护,查了两天才发现是积分饱和搞的鬼。

积分饱和怎么发生的?

你想想看:电机启动时,目标电流和实际电流差距很大。积分项拼命累加,输出很快就顶到限幅值了。但此时误差仍然很大,积分项还在继续累加——虽然输出已经被限幅,但积分项内部的值(我们叫它“积分累加器”)还在涨。

等到实际电流追上目标时,这个巨大的积分累加器需要很长时间才能“泄放”掉。结果就是:输出长时间饱和,电流严重超调,系统振荡甚至失控。

注意:积分饱和不是“有没有限幅”的问题,而是“限幅后积分项是否同步停止累加”的问题。很多新手加了输出限幅就以为万事大吉,其实积分累加器还在后台疯长。

抗积分饱和怎么做?

常用的方法有几种:

  1. 积分限幅法:给积分累加器单独设一个上限,不让它无限增长。
  2. 积分冻结法:当输出达到限幅值时,停止积分项的更新。
  3. 反向积分法:输出饱和时,只允许积分项往“退出饱和”的方向累加。
  4. 条件积分法:只有误差在某个范围内才进行积分。

我个人最常用的是“积分冻结法”,实现简单,效果也够用。代码大概长这样:

// 位置式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控制器的核心脉络串起来:

电流环PI控制器知识结构 电流环PI控制器知识结构 PI控制器 数学原理 u(t)=Kp·e(t)+Ki·∫e(τ)dτ 比例项 → 响应速度 积分项 → 消除静差 模拟 vs 数字 模拟:连续、硬件、温漂 数字:离散、软件、灵活 FOC中常用数字PI 位置式 vs 增量式 位置式:完整输出,需累加 增量式:输出变化量 电流环推荐位置式 积分饱和与抗饱和 积分饱和:输出限幅后积分继续累加 后果:超调、振荡、失控 解决方法:积分冻结/限幅/条件积分 代码实现要点 采样周期Ts固定 输出限幅 + 积分同步 抗饱和是必选项 💡 核心要点 电流环PI必须加抗饱和 位置式更适合FOC电流环

嗯,这一节的内容就这些。从数学原理到数字实现,从位置式到增量式,再到积分饱和这个老大难问题——每一步都是做电流环绕不开的。把这些基础打牢,后面调参数的时候你心里就有底了。