PID控制


PID控制是一種線性控制,它將給定值r(t)與實際輸出值y(t)的偏差的比例(P)、積分(I)、微分(D)通過線性組合形成控制量,對被控對象進行控制。
PID控制的微分方程為:
y(t)——系統的輸出;
n(t)——給定值;
e(t)——控制的輸入,即偏差:e(t)=n(t)-y(t)被控量與給定值的偏差;
u(t)——控制的輸出;
 ——比例系數;
 ——積分時間常數;
 ——微分時間常數;  [1] 
 
 
#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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM