3、PID控制基础:PID控制器原理、位置环与电流环设计、数字PID实现方法

各位工程师朋友,大家好。今天我们聊聊磁悬浮轴承控制里最核心的东西——PID控制。说实话,我入行那会儿,第一个接触的算法就是PID。当时觉得这东西太简单了,不就是比例、积分、微分三个参数嘛。后来在项目里被现实狠狠教育了一顿,才发现PID的调优,尤其是用在磁悬浮这种强非线性系统上,门道深着呢。

这一章,我会把PID的原理、位置环和电流环怎么设计、以及数字域怎么实现,掰开了揉碎了讲清楚。嗯,咱们直接开始。

3.1 PID控制器原理:从模拟到数字

PID控制器的数学表达式,大家应该都见过:

u(t) = Kp * e(t) + Ki * ∫e(t)dt + Kd * de(t)/dt

说白了,就是根据当前的误差(P)、过去的误差累积(I)、未来的误差趋势(D),来算出一个控制量。我个人的理解是:P是现在,I是过去,D是未来。你想想看,一个控制器如果能同时看到这三个维度,那它基本就能把系统稳住。

但在磁悬浮轴承里,情况有点特殊。磁悬浮系统天生不稳定,转子一旦偏离中心,电磁力会把它拉得更偏。所以PID在这里的任务,不是“优化”,而是“稳住”。

核心要点:磁悬浮的PID,首要目标是保证系统稳定,其次才是动态性能。千万别一上来就追求响应速度,那会出大问题。

我在项目中遇到过一位同事,他把Kp调得特别大,想加快响应。结果转子直接撞到保护轴承上,声音特别刺耳。嗯,从那以后,我调PID都是先保证稳定,再慢慢加增益。

3.2 位置环与电流环设计:双环结构的秘密

磁悬浮轴承的控制,通常采用双环结构:外环是位置环,内环是电流环。为什么要这么设计?

你想想看,位置环的输出是期望的电磁力,但电磁力是通过线圈电流产生的。电流环的作用,就是快速、准确地跟踪这个期望电流。说白了,位置环负责“算账”,电流环负责“干活”。

控制环 输入 输出 带宽要求
位置环 转子位置误差 期望电磁力(或期望电流) 较低(通常几十Hz)
电流环 期望电流与实际电流的误差 PWM占空比(电压指令) 较高(通常几百Hz到几kHz)

我个人习惯,设计时先调电流环,再调位置环。电流环调好了,位置环的“执行器”才靠谱。我曾经在调试一个高速电机时,电流环带宽不够,导致位置环输出的力指令总是滞后,转子一直在振荡。后来把电流环的Ki加大了一些,问题就解决了。

设计技巧:电流环的PI参数,可以用“模最优”法来整定。简单说,就是让电流环的闭环传递函数近似为一个一阶惯性环节,带宽尽量高,但不要超过PWM开关频率的1/10。

3.3 数字PID实现方法:离散化与防积分饱和

现在控制器基本都是数字的,所以我们要把模拟PID变成数字PID。最常用的方法是位置式PID增量式PID

位置式PID直接计算完整的控制量:

u(k) = Kp * e(k) + Ki * Ts * sum(e(i)) + Kd * (e(k) - e(k-1)) / Ts

这个公式很直观,但有个大坑:积分饱和。如果执行器饱和了(比如PWM占空比到了100%),积分项还在累积,等误差反向时,控制器要花很长时间才能退饱和。嗯,这里要注意。

增量式PID只计算控制量的增量:

Δu(k) = Kp * (e(k) - e(k-1)) + Ki * Ts * e(k) + Kd * (e(k) - 2*e(k-1) + e(k-2)) / Ts

我个人更推荐增量式PID,尤其是在磁悬浮这种对积分饱和敏感的系统里。因为它天然带有抗积分饱和的特性——你只需要限制输出u(k)的上下限,积分项就不会无限累积。

避坑指南:我曾经在调试一个磁悬浮平台时,用了位置式PID,结果积分饱和导致系统在启动时剧烈超调。后来换成增量式PID,配合输出限幅,问题就解决了。记住:数字PID一定要做输出限幅和积分限幅

下面是一个简单的数字PID实现代码,我用的是增量式:

// 增量式PID结构体
typedef struct {
    float Kp, Ki, Kd;
    float Ts;           // 采样周期
    float e_prev;       // e(k-1)
    float e_prev2;      // e(k-2)
    float u_out;        // 当前输出
    float u_max, u_min; // 输出限幅
} PID_Inc;

float PID_Inc_Calc(PID_Inc *pid, float setpoint, float feedback) {
    float e = setpoint - feedback;
    float delta_u = pid->Kp * (e - pid->e_prev) 
                 + pid->Ki * pid->Ts * e 
                 + pid->Kd * (e - 2*pid->e_prev + pid->e_prev2) / pid->Ts;
    
    pid->u_out += delta_u;
    
    // 输出限幅
    if (pid->u_out > pid->u_max) pid->u_out = pid->u_max;
    if (pid->u_out < pid->u_min) pid->u_out = pid->u_min;
    
    // 更新历史误差
    pid->e_prev2 = pid->e_prev;
    pid->e_prev = e;
    
    return pid->u_out;
}

这段代码看起来简单,但实际项目里,我还会加上积分分离变速积分。积分分离的意思是:当误差很大时,让积分项失效,防止超调;当误差小时,再让积分项起作用,消除静差。这个技巧,我在调磁悬浮的悬浮高度时经常用。

3.4 知识体系总览

为了让大家更直观地理解本章的知识结构,我画了一张图。这张图把PID原理、双环设计、数字实现串在了一起。你一看就明白,这些知识点是怎么关联的。

磁悬浮轴承PID控制知识体系 PID控制器 PID原理(P/I/D作用) 双环设计(位置环+电流环) 数字PID实现方法 比例(P):当前误差 积分(I):过去累积 微分(D):未来趋势 位置环:外环,带宽低 电流环:内环,带宽高 位置式PID 增量式PID(推荐) 防积分饱和 核心目标:稳定 → 动态性能 → 抗干扰

这张图里,我把PID原理、双环设计、数字实现三个模块的关系画清楚了。你从PID控制器出发,左边是原理,中间是结构设计,右边是工程实现。底部是核心目标——先稳定,再追求动态性能,最后考虑抗干扰能力。这个顺序,我在每个项目里都严格遵守。

好了,这一章的内容就到这里。PID看似简单,但真正用好它,尤其是在磁悬浮这种系统里,需要大量的实践和调试。下一章我们会聊更具体的参数整定方法,到时候我会分享一些我自己的“土办法”。


专注资料整理