一文读懂PID、PID入门教程、串级pid 并级 pid例程以及分析

PID控制器详细介绍

PID控制器是一种广泛应用于工业过程控制的经典控制算法。PID代表比例(Proportional)、积分(Integral)和微分(Derivative),这些术语描述了控制器如何根据系统的误差信号生成控制信号,以达到期望的系统输出。

PID控制器的基本原理
  1. 比例控制(P - Proportional)

    • 作用:比例控制根据当前的误差生成一个控制信号,该信号与误差成正比。
    • 公式:[ P(t) = K_p \times e(t) ]
    • 作用效果:增大比例增益 ( K_p ) 可以提高系统的响应速度,但过高的比例增益可能导致系统振荡。
  2. 积分控制(I - Integral)

    • 作用:积分控制考虑过去的误差积累,用于消除稳态误差。
    • 公式:[ I(t) = K_i \times \int e(t) , dt ]
    • 作用效果:增大积分增益 ( K_i ) 可以消除系统的稳态误差,但可能引入过度的系统响应(如振荡)。
  3. 微分控制(D - Derivative)

    • 作用:微分控制预测未来的误差变化,基于误差的变化率生成控制信号。
    • 公式:[ D(t) = K_d \times \frac{de(t)}{dt} ]
    • 作用效果:增大微分增益 ( K_d ) 可以减少系统的振荡,使系统更平稳,但可能放大噪声信号。
PID控制器的综合公式

PID控制器的输出 ( u(t) ) 是比例、积分和微分三部分的总和:
[ u(t) = K_p \times e(t) + K_i \times \int e(t) , dt + K_d \times \frac{de(t)}{dt} ]
其中:

  • ( u(t) ) 是控制器的输出信号。
  • ( e(t) ) 是设定值和实际值之间的误差。
  • ( K_p )、( K_i ) 和 ( K_d ) 分别是比例、积分和微分的增益系数。

PID控制器C++例程

以下是一个简单的PID控制器的C++实现示例,用于模拟一个系统响应设定值的过程。

#include <iostream>

class PID {
public:
    PID(double kp, double ki, double kd) 
        : Kp(kp), Ki(ki), Kd(kd), prevError(0), integral(0) {}

    double compute(double setpoint, double measured, double dt) {
        double error = setpoint - measured;
        integral += error * dt;
        double derivative = (error - prevError) / dt;
        prevError = error;
        return Kp * error + Ki * integral + Kd * derivative;
    }

private:
    double Kp, Ki, Kd;
    double prevError, integral;
};

int main() {
    PID pid(1.0, 0.1, 0.05);  // 初始化PID控制器,设定Kp、Ki和Kd的值
    double setpoint = 100.0;   // 目标值
    double measured = 0.0;     // 初始测量值
    double dt = 0.1;           // 采样时间间隔

    for (int i = 0; i < 100; ++i) {
        double control = pid.compute(setpoint, measured, dt);
        measured += control * dt; // 模拟系统响应
        std::cout << "Measured: " << measured << std::endl;
    }

    return 0;
}

程序分析

  1. PID类

    • 类构造函数初始化三个增益参数 ( K_p )、( K_i )、( K_d ) 以及误差的初始值和积分的初始值。
    • compute 方法计算给定设定值和测量值的误差,并通过PID控制算法计算控制信号。
  2. 主程序

    • 主程序通过一个循环模拟控制过程,假设系统每0.1秒(即dt)进行一次采样,并且将控制信号应用于系统,使系统输出逐渐逼近设定值。
    • 程序每次迭代输出当前的测量值,以观察系统如何随时间调整。

操作步骤

  1. 编写和保存程序:将上述C++代码保存为文件,例如pid_example.cpp
  2. 编译程序
    • 在Linux终端中,运行以下命令编译程序:
      g++ -o pid_example pid_example.cpp
      
  3. 运行程序
    • 运行编译后的可执行文件:
      ./pid_example
      
    • 程序将在终端中输出每次迭代后的测量值。

程序运行结果分析

程序运行后,你将看到终端输出的测量值逐步趋近于设定值100.0。随着时间的推移,测量值将稳定在设定值附近,这是PID控制器通过调整控制信号实现的。

示例输出:

Measured: 10.1
Measured: 19.39
Measured: 27.931
Measured: 35.7379
Measured: 42.833
...
Measured: 99.9123
Measured: 99.9798
Measured: 100.013

分析

  • 初始阶段,测量值迅速上升,显示了比例控制的强烈作用。
  • 随着系统接近设定值,积分控制逐渐消除残余误差,使系统稳定。
  • 微分控制在系统接近设定值时抑制了过冲,使得系统平稳过渡到稳态。

并级PID控制器(Parallel PID)

并级PID控制器将比例、积分、微分三部分的控制输出分别计算后加和,常用于需要同时考虑多个控制目标的场景。

并级PID控制器公式
[ u(t) = K_p e(t) + K_i \int e(t) , dt + K_d \frac{de(t)}{dt} ]

并级PID控制器C++程序例子
#include <iostream>

class PID {
public:
    PID(double kp, double ki, double kd) : Kp(kp), Ki(ki), Kd(kd), prevError(0), integral(0) {}
    
    double compute(double setpoint, double measured, double dt) {
        double error = setpoint - measured;
        integral += error * dt;
        double derivative = (error - prevError) / dt;
        prevError = error;
        return Kp * error + Ki * integral + Kd * derivative;
    }

private:
    double Kp, Ki, Kd;
    double prevError, integral;
};

int main() {
    PID pid(1.0, 0.1, 0.01);  // 初始化PID控制器,设定Kp、Ki和Kd的值
    double setpoint = 100.0;   // 目标值
    double measured = 0.0;     // 初始测量值
    double dt = 0.1;           // 采样时间间隔

    for (int i = 0; i < 100; ++i) {
        double control = pid.compute(setpoint, measured, dt);
        measured += control * dt; // 模拟系统响应
        std::cout << "Measured: " << measured << std::endl;
    }

    return 0;
}
并级PID控制器调试步骤
  1. 初始化参数:初始设定( K_p )、( K_i )和( K_d ),从较小的值开始。
  2. 运行程序:执行程序并观察测量值与设定值的误差变化情况。
  3. 调节比例增益(( K_p )):调整Kp,以增大或减小系统对误差的响应速度。
  4. 调节积分增益(( K_i )):调整Ki,以消除稳态误差。注意过高的Ki可能导致系统不稳定。
  5. 调节微分增益(( K_d )):调整Kd,以减少系统的振荡或过冲,改善系统稳定性。
  6. 循环调试:不断调整Kp、Ki和Kd的值,直到系统达到期望的动态和稳态性能。
并级PID控制器的编译和运行

编译命令(基于Linux)

g++ -o parallel_pid_control parallel_pid_control.cpp

运行程序

./parallel_pid_control
并级PID控制器运行结果示例

程序运行后,终端将输出每次迭代后的测量值,逐渐接近设定值100.0,系统逐步趋于稳定。

Measured: 10.1
Measured: 19.29
Measured: 27.6571
...
Measured: 99.989
Measured: 99.9967
Measured: 100.000

串级PID控制器(Cascade PID)

串级PID控制器通常由两个PID控制器串联组成。主控制器(外环)生成次级控制器(内环)的设定值,次级控制器直接控制系统。串级控制适用于具有多个被控变量的复杂系统。

串级PID控制器公式

  1. 主控制器
    [ u_{main}(t) = K_{p1} e_{main}(t) + K_{i1} \int e_{main}(t) , dt + K_{d1} \frac{de_{main}(t)}{dt} ]

    • ( u_{main}(t) ) 主控制器的输出作为次级控制器的设定值。
  2. 次级控制器
    [ u_{secondary}(t) = K_{p2} e_{secondary}(t) + K_{i2} \int e_{secondary}(t) , dt + K_{d2} \frac{de_{secondary}(t)}{dt} ]

串级PID控制器C++程序例子
#include <iostream>

class PID {
public:
    PID(double kp, double ki, double kd) : Kp(kp), Ki(ki), Kd(kd), prevError(0), integral(0) {}
    
    double compute(double setpoint, double measured, double dt) {
        double error = setpoint - measured;
        integral += error * dt;
        double derivative = (error - prevError) / dt;
        prevError = error;
        return Kp * error + Ki * integral + Kd * derivative;
    }

private:
    double Kp, Ki, Kd;
    double prevError, integral;
};

int main() {
    PID mainController(1.0, 0.1, 0.01);      // 主控制器参数
    PID secondaryController(0.5, 0.05, 0.005); // 次级控制器参数
    
    double setpoint = 100.0;    // 目标值
    double measured = 0.0;      // 初始测量值
    double dt = 0.1;            // 采样时间间隔

    for (int i = 0; i < 100; ++i) {
        double secondarySetpoint = mainController.compute(setpoint, measured, dt); // 主控制器输出作为次级控制器的设定值
        double control = secondaryController.compute(secondarySetpoint, measured, dt); // 次级控制器计算最终控制量
        measured += control * dt; // 模拟系统响应
        std::cout << "Measured: " << measured << std::endl;
    }

    return 0;
}
串级PID控制器调试步骤
  1. 配置内环(次级控制器):先调试次级控制器,使其能快速、稳定地跟踪主控制器的输出。
  2. 配置外环(主控制器):主控制器的调节可基于次级控制器的响应,通常主控制器的响应速度比次级控制器慢,以保证整体系统稳定性。
  3. 调节主控制器的增益:调整主控制器的Kp、Ki和Kd值,优化系统的总体性能。
  4. 反复调试:确保内环的快速性与外环的稳定性相平衡,反复调整参数,直到达到理想的控制效果。
串级PID控制器的编译和运行

编译命令(基于Linux)

g++ -o cascade_pid_control cascade_pid_control.cpp

运行程序

./cascade_pid_control
串级PID控制器运行结果示例

程序运行后,终端将显示每次迭代后的测量值,逐步趋近于设定值100.0。内外环的共同调节下,系统将较快稳定于目标值附近。

Measured: 5.05
Measured: 9.7975
Measured: 14.2979
...
Measured: 

99.994
Measured: 99.9985
Measured: 100.000

适用场景分析

  • 并级PID:适合简单的过程控制场景,如温度、压力或速度控制,尤其在单一控制回路中效果显著。适用于控制目标单一、动态变化较小的系统。

  • 串级PID:适合复杂多变量系统,如流量控制、化学反应过程控制等。对于要求精度高、响应时间快且需要多个控制回路协同工作的系统,串级PID表现优异。

总结

通过详细的PID、并级PID和串级PID的介绍和程序示例,你可以根据具体控制对象的复杂性、精度要求、动态响应要求等选择适合的控制方法。并级PID适用于单回路简单控制,而串级PID适合复杂系统的精确控制。调试过程中通过反复调整增益参数,最终达到理想的系统性能。

  • 8
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值