#include <stdio.h>
typedef struct {
float Target_value; //目标值
float Current_value; //当前值
float Err; //目前误差
float Last_Err; //上一次误差
float Kp,Ki,Kd; //比例常数,积分常数,微分常数
float output; //PID输出,通常作为控制执行器的变量
float integral; //积分值
}PID_TypeDef;
PID_TypeDef PID; //定义结构体变量
void PID_Init();
float PID_operation(float value);
int main(){
freopen("E:\PID_output.txt","w",stdout); //重定向输出到文件
PID_Init(); //PID初始化
for(int i=1; i<=1000; i++){
printf("%f
",PID_operation(200.0));
}
return 0;
}
//初始化PID各项参数
void PID_Init(){
PID.Target_value = 0.0;
PID.Current_value = 0.0;
PID.Err = 0.0;
PID.Last_Err = 0.0;
PID.output = 0.0;
PID.integral = 0.0;
PID.Kp = 0.2;
PID.Ki = 0.05;
PID.Kd = 0.2; //比例常数,积分常数,微分常数的调整非常重要,这里的参数是经过几次试验得出的经验参数
}
//PID操作
float PID_operation(float value){
PID.Target_value = value; //确定目标值
PID.Err = PID.Target_value - PID.Current_value; //计算偏差量
PID.integral += PID.Err; //计算和
PID.output = PID.Kp*PID.Err + PID.Ki*PID.integral + PID.Kd* (PID.Err-PID.Last_Err); //PID运算
PID.Last_Err = PID.Err; //将当前误差值存入上一误差值
PID.Current_value = PID.output*1.0; //将当前值更新为PID的输出值
return PID.Current_value; //返回当前值
}