**一、什麼是PID** 學過自動控制原理的對PID並不陌生,PID控制是對偏差信號e(t)進行比例、積分和微分運算變換後形成的一種控制規律。PID 演算法的一般形式: ![](https://img2023.cnblogs.com/blog/2776504/202305/2776504-202305 ...
一、什麼是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); //返回計算值
}