一、什麼是PID
學過自動控制原理的對PID並不陌生,PID控制是對偏差訊號e(t)進行比例、積分和微分運算變換後形成的一種控制規律。PID 演演算法的一般形式:
二、PID離散化
對PID連續系統離散化,從而方便在處理器上實現,PID 離散表示形式:
離散化後最終得到位置式PID:
u(k)為控制器輸出的控制量;(輸出)
e(k)為偏差訊號,它等於給定量與輸出量之差;(輸入)
Kp 為比例係數;
Ti 為積分時間常數;
Td 為微分時間常數。
1. 位置式PID公式
2. 增量式PID公式
三、兩種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); //返回計算值
}