PID算法

基本概念

位置式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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值