電賽控制類PID演演算法實現

2023-05-28 21:01:51

一、什麼是PID

學過自動控制原理的對PID並不陌生,PID控制是對偏差訊號e(t)進行比例、積分和微分運算變換後形成的一種控制規律。PID 演演算法的一般形式:

  • PID控制系統原理框圖

二、PID離散化

對PID連續系統離散化,從而方便在處理器上實現,PID 離散表示形式:

離散化後最終得到位置式PID:

u(k)為控制器輸出的控制量;(輸出)
e(k)為偏差訊號,它等於給定量與輸出量之差;(輸入)
Kp 為比例係數;
Ti 為積分時間常數;
Td 為微分時間常數。


1. 位置式PID公式

2. 增量式PID公式


三、兩種PID的不同點

  • 位置式
    是一種非遞推演演算法,輸出值U(k)和執行機構的實際位置一一對應,在不帶積分部件的物件中可以很好的應用。但是每次輸出均與過去的狀態有關,計算量大。
  • 增量式
    輸出的是增量,控制增量的值僅與最近3次取樣值有關,不需要累計偏差,運算量小,計算錯誤影響小。但會積分截斷效應大,有穩態誤差。

四、C語言程式實現

  • pid.c
#include "pid.h"

/*定義PID引數結構體*/
typedef struct _PID
{
    float Kp,Ki,Kd;//比例係數、積分系數、微分系數
    float SetValue,ActualValue;//目標值、實際值
    float Error;//第K次誤差
    float LastError;//第K-1次誤差
    float PreError;//第K-2次誤差
    float SumError;//累計偏差
    float Integral,MaxI;//積分、積分限幅
    float Output,MaxOut;//輸出、輸出限幅
}PID;

/************************************************
*@brief  :位置式PID控制器
*@param  :PID結構體變數地址,當前實際值
*@retval : 期望輸出值
*************************************************/
int32_t Position_PID_Control(PID *pid,float Cur_Value)
{
    pid->Error=pid->SetValue-Cur_Value; //計算偏差      
    pid->SumError +=pid->Error;//累計偏差
    pid->ActualValue=(pid->Kp*(pid->Error-pid->LastError))//比例環節
    +(pid->Ki*pid->SumError)//積分環節
    +(pid->Kd*(pid->Error-pid->LastError);//微分環節
    pid->LastError=pid->Error;
    return ((int32_t)pid->ActualValue); //返回計算值	 
}

/************************************************
*@brief  :速度閉環PID控制
*@param  :PID結構體變數地址,當前實際值
*@retval : 期望輸出值
*************************************************/
int32_t Inc_Pid_Ctrl(PID *pid,float Cur_Value)
{
    pid->Error=pid->SetValue-Cur_Value; //計算偏差
    pid->ActualValue +=(pid->Kp*(pid->Error-pid->LastError))//比例環節
    +(pid->Ki*(pid->Error))//積分環節
    +(pid->Kd*(pid->Error-2*pid->LastError+pid->PreError));//微分環節 
    pid->PreError=pid->LastError;//儲存偏差,進行下次計算                                                             
    pid->LastError=pid->Error;                                                            	
    return ((int32_t)pid->ActualValue); //返回計算值
}