#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\n",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; //返回當前值
}
PID算法的簡單C語言實現
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.