0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

PID參數(shù)整定實際調參

麥辣雞腿堡 ? 來源:古月居 ? 作者:行走的皮卡丘 ? 2023-11-14 17:40 ? 次閱讀

實際調參

從實際的 PID 系統(tǒng)曲線來理解 PID 各個系數(shù)的調節(jié)效果。

① 先調整比例系數(shù),積分、微分系數(shù)設置為 0,此時的系統(tǒng)只有比例環(huán)節(jié)參與控制,此時系統(tǒng)的曲線出現(xiàn)大幅振蕩。

圖片

圖片

首先確定硬件上是否出現(xiàn)了故障,例如電壓不穩(wěn)定、電機堵轉等,排除了這些之后,那就說明比例系數(shù)調節(jié)的過大了,這個時候我們可以把比例系數(shù)慢慢地減小,并同時觀察曲線的變化。

② 當我們調小比例系數(shù)之后,曲線的大幅度振蕩現(xiàn)象消失,但是曲線依舊存在小幅度的超調現(xiàn)象,并且此時通過調節(jié)比例系數(shù)已經無法優(yōu)化曲線。

圖片

此時,我們可以慢慢地增大微分系數(shù),并同時觀察曲線的變化,從而找到最合適的參數(shù)

增大微分系數(shù)之后,如果系統(tǒng)的曲線已經較為理想,則說明這個系統(tǒng)只需要比例和微分環(huán)節(jié)的控制。

③ 如果在純比例環(huán)節(jié)的控制下,系統(tǒng)的實際值始終達不到目標值,存在靜態(tài)誤差。

圖片

圖片

此時,可以逐漸增大積分系數(shù),并同時觀察曲線的變化,如果消除靜差的時間過長,則可以再適當增大積分系數(shù),但是需要注意兼顧系統(tǒng)的超調量。

經過調整之后,如果系統(tǒng)的曲線已經較為理想,則說明這個系統(tǒng)只需要比例和積分環(huán)節(jié)的控制。

④ 如果系統(tǒng)在比例和積分環(huán)節(jié)的控制下出現(xiàn)小幅度的超調現(xiàn)象,可以慢慢地增大微分系數(shù),并同時觀察曲線的變化,從而找到最合適的參數(shù)。

以上就是在實際調參中經常遇到的一些問題以及解決方法。在實際應用中,控制系統(tǒng)是多樣且復雜的,這一些方法只能作為參考,并不是通用的,因此在 PID 調參過程中,要注意經驗的積累。

參考Code

PID初始化代碼

定義一個新的PID參數(shù)時,就是建立一個新的結構體,運算和初始化時直接調用對應的成員變量就行,十分方便簡潔,具體定義的結構體如下:

typedef struct{
    //PID運算模式
    uint8_t mode;
    //PID 三個基本參數(shù)
    __IO float Kp;
    __IO float Ki;
    __IO float Kd;


    __IO float max_out;  //PID最大輸出
    __IO float max_iout; //PID最大積分輸出


    __IO float2 set;      //PID目標值
    __IO float2 fdb;      //PID當前值


    __IO float out;        //三項疊加輸出
    __IO float Pout;        //比例項輸出
    __IO float Iout;        //積分項輸出
    __IO float Dout;        //微分項輸出
    //微分項最近三個值 0最新 1上一次 2上上次
    __IO float Dbuf[3];  
    //誤差項最近三個值 0最新 1上一次 2上上次
    __IO float error[3];  


} pid_type_def;

初始運行時調用一次,初始化各個參數(shù)

void Own_PID_init(pid_type_def *pid, uint8_t mode, const __IO float PID[3], __IO float max_out, __IO float max_iout){
    if (pid == NULL || PID == NULL){
        return;
    }
    pid- >mode = mode;
    pid- >Kp = PID[0];
    pid- >Ki = PID[1];
    pid- >Kd = PID[2];
    pid- >max_out = max_out;
    pid- >max_iout = max_iout;
    pid- >Dbuf[0] = pid- >Dbuf[1] = pid- >Dbuf[2] = 0.0f;
    pid- >error[0] = pid- >error[1] = pid- >error[2] = pid- >Pout = pid- >Iout = pid- >Dout = pid- >out = 0.0f;
}

圖片

PID運算代碼

__IO float PID_calc(pid_type_def *pid, __IO float ref, __IO float set)
{
    //判斷傳入的PID指針不為空
    if (pid == NULL){
        return 0.0f;
    }
    //存放過去兩次計算的誤差值
    pid- >error[2] = pid- >error[1];
    pid- >error[1] = pid- >error[0];
    //設定目標值和當前值到結構體成員
    pid- >set = set;
    pid- >fdb = ref;
    //計算最新的誤差值
    pid- >error[0] = set - ref;
    //判斷PID設置的模式
    if (pid- >mode == PID_POSITION)
    {
        //位置式PID
        //比例項計算輸出
        pid- >Pout = pid- >Kp * pid- >error[0];
        //積分項計算輸出
        pid- >Iout += pid- >Ki * pid- >error[0];
        //存放過去兩次計算的微分誤差值
        pid- >Dbuf[2] = pid- >Dbuf[1];
        pid- >Dbuf[1] = pid- >Dbuf[0];
        //當前誤差的微分用本次誤差減去上一次誤差來計算
        pid- >Dbuf[0] = (pid- >error[0] - pid- >error[1]);
        //微分項輸出
        pid- >Dout = pid- >Kd * pid- >Dbuf[0];
        //對積分項進行限幅
        LimitMax(pid- >Iout, pid- >max_iout);
        //疊加三個輸出到總輸出
        pid- >out = pid- >Pout + pid- >Iout + pid- >Dout;
        //對總輸出進行限幅
        LimitMax(pid- >out, pid- >max_out);
    }
    else if (pid- >mode == PID_DELTA)
    {
        //增量式PID
        //以本次誤差與上次誤差的差值作為比例項的輸入帶入計算
        pid- >Pout = pid- >Kp * (pid- >error[0] - pid- >error[1]);
        //以本次誤差作為積分項帶入計算
        pid- >Iout = pid- >Ki * pid- >error[0];
        //迭代微分項的數(shù)組
        pid- >Dbuf[2] = pid- >Dbuf[1];
        pid- >Dbuf[1] = pid- >Dbuf[0];
        //以本次誤差與上次誤差的差值減去上次誤差與上上次誤差的差值作為微分項的輸入帶入計算
        pid- >Dbuf[0] = (pid- >error[0] - 2.0f * pid- >error[1] + pid- >error[2]);
        pid- >Dout = pid- >Kd * pid- >Dbuf[0];
        //疊加三個項的輸出作為總輸出
        pid- >out += pid- >Pout + pid- >Iout + pid- >Dout;
        //對總輸出做一個先限幅
        LimitMax(pid- >out, pid- >max_out);
    }
    return pid- >out;
}
#define LimitMax(input, max)   
{                          
    if (input > max)       
    {                      
        input = max;       
    }                      
    else if (input < -max) 
    {                      
        input = -max;      
    }                      
}

PID數(shù)據清空代碼

有時候需要清除中間變量,例如目標值和中間變量清零。

void PID_clear(pid_type_def *pid)
{
    if (pid == NULL)
    {
        return;
    }
    //當前誤差清零
    pid- >error[0] = pid- >error[1] = pid- >error[2] = 0.0f;
    //微分項清零
    pid- >Dbuf[0] = pid- >Dbuf[1] = pid- >Dbuf[2] = 0.0f;
    //輸出清零
    pid- >out = pid- >Pout = pid- >Iout = pid- >Dout = 0.0f;
    //目標值和當前值清零
    pid- >fdb = pid- >set = 0.0f;
}
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 控制系統(tǒng)

    關注

    41

    文章

    6419

    瀏覽量

    110098
  • 硬件
    +關注

    關注

    11

    文章

    3113

    瀏覽量

    65851
  • PID
    PID
    +關注

    關注

    35

    文章

    1466

    瀏覽量

    84840
收藏 人收藏

    評論

    相關推薦

    關于溫度控制的PID參數(shù)問題

    這種情況是怎么回事;求教下相關PID參數(shù)方法,涉及到溫度控制方面的。另外通過Autotunning PID
    發(fā)表于 05-05 16:20

    干貨|最經典的PID參數(shù)教程

    調節(jié)器YR-GFD和人工智能調節(jié)器YR-GND具有先進的PID控制算法和自功能,使用者啟動儀表自功能后,不需要人工干預就可以自動算出
    發(fā)表于 12-26 21:40

    PID參數(shù)的方法

    時Dout會有非常尖的尖峰,這時就要對delError進行限幅。在PID調節(jié)中,不允許出現(xiàn)很大的尖峰?! ≌{好D后,NowVal會很好的跟隨TargetVal的變化而變化?! ∪?、看圖參數(shù)
    發(fā)表于 06-23 14:54

    STM32電機的PID參數(shù)

    如何去實現(xiàn)STM32電機的PID參數(shù)?如何去編寫STM32電機的PID參數(shù)
    發(fā)表于 09-23 08:07

    PID調的相關資料分享

    說明:本文章適用于STM32初學者,想完成一個好玩且有深度的項目但不知道從何下手的同學。PID調是平衡車的精髓所在,參數(shù)
    發(fā)表于 01-14 09:14

    PID參數(shù)方法的研究

    PID參數(shù)方法的研究-2009,下來看看。
    發(fā)表于 03-31 17:01 ?20次下載

    基于MATLAB_SimuIink的PID參數(shù)

    基于MATLABSimuIink的PID參數(shù)-2009
    發(fā)表于 03-31 17:46 ?12次下載

    PID參數(shù)方法及其應用研究

    PID教程之PID參數(shù)方法及其應用研究
    發(fā)表于 09-01 15:01 ?0次下載

    PID控制最通俗的解釋與PID參數(shù)方法

    PID控制最通俗的解釋與PID參數(shù)方法
    發(fā)表于 01-04 14:47 ?42次下載

    增量式pid分析及參數(shù)

    PID算法是工程控制領域常用的一種算法,其有著技術成熟,不需要建立數(shù)學模型,參數(shù)靈活,適用性強,魯棒性強,控制效果好等優(yōu)點,得到了廣泛的應用,其
    發(fā)表于 11-24 16:27 ?1.6w次閱讀
    增量式<b class='flag-5'>pid</b>分析及<b class='flag-5'>參數(shù)</b><b class='flag-5'>整</b><b class='flag-5'>定</b>

    基于MATLAB的PID\PID參數(shù)方法概述

    PID控制是最早發(fā)展起來的控制策略之一,因為它所涉及的設計算法和控制結構都很簡單,因此,被廣泛應用于過程控制和運動控制中。但在實際系統(tǒng)設計過程中,設計師經常受到參數(shù)
    發(fā)表于 11-24 16:42 ?3.7w次閱讀
    基于MATLAB的<b class='flag-5'>PID</b>\<b class='flag-5'>PID</b><b class='flag-5'>參數(shù)</b>自<b class='flag-5'>整</b><b class='flag-5'>定</b>方法概述

    PID控制參數(shù)的原理和的的計算方法PID參數(shù)的方法和概述

    PID是比例、積分、微分的簡稱,PID控制的難點不是編程,而是控制器的參數(shù)。參數(shù)
    發(fā)表于 05-31 08:40 ?44次下載
    <b class='flag-5'>PID</b>控制<b class='flag-5'>參數(shù)</b>的原理和<b class='flag-5'>整</b><b class='flag-5'>定</b>的的計算方法<b class='flag-5'>整</b><b class='flag-5'>定</b><b class='flag-5'>PID</b><b class='flag-5'>參數(shù)</b>的方法和概述

    數(shù)字PID及其參數(shù)方法

    數(shù)字PID及其參數(shù)方法介紹。
    發(fā)表于 05-31 16:34 ?27次下載

    PID參數(shù)簡介

    PID參數(shù)資料免費下載。
    發(fā)表于 06-01 10:36 ?31次下載

    PID參數(shù)試湊法介紹

    。 工程定法:依靠工程經驗,直接在控制系統(tǒng)的試驗中進行,此方法易于掌握,在實際調中被廣泛
    的頭像 發(fā)表于 11-14 17:21 ?1434次閱讀
    <b class='flag-5'>PID</b><b class='flag-5'>參數(shù)</b><b class='flag-5'>整</b><b class='flag-5'>定</b>試湊法介紹