PID控制是一種線性控制,它將給定值r(t)與實際輸出值y(t)的偏差的比例(P)、積分(I)、微分(D)通過線性組合形成控制量,對被控對象進行控制。
PID控制的微分方程為:

y(t)——系統的輸出;
n(t)——給定值;
e(t)——控制的輸入,即偏差:e(t)=n(t)-y(t)被控量與給定值的偏差;
u(t)——控制的輸出;


#include <stdio.h>
// 第一步:定義PID變量結構體,控制算法中所需要用到的參數在一個結構體中統一定義,方便后面的使用。
//代碼如下:
struct _pid
{
float SetSpeed; //定義設定值
float ActualSpeed; //定義實際值
float err; //定義偏差值
float err_last; //定義上一個偏差值
float Kp,Ki,Kd; //定義比例、積分、微分系數
float voltage; //定義電壓值(控制執行器的變量)
float integral; //定義積分值
}pid;
// 第二部:初始化變量,統一初始化變量,尤其是Kp,Ki,Kd三個參數,調試過程當中,對於要求的控制效果,可以通過調節這三個量直接進行調節。
//代碼如下:
void PID_init()
{
printf("PID_init Begin \n");
pid.SetSpeed = 0.0;
pid.ActualSpeed = 0.0;
pid.err = 0.0;
pid.err_last = 0.0;
pid.voltage = 0.0;
pid.integral = 0.0;
pid.Kp = 0.2;
pid.Ki = 0.015;
pid.Kd = 0.2;
printf("PID_init End \n");
}
// 第三步:編寫控制算法,這里用了最基本的算法實現形式,沒有考慮死區問題,沒有設定上下限,只是對公式的一種直接的實現,后面的介紹當中還會逐漸的對此改進。,
//代碼如下:
float PID_realize(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()
{
printf("System Begin \n");
PID_init();
int count=0;
while(count < 1000)
{
float speed = PID_realize(200.0);
printf("%f\n",speed);
count++;
}
+printf("PID_init End \n");
return 0;
}