第4章:PID控制器原理

各位工程师朋友,今天我们来聊聊数字电源里最核心的东西——PID控制器。说实话,我做了十几年电源,PID就像我的老搭档。你把它调好了,整个系统就稳如泰山;调不好,那真是让人抓狂。

PID,说白了就是比例、积分、微分三个环节的组合。每个环节都有自己的脾气,组合起来就能干大事。咱们一个一个来看。

4.1 比例(P)控制

比例控制是最直接的。你想想看,输出有误差了,我就按比例放大这个误差去调节。误差越大,调节力度越大。

核心公式: u(t) = Kp × e(t)

其中,Kp是比例系数,e(t)是当前误差。

我在项目中遇到过这样一个情况:一个Buck变换器,只用P控制,负载突变时输出电压总是稳不住。为什么?因为P控制有个天生的毛病——它会产生稳态误差。说白了,就是系统最终会稳定在一个有偏差的位置,而不是目标值。

我的经验:比例系数Kp不能太大,否则系统容易振荡。我一般从0.1开始往上调,观察输出响应,找到临界振荡点,然后取一半左右的值。

4.2 积分(I)控制

积分控制就是用来消除稳态误差的。它会把过去的误差累积起来,时间越长,累积的误差越大,调节力度就越强。

核心公式: u(t) = Ki × ∫e(t)dt

Ki是积分系数,∫e(t)dt是误差的积分。

嗯,这里要注意。积分虽然能消除稳态误差,但它有个副作用——积分饱和。我曾经吃过这个亏。有一次调一个PFC电路,积分系数设得太大,结果启动时输出电压超调了20%,差点把后级电路烧了。

避坑指南:积分饱和是数字PID里最常见的坑。解决办法是加抗饱和机制,比如积分限幅、条件积分等。我习惯用积分限幅,简单有效。

4.3 微分(D)控制

微分控制是预测未来的。它根据误差的变化率来提前调节,相当于给系统加了个"刹车"。误差变化越快,微分作用越强。

核心公式: u(t) = Kd × de(t)/dt

Kd是微分系数,de(t)/dt是误差的变化率。

微分控制对噪声特别敏感。你想想看,采样信号里有一点高频噪声,微分一算,变化率就变得很大,系统就会乱跳。我建议在数字实现时,一定要先做滤波,再做微分。

4.4 PID组合特性

把三个环节组合起来,就是完整的PID控制器:

完整公式: u(t) = Kp × e(t) + Ki × ∫e(t)dt + Kd × de(t)/dt

三个环节各有分工:

  • P控制:快速响应,但会有稳态误差
  • I控制:消除稳态误差,但可能引起超调
  • D控制:抑制超调,改善动态响应,但对噪声敏感

我个人的习惯是,先调P,让系统基本稳定;再加I,消除稳态误差;最后加D,改善动态性能。这个顺序我用了十几年,基本没出过问题。

下面这张图展示了PID控制器的知识体系:

PID控制器知识体系 比例(P)控制 快速响应,稳态误差 积分(I)控制 消除稳态误差 微分(D)控制 抑制超调,预测未来 PID组合特性 P+I+D = 快速 + 精准 + 稳定 数字PID实现 离散化、采样周期、抗饱和 位置式PID 直接计算输出 增量式PID 计算增量输出

4.5 数字PID实现

在数字电源里,我们没法直接用连续的积分和微分,得把它们离散化。常用的有两种方法:位置式PID和增量式PID。

位置式PID

位置式PID直接计算当前时刻的控制量:

u(k) = Kp × e(k) + Ki × Σe(i) + Kd × [e(k) - e(k-1)]

其中,Σe(i)是从开始到现在的误差累加和。这个实现简单,但有个问题——积分项会一直累积,容易饱和。

增量式PID

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

Δu(k) = Kp × [e(k) - e(k-1)] + Ki × e(k) + Kd × [e(k) - 2e(k-1) + e(k-2)]

我个人更喜欢增量式PID。为什么?因为它不会累积积分误差,即使你算错了,下一拍也能纠正回来。而且切换手动/自动模式时,不会产生冲击。

实用技巧:数字PID的采样周期很关键。我一般取开关频率的1/10到1/20。比如100kHz的开关频率,采样周期取5-10kHz就差不多了。太快了浪费算力,太慢了控制效果差。

下面是一个简单的数字PID实现代码:

// 数字PID结构体
typedef struct {
    float Kp;      // 比例系数
    float Ki;      // 积分系数
    float Kd;      // 微分系数
    float error_prev;   // 上一次误差
    float error_prev2;  // 上上次误差
    float integral;     // 积分累加
    float output;       // 输出
} PID_TypeDef;

// PID计算函数(增量式)
float PID_Calc(PID_TypeDef *pid, float setpoint, float feedback) {
    float error = setpoint - feedback;
    
    // 计算增量
    float delta = pid->Kp * (error - pid->error_prev) +
                  pid->Ki * error +
                  pid->Kd * (error - 2*pid->error_prev + pid->error_prev2);
    
    // 更新历史误差
    pid->error_prev2 = pid->error_prev;
    pid->error_prev = error;
    
    // 累加输出
    pid->output += delta;
    
    // 输出限幅
    if(pid->output > OUTPUT_MAX) pid->output = OUTPUT_MAX;
    if(pid->output < OUTPUT_MIN) pid->output = OUTPUT_MIN;
    
    return pid->output;
}

重要提醒:数字PID一定要做输出限幅!我曾经见过一个同事,没加限幅,结果积分饱和后输出直接冲到满量程,把MOSFET炸了。限幅值一般取PWM占空比的0-100%,或者根据实际电路调整。

好了,PID的基本原理就讲到这里。记住,理论是基础,但真正的功夫在调试上。多动手,多观察波形,慢慢你就能找到感觉了。


专注资料整理