#include <stdio.h>
#include <stdlib.h>// 定义PID结构体
typedef struct {float SetSpeed;float ActualSpeed;float err;float integral;float vo_out;float err_last;float Kp;float Ki;float Kd;
} PID;// 函数声明
void PID_init(PID *pid);
float PID_realize(PID *pid, float Setparameter);// 函数定义
void PID_init(PID *pid) {// 初始化PID参数pid->Kp=0.2;pid->Ki=0.015;pid->Kd=0.2;pid->SetSpeed = 0.0;pid->ActualSpeed = 0.0;pid->vo_out = 0.0;pid->integral = 0.0;pid->err = 0.0;pid->err_last = 0.0;
} float PID_realize(PID *pid, float Setparameter) {pid->SetSpeed = Setparameter;pid->err = pid->SetSpeed - pid->ActualSpeed;pid->integral = pid->integral + pid->err; // 积分误差积累pid->vo_out = pid->Kp * pid->err + pid->Ki * pid->integral + pid->Kd * (pid->err - pid->err_last);pid->err_last = pid->err; // 误差更新pid->ActualSpeed = pid->vo_out; // 将输出值赋给实际值return pid->ActualSpeed;
}int main() {PID myPID; // 创建PID控制器实例// 初始化PID参数PID_init(&myPID);float Setparameter;printf("Enter the set parameter: ");scanf("%f", &Setparameter); // 读取用户输入的目标参数int count=0;while(count<1000){myPID.ActualSpeed = PID_realize(&myPID, Setparameter); // 调用PID控制函数printf("count is: %d, actual_speed is: %f\n", count, myPID.ActualSpeed);count++;}return 0;
}
通过输入值通过PID算法计算,固定次数(可调),但Kp、Ki、Kd三个参数此时固定。