1. 单回路PID控制
结构
单回路PID控制是最基础的控制结构,只有一个控制器和一个被控对象(控制回路)。
- 输入:系统设定值(Setpoint,SP)。
- 输出:控制器计算的控制信号。
- 被控对象:系统的执行机构或动态过程。
优点
- 结构简单,易于实现。
- 调节快速,适合动态特性简单的系统。
缺点
- 对非线性、时变系统或存在显著干扰的系统,效果可能较差。
- 无法对干扰进行提前处理,易受外部扰动影响。
2. 串级PID控制
结构
串级PID控制由两个嵌套的控制回路组成:
- 主回路(外回路):调节主变量(如输出温度、速度)。
- 副回路(内回路):调节副变量(如阀门开度、电机电流)。
控制流程
-
主回路控制器(外环):
- 计算主误差 e1(t)=SP−PV1e_1(t) = SP - PV_1e1(t)=SP−PV1。
- 输出主控制量 u1(t)u_1(t)u1(t),作为副回路的设定值 SP2SP_2SP2。
-
副回路控制器(内环):
- 副回路的设定值为 SP2=u1(t)SP_2 = u_1(t)SP2=u1(t)。
- 计算副误差 e2(t)=SP2−PV2e_2(t) = SP_2 - PV_2e2(t)=SP2−PV2,生成最终的控制信号 u(t)u(t)u(t)。
-
最终控制信号 u(t)u(t)u(t) 作用于被控对象。
优点
- 抗扰性强:内回路快速抑制扰动,外回路保证系统主变量精度。
- 动态响应快:内回路可显著改善系统的动态性能。
- 适合复杂系统:对多变量、非线性系统表现更好。
缺点
- 调节复杂:主、副回路需要分别整定。
- 实现难度高:需要测量和反馈副变量(如流量、压力)。
单回路PID与串级PID对比
对比项 | 单回路PID | 串级PID |
---|---|---|
结构 | 一个PID控制器控制一个回路 | 两个嵌套回路,外回路和内回路各有一个PID控制器 |
适用场景 | 动态特性简单、扰动较小的系统 | 动态复杂、多干扰、需要快速响应的系统 |
抗扰性能 | 抗扰性较弱 | 抗扰性强,内回路可快速抑制干扰 |
动态响应 | 响应速度受限 | 动态响应快,内回路优化动态性能 |
实现复杂度 | 简单 | 实现复杂,需配置两个回路 |
调节难度 | 只需整定一个PID控制器 | 两个PID控制器需分别整定 |
典型应用 | 温度、液位、简单压力控制 | 温度控制(带流量内环)、伺服控制(电流/速度控制) |
应用场景示例
1. 单回路PID
- 液位控制:
- 设定值为目标液位,通过PID调整进水阀门开度维持液位稳定。
- 室内温度控制:
- 设定值为目标温度,通过PID控制加热器的功率。
2. 串级PID
- 温度控制(流量内环):
- 主回路:根据温度设定值和测量值调整流量设定值。
- 副回路:快速调节流量阀门,使流量达到设定值。
- 伺服系统控制:
- 主回路:位置控制器(外环)根据设定值调整目标速度。
- 副回路:速度控制器(内环)根据目标速度调整电流。
串级PID实现的C++代码
以下是一个简单的串级PID控制器的实现代码:
#include <iostream>
class PID {
private:
double Kp, Ki, Kd, dt;
double prevError, integral;
public:
// 构造函数
PID(double Kp, double Ki, double Kd, double dt)
: Kp(Kp), Ki(Ki), Kd(Kd), dt(dt), prevError(0), integral(0) {}
// 计算PID输出
double compute(double setpoint, double processValue) {
double error = setpoint - processValue;
integral += error * dt;
double derivative = (error - prevError) / dt;
double output = Kp * error + Ki * integral + Kd * derivative;
prevError = error;
return output;
}
};
int main() {
// 外回路(主回路)PID
PID outerPID(2.0, 0.5, 1.0, 0.1);
// 内回路(副回路)PID
PID innerPID(3.0, 1.0, 0.5, 0.1);
double setpoint = 100.0; // 主回路设定值(目标温度)
double innerSetpoint = 0.0; // 内回路设定值(流量目标)
double processValue = 0.0; // 系统输出(实际温度)
double flowRate = 0.0; // 内回路控制的流量
for (int i = 0; i < 100; ++i) {
// 外回路计算(调节内回路设定值)
innerSetpoint = outerPID.compute(setpoint, processValue);
// 内回路计算(调节最终控制输出)
double controlSignal = innerPID.compute(innerSetpoint, flowRate);
// 模拟系统动态
flowRate += controlSignal * 0.1; // 流量变化
processValue += flowRate * 0.1; // 温度变化
// 打印结果
std::cout << "Step: " << i
<< ", Process Value: " << processValue
<< ", Flow Rate: " << flowRate
<< ", Control Signal: " << controlSignal << std::endl;
}
return 0;
}
总结
- 单回路PID控制适用于简单、动态特性明确的系统,具有实现简单、调节快速的优点。
- 串级PID控制适用于动态复杂、多干扰场景,内回路对扰动响应快,外回路提升主变量精度。适合如温度控制和伺服系统的场景。
选择控制策略时,应根据系统的动态特性和控制目标权衡。