PID控制算法的C語言實現(四)

增量型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
相關文章
相關標籤/搜索