基本概念
位置式PID控制
位置式PID控制是指在积分环节,对从0时刻到当前时刻的所有偏差进行积分,是非递推式的全局积分。
增量式PID控制
和位置式PID控制不同,增量式PID控制将当前时刻的控制量和上一时刻的控制量做差,以差值为新的控制量,是一种递推式的算法。
简单说,增量式PID输入控制量是增加量,而位置式PID输入控制量是每次位置点的值。实际上就是积分部分有差异,其余是一样的。
请用c语言编写PID自动整定程序
(百度一言)
编写一个完整的PID自动整定程序是一个相对复杂的任务,它通常涉及多个步骤和算法。PID(比例-积分-微分)控制器是一种广泛使用的控制算法,用于调整系统输出以匹配期望的输入。自动整定通常意味着自动调整PID控制器的参数(比例系数Kp、积分时间Ti和微分时间Td)以达到最佳性能。
下面是一个简化的C语言示例,用于实现PID控制器和简单的自动整定逻辑。请注意,这个示例非常基础,并且没有考虑许多实际应用中可能需要的复杂性和优化。
#include <stdio.h>
#include <math.h>
// PID 控制器结构体
typedef struct {
double setpoint; // 设定点
double Kp; // 比例系数
double Ki; // 积分系数
double Kd; // 微分系数
double integral; // 积分项
double prev_error; // 上一次的误差
} PIDController;
// 初始化 PID 控制器
void PID_Init(PIDController *pid, double setpoint, double Kp, double Ki, double Kd) {
pid->setpoint = setpoint;
pid->Kp = Kp;
pid->Ki = Ki;
pid->Kd = Kd;
pid->integral = 0.0;
pid->prev_error = 0.0;
}
// 更新 PID 控制器
double PID_Update(PIDController *pid, double input) {
double error = pid->setpoint - input;
pid->integral += error;
double derivative = error - pid->prev_error;
double output = pid->Kp * error + pid->Ki * pid->integral + pid->Kd * derivative;
pid->prev_error = error;
return output;
}
// 简单的自动整定函数(这里使用试错法)
void PID_AutoTune(PIDController *pid, double input, double step_size, int iterations) {
double best_error = INFINITY;
double best_Kp = 0.0, best_Ki = 0.0, best_Kd = 0.0;
for (int i = 0; i < iterations; i++) {
pid->Kp += step_size;
double error = fabs(PID_Update(pid, input) - pid->setpoint);
if (error < best_error) {
best_error = error;
best_Kp = pid->Kp;
}
pid->Kp -= 2 * step_size; // 回退并尝试下一个值
// 类似地,你可以添加对 Ki 和 Kd 的整定逻辑
// ...
}
pid->Kp = best_Kp;
// pid->Ki = best_Ki;
// pid->Kd = best_Kd;
}
int main() {
PIDController pid;
PID_Init(&pid, 100.0, 1.0, 0.1, 0.01); // 初始参数可能需要调整
double input = 0.0; // 假设的输入值,实际应用中可能是从传感器读取的
PID_AutoTune(&pid, input, 0.1, 100); // 自动整定,这里简单地对 Kp 进行整定
// 使用整定后的参数运行 PID 控制器
for (int i = 0; i < 10; i++) {
double output = PID_Update(&pid, input);
printf("Output: %f\n", output);
// 这里应该有一个控制循环,根据 output 调整系统,并更新 input
}
return 0;
}
这个示例中的PID_AutoTune函数是一个非常基础的自动整定方法,它仅对Kp进行整定,并且使用简单的试错法。在实际应用中,你可能需要使用更复杂的整定算法,如Ziegler-Nichols方法、Cohen-Coon方法或基于优化算法的方法。此外,你还可能需要考虑系统的动态特性、噪声和其他干扰因素。
请注意,PID控制器的参数整定是一个经验性很强的过程,通常需要根据具体的应用场景和系统特性进行调整和优化。
参考资料:
各种PID算法——用C语言去实现:
https://blog.csdn.net/Nirvana_Tai/article/details/105409311
PID–位置型PID和增量式PID比较:
https://blog.csdn.net/qq_31094099/article/details/125410670
增量式PID控制
https://baike.baidu.com/item/%E5%A2%9E%E9%87%8F%E5%BC%8FPID%E6%8E%A7%E5%88%B6/20861314?fr=aladdin
注:这个看懂了位置式和增量式的区别
图文详解PID调参
https://cloud.tencent.com/developer/article/2095472