增量型PID的C語言實現
上一節中介紹了最簡單的位置型 PID 的實現手段,這一節主要講解增量式PID 的實現方法,位置型和增量型 PID 的數學公式請參見個人系列文《PID 控制算法的 C 語言實現二》中的講解。實現過程仍然是分爲定義變量、初始化變量、實現控制算法函數、算法測試四個部分,詳細分類請參加《PID 控制算法的 C 語言實現三》中的講解,這裏直接給出代碼了。算法
struct _pid{ float SetSpeed; //定義設定值 float ActualSpeed;//定義實際值 float err; //定義誤差值 float err_last; //定義上一個誤差值 float err_past; //定義前一個誤差值 float Kp,Ki,Kd; //定義比例、積分、微分系數 float voltage; //定義電壓值(控制執行器變量) float integral; //定義積分值 int index; // 積分分離時的變量 float umax; //積分極限 float umin; }pid; void PID_init() //pid變量初始化 { printf("PID_init begin \n"); pid.SetSpeed = 0.0; pid.ActualSpeed = 0.0; pid.err = 0.0; pid.err_last = 0.0; pid.err_past = 0.0; pid.voltage = 0.0; pid.integral = 0.0; pid.Kp = 0.4; pid.Ki = 0.2; pid.Kd = 0.2; pid.umax = 400; pid.umin = -200; printf("PID_init end \n"); }
//增量型PID算法 //結果和最近三次的偏差有關,,輸出=U(K)+增量調節值 float PID_realize2(float speed) { pid.SetSpeed = speed; pid.err = pid.SetSpeed - pid.ActualSpeed; float incrementSpeed = pid.Kp * (pid.err - pid.err_last)+ pid.Ki * pid.err + pid.Kd * (pid.err - 2 * pid.err_last + pid.err_past);//電壓 pid.ActualSpeed += incrementSpeed; pid.err_past = pid.err_last; pid.err_last = pid.err; return pid.ActualSpeed; }
實驗數據以下:函數
83.000000 11.555000 59.559677 28.175406 52.907425 38.944149 51.891701 46.141655 53.339050 51.510002 55.908447 55.944637 58.970676 59.882942 62.224998 63.537247 65.527702 ....... 199.999359 199.999374 199.999374 199.999390 199.999390 199.999405 199.999405 199.999420 199.999420 199.999435 199.999435 199.999451 199.999451 199.999466 199.999466 199.999481 199.999481 199.999496 199.999496 199.999512 199.999512