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

位置型PID的C語言實現

首先,再次給出位置型PID離散化公式:

根據位置型PID離散化公式編寫C語言代碼程序:

第一步,定義PID變量結構體代碼以下:

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");
 }

統一初始化變量,尤爲是 Kp,Ki,Kd 三個參數,調試過程中,對於要求的控制效果,能夠經過調節這三個量直接進行調節。

第三步,編寫控制算法:算法

/**********************************************************************************/
//PID算法 驅動代碼	
//對比例、微分、積分進行離散化處理以後 
/*********************************************************************************/ 	  

//位置型PID算法 
//PID算法最基本形式,未考慮死區問題,未定義上下限,對公式的直接實現
float PID_realize1(float speed)
{
    pid.SetSpeed = speed;
	pid.err = pid.SetSpeed - pid.ActualSpeed;
	pid.integral += pid.err;   //積分
	pid.voltage = pid.Kp * pid.err + pid.Ki * pid.integral 
	              + pid.Kd * (pid.err - pid.err_last);      //電壓
	pid.err_last = pid.err;
	pid.ActualSpeed = pid.voltage * 1.0;
	return pid.ActualSpeed;
 }

注意:這裏用了最基本的算法實現形式,沒有考慮死區問題,沒有設定上下限,只是對公式的一種直接的實現。

第四步,編寫測試代碼:函數

int main(void)
{ 
	uart_init(115200);	//串口初始化波特率爲115200
	delay_init(168);		//初始化延時函數
	LED_Init();		      //初始化LED端口
	PID_init();
	int count = 0;
  while(count<1000)
   {
	 GPIO_ResetBits(GPIOC,GPIO_Pin_13); 
	 delay_ms(50);  		   //延時300ms
	 GPIO_SetBits(GPIOC,GPIO_Pin_13);	  
     delay_ms(50);        //延時300ms

     float speed = PID_realize1(200.0);
	 printf("%f\n",speed);
	 count++;

    }
  return 0 ;
 }

測試說明:測試代碼中,初始化串口,獎PID的數據經過串口發送給電腦上位機,同時每傳送一次數據,LED等閃爍一次,用以提                 示程序運行情況。

第四步,測試結果說明:

通過1000次調節後輸出單片機1000個數據,其中一部分以下所示:

83.000001  11.555000  59.559675  28.175408  52.907421  38.944152  51.891699  46.141651
53.339054  51.509998  55.908450  55.944631  58.970680

199.999094  199.999115  199.999123  199.999135  199.999152  199.999161  199.999172
199.999183  199.999201  199.999203  199.999224  199.999232  199.999243  199.999261
199.999263  199.999284  199.999292  199.999304  199.999321  199.999323  199.999344
199.999352  199.999364  199.999381  199.999390  199.999401  199.999412  199.999430
199.999432  199.999453  199.999461  199.999473

由輸出數據可知,PID的輸出在必定時間內,會逐步穩定到指望值。

以上是我對位置型PID算法的簡單代碼表示,但願你們多多提出寶貴意見,我必定會及時改正。

相關文章
相關標籤/搜索