2023年pid十大算法c語言實(shí)現(xiàn)優(yōu)質(zhì)

字號:

    范文為教學(xué)中作為模范的文章,也常常用來指寫作的模板。常常用于文秘寫作的參考,也可以作為演講材料編寫前的參考。大家想知道怎么樣才能寫一篇比較優(yōu)質(zhì)的范文嗎?下面是小編幫大家整理的優(yōu)質(zhì)范文,僅供參考,大家一起來看看吧。
    pid十大算法c語言實(shí)現(xiàn)篇一
    c語言實(shí)習(xí)總結(jié)
    推薦度:
    c語言程序設(shè)計(jì)的實(shí)驗(yàn)報(bào)告
    推薦度:
    c語言課程設(shè)計(jì)個人總結(jié)
    推薦度:
    c語言程序設(shè)計(jì)實(shí)驗(yàn)報(bào)告
    推薦度:
    c語言程序設(shè)計(jì)心得體會
    推薦度:
    相關(guān)推薦
    積分飽和通俗講就是系統(tǒng)在一個偏差方向上的飽和,下面一起來跟著小編學(xué)習(xí)一下pid算法的c語言實(shí)現(xiàn)方法吧,希望可以幫助到大家!
    比如一個系統(tǒng)設(shè)定了輸出不會超過100,但因?yàn)槌霈F(xiàn)一個方向上的偏差積分使得輸出超過了100,此時達(dá)到了飽和狀態(tài),如果繼續(xù)在這個方向上積分會導(dǎo)致pid控制超過100系統(tǒng)卻運(yùn)行在100,相當(dāng)于積分調(diào)節(jié)對系統(tǒng)輸出沒有作用,就出現(xiàn)失控的狀態(tài),這是系統(tǒng)不能接受的,而且飽和積分越深,退出飽和就越久。上面是在正向的飽和,負(fù)向的飽和類似!
    為了解決這個問題,我們采用抗積分飽和算法,其思路就是:如果上一次的輸出控制量超過了飽和值,飽和值為正,則這一次只積分負(fù)的偏差,飽和值為負(fù),則這一次只積分正的偏差,從而避免系統(tǒng)長期留在飽和區(qū)!
    下面我以 位置型+抗積分飽和+控制算法c語言來觀察調(diào)節(jié)結(jié)果:(相對應(yīng)的代碼可以參考以往的文章)
    //位置型+抗積分飽和+積分分離 pid控制算法
    struct _pid{
    float setspeed;
    float actualspeed;
    float err;
    float err_last;
    float kp,ki,kd;
    float voltage;
    float integral;
    float umax; //最大正飽和上限值
    float umin; //最大負(fù)飽和下限值
    }pid;
    void pid_init(void)
    {
    printf("pid_init begin! ");
    ed = 0;
    speed = 0;
    = 0;
    _last = 0;
    = 0.2;
    = 0.1; //增大了積分環(huán)節(jié)的值
    = 0.2;
    e = 0;
    al = 0;
    = 400; //正飽和值為400
    = -200; //負(fù)飽和值為-200
    printf("pid_init end! ");
    }
    float pid_cal(float speed)
    {
    unsigned char index;
    ed = speed;
    = ed - speed;
    if(speed>) //如果上一次輸出變量出現(xiàn)正向的飽和
    {
    if(abs()>200)
    {
    index = 0;
    }
    else
    {
    index = 1;
    if(<0)
    {
    al += ; //正飽和只積分負(fù)偏差
    }
    }
    }
    else if(speed {
    if(abs()>200)
    {
    index = 0;
    }
    else
    {
    index = 1;
    if(>0)
    {
    al += ; //負(fù)飽和只積分正偏差
    }
    }
    }
    else
    {
    if(abs()>200) //積分分離的pid優(yōu)化,可參考以往的文章
    {
    index = 0;
    }
    else
    {
    index = 1;
    al += ;
    }
    }
    e = * +index**al + *( - _last);
    _last = ;
    speed = e*1.0;
    return speed;
    }
    int main(void)
    {
    int count = 0 ;
    printf("system begin! ");
    pid_init();
    while(count<1000)
    {
    float speed = pid_cal(200.0);
    printf("-%d-%f-",count,speed);
    count++;
    }
    return 0;
    }
    最后運(yùn)行結(jié)果:
    我們發(fā)現(xiàn),相對以往的算法,還算法大大提高了調(diào)節(jié)的速度和穩(wěn)定!
    s("content_relate");
    【pid算法的c語言實(shí)現(xiàn)】相關(guān)文章:
    pid算法的c語言實(shí)現(xiàn):抗積分飽和的pid優(yōu)化
    10-05
    c語言中實(shí)現(xiàn)kmp算法實(shí)例
    11-19
    希爾排序算法的c語言實(shí)現(xiàn)示例
    10-04
    c語言實(shí)現(xiàn)歸并排序算法實(shí)例
    11-21
    6種常見的排序算法的c語言實(shí)現(xiàn)
    10-04
    c語言的排序算法
    10-05
    kmp算法的c#實(shí)現(xiàn)方法
    09-22
    c語言排序的幾種算法
    10-03
    c#實(shí)現(xiàn)輪詢算法實(shí)例代碼
    09-23