目录
一·串级PID简述
1·基本概念
串级 PID(Cascade PID)是一种在单级 PID 控制基础上发展而来的控制策略。它由多个 PID 控制器级联组成,通常包含一个主控制器和一个或多个副控制器。主控制器的输出作为副控制器的设定值,副控制器根据这个设定值对系统进行更精细的控制。
2·工作原理
串级 PID 的核心思想是将一个复杂的控制问题分解为多个相对简单的子问题。通过这种方式,可以提高系统的控制性能,增强系统对干扰的抵抗能力。例如,在一个温度控制系统中,主控制器可以根据设定温度和实际温度的偏差计算出一个中间控制量,副控制器则根据这个中间控制量和另一个相关变量(如加热功率)的偏差来精确控制加热设备的输出。
二·串级PID结构
一个典型的串级 PID 系统包含两个 PID 控制器:主 PID 控制器和副 PID 控制器。主 PID 控制器接收系统的设定值和主反馈值,计算出一个中间输出值;副 PID 控制器接收主 PID 的输出作为其设定值,并结合副反馈值,计算出最终的控制输出。
三·代码实例
#include <stdio.h>
// 定义PID结构体
typedef struct {
float kp; // 比例系数
float ki; // 积分系数
float kd; // 微分系数
float prev_error; // 上一次的误差
float integral; // 积分项
} PID;
// 初始化PID控制器
void PID_Init(PID *pid, float kp, float ki, float kd) {
pid->kp = kp;
pid->ki = ki;
pid->kd = kd;
pid->prev_error = 0;
pid->integral = 0;
}
// 计算PID输出
float PID_Compute(PID *pid, float setpoint, float current_value) {
float error = setpoint - current_value;
pid->integral += error;
float derivative = error - pid->prev_error;
float output = pid->kp * error + pid->ki * pid->integral + pid->kd * derivative;
pid->prev_error = error;
return output;
}
// 串级PID控制函数
float Cascade_PID_Control(PID *main_pid, PID *sub_pid, float main_setpoint, float main_feedback, float sub_feedback) {
// 主PID计算中间输出
float intermediate_output = PID_Compute(main_pid, main_setpoint, main_feedback);
// 副PID计算最终输出
float final_output = PID_Compute(sub_pid, intermediate_output, sub_feedback);
return final_output;
}
int main() {
// 初始化主PID和副PID控制器
PID main_pid, sub_pid;
PID_Init(&main_pid, 1.0, 0.1, 0.01);
PID_Init(&sub_pid, 0.5, 0.05, 0.005);
// 设定主设定值
float main_setpoint = 100.0;
// 模拟主反馈和副反馈
float main_feedback = 0.0;
float sub_feedback = 0.0;
// 进行控制迭代
for (int i = 0; i < 100; i++) {
float control_output = Cascade_PID_Control(&main_pid, &sub_pid, main_setpoint, main_feedback, sub_feedback);
// 这里可以添加模拟系统响应的代码,更新反馈值
main_feedback += control_output * 0.1;
sub_feedback += control_output * 0.05;
printf("Iteration %d: Control Output = %.2f, Main Feedback = %.2f, Sub Feedback = %.2f\n", i, control_output, main_feedback, sub_feedback);
}
return 0;
}
四·代码解释
- PID 结构体:定义了 PID 控制器的基本参数,包括比例系数(
kp
)、积分系数(ki
)、微分系数(kd
)、上一次的误差(prev_error
)和积分项(integral
)。 - PID_Init 函数:用于初始化 PID 控制器的参数。
- PID_Compute 函数:根据设定值和当前值计算 PID 控制器的输出。
- Cascade_PID_Control 函数:实现串级 PID 控制,先调用主 PID 计算中间输出,再将中间输出作为副 PID 的设定值,计算最终的控制输出。
- main 函数:初始化主 PID 和副 PID 控制器,设定主设定值,模拟主反馈和副反馈,进行控制迭代,并输出每次迭代的控制输出和反馈值。
五·串级PID调参方法
1. 副 PID 参数调整
- 比例系数(
kp
):先将主 PID 的输出固定,单独调整副 PID 的比例系数。逐渐增大kp
,观察副反馈值的响应速度。kp
越大,系统响应越快,但可能会导致系统超调增大,甚至不稳定。当系统出现轻微超调时,记录此时的kp
值。 - 积分系数(
ki
):在确定了合适的kp
后,加入积分作用。逐渐增大ki
,直到系统的稳态误差消除。但ki
过大可能会导致系统出现积分饱和现象,使系统不稳定。 - 微分系数(
kd
):如果系统存在较大的超调,可以适当增加微分系数kd
来抑制超调。但kd
过大可能会使系统对噪声过于敏感。
2. 主 PID 参数调整
- 在副 PID 参数调整好后,开始调整主 PID 的参数。调整方法与副 PID 类似,先调整比例系数,再调整积分系数,最后调整微分系数。
- 由于主 PID 的输出作为副 PID 的设定值,主 PID 的参数调整会影响副 PID 的控制效果。因此,在调整主 PID 参数时,需要综合考虑系统的整体性能。
3. 综合调试
- 在完成主 PID 和副 PID 的单独调整后,需要进行综合调试。观察系统在不同工况下的响应,如设定值变化、干扰输入等,根据实际情况微调主 PID 和副 PID 的参数,以达到最佳的控制效果。
六·使用场景
在进行闭云台电机角度时,我们通常选用双环PID,即串级PID。外环为角度环,内环为速度环。先将目标角度与电机角度进行PID计算,得到的输出作为速度环的目标,与电机的速度进行PID计算。得到的输出即可发给电机。这样我们在控制电机角度的同时,也能让电机以一个较理想的速度去达到目标角度。
在调参时一般我们将角度环的Kp给大,而速度环的Kp较小。这样电机能够更精确的到达目标角度,且系统不会出现震荡。或者我们将角度环的Kp给小,而速度环的Kp给大,这样我们也可以使系统稳定,且响应速度较快,但电机的角度与目标角度存在一个较大的误差。
而在上图所示的简单系统中,将位置环Kp给大,而速度环较小时
如果位置环Kp相对速度环Kp较小时
由此可见,在位置环较大时,该系统会出现超调,而速度环较大时系统的响应很快,且没有出现超调,所以将内外环参数合理调整,系统的响应可以达到一个令人满意的程度。
由于该系统是最简单的二阶系统,并非电机系统,因此和我上面说的云台(电机)调参经验有所不同。
PID计算代码:PID控制器简述(附代码)-CSDN博客
调参是一个经验性的过程,需要不断地尝试和调整,同时结合系统的实际运行情况进行优化。