位置型PID增量型PID調節直流電機

位置型PID增量PID調節直流電機

一、思路
無論是位置型還增量型的PID都是爲了調節PWM波,使電機的轉速達到設定值。這次實驗目的主要是實現用機智雲app控制電機並使電機的轉速達到設定值後保持穩定。
二、實現過程

  1. 材料:正點原子stmf4探索板及其配套的esp8266、0~6v直流電機、L9110s芯片的驅動模塊,對射光計數芯片。
  2. 接下來要實現一個閉環的,主要的思路是將,通過計數器的算成對應的速度,通過pid公式調節,反饋回去,調節PWM波自至速度達到設定值。
  3. 我是通過TIM4_CH1輸出PWM波,控制電機轉速;通過短時間定時器和對射管計數器傳過來的信號,高低電平來測量速度的。
  4. 這是我的pid筆記
PID算法重要知識點:一種可以自我調節,穩定輸出,實現實際值十分接近設定值的方法。
一、類型
(1).位置型pid
實現的步驟:
	1.建立一個結構體其中包括:
          比例係數(Kp)Proportion,
          積分系數(Ki)Integral,
          微分系數(Kd)Derivative,
          當前誤差current_error,
          上次誤差S_error,
          累計誤差Sum_error,
          設定目標SetValue
          實際數值actualValue

        2.位置型PID的公式:increment=(Pid->Kp)*(Pid->error)+(Pid->Ki)*(Pid
                            ->SUM_error)+(Pid->Kd)*(Pid->error-Pid->S_error);

	3.初始化函數,調整函數:
          /*------------------------------------------
           函數功能:位置型pid參數初始化min~max
           函數說明:			
          ------------------------------------------*/
           void PositionPid_Init(PID Pid)
          {
              Pid->Kp=0.8;
              Pid->Ki=0.1;   
              Pid->Kd=0.1;
	      Pid->error=0.0;
              Pid->S_error=0.0;
              Pid->SUM_error=0.0;
              Pid->actualvalue=0.0;
              Pid->setvalue=0.0;
          }
          /*------------------------------------------
   	   函數功能:位置型PID調整
	   函數說明:利用本次誤差和上次誤差進行反饋調節		
	  ------------------------------------------*/
	   float PositionPid_adjust(PID Pid,float setpoint)
	  {
 	     float increment;
	     Pid->setvalue=setpoint;
	     Pid->error=setpoint-Pid->actualvalue;
             Pid->SUM_error+=Pid->error; 
	     /*採用的是位置型pid*/
             increment=(Pid->Kp)*(Pid->error)+(Pid->Ki)*(Pid->SUM_error)+(Pid->Kd)*             (Pid->error-Pid->S_error);//這個是位置式PID的靈魂
              Pid->S_error=Pid->error;
             return (318-increment);//這裏318是根據實際需要增加的。
           }
          

        4.思路及要點:位置型PID首先要解決的問題是閉環反饋的事,就是要有測量反饋給單片                      機結構體變量Pid->actualvalue,然後在調整中會根據不斷更新的實際值,帶入公式進行不斷調節,以達到目標。

(2)增量型PID
        1.建立結構體
          /*------------------------------------------
 	   結構體說明:這是位置式、增量式PID的結構體,包括基本的
						PID調節參數.
	  ------------------------------------------*/
	  typedef struct node
	 {
 	  /*1.比例係數Kp 2.積分系數Ki 3.微分系數Kd
  	  4.本次的誤差error 5.上次的誤差S_error
  	  6.用於積分的誤差和SUM_error
  	  7.設定的值setvalue 8.實際的值actualvalue
 	 */
	/*下沒有特別說明就代表是共同變量*/
 	  float Kp;
 	  float Ki;
 	  float Kd;
	  float error;
          float S_error;
          float SS_error;   //上上次誤差,增量型PID需要 
          float SUM_error; //累計誤差,位置型PID需要
          float setvalue;
          float actualvalue;
	  }PIDN,*PID;
        2.初始化函數 ,調整函數:
 /*------------------------------------------
 函數功能:增量型PID初始化
 函數說明:			
------------------------------------------*/
void IncrementPid_Init(PID Pid)
{
	  
    Pid->Kp=0.1;
    Pid->Ki=0.85;
    Pid->Kd=0.15;
    Pid->error=0.0;
    Pid->S_error=0.0;
    Pid->SS_error=0.0;
    Pid->actualvalue=0.0;
    Pid->setvalue=0.0;
}
/*------------------------------------------
 函數功能:增量型PID調整
 函數說明:			
------------------------------------------*/
float IncrementPid_adjust(PID Pid,float setpoint)
{
   float increment;
   float fanhuizhi;
   Pid->setvalue=setpoint;
   Pid->error=setpoint-Pid->actualvalue;
   increment=(Pid->Kp)*((Pid->error)-(Pid->S_error))+(Pid->Ki)*(Pid->error)*i+(Pid->Kd)*(Pid->error-2*Pid->S_error+Pid->SS_error);//這個是增量式PID的靈魂
   adjust_shuzhi-=increment;//根據實際應用的時候adjust_shuzhi的值太大了,所以有點像下降型pid調節。
   Pid->SS_error=Pid->S_error;
   Pid->S_error=Pid->error;
}
一、實際使用PID的經驗
    a.有些變量只能初始化一次,注意看
    b.對於直流電機調速的結果看,增量型越接近越慢
    c.實際值->公式-> =? 設定值,否則返回。
    d.在調節pid參數的時候,最好設置一個些printf用觀察數字的變化。












4.這是我參考的pid算法的資料:
鏈接:https://pan.baidu.com/s/1bYmddMa1DavPCMzIDd9E1g
提取碼:5lga
四、總結:首先聲明我這裏並沒有將我這個項目的所有的資料,只是將其中對pid的資料及相關思路寫了下來。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章