<delect id="sj01t"></delect>
  1. <em id="sj01t"><label id="sj01t"></label></em>
  2. <div id="sj01t"></div>
    1. <em id="sj01t"></em>

            <div id="sj01t"></div>
            C語言

            PID算法的C語言實現

            時間:2025-02-24 16:56:27 C語言 我要投稿

            PID算法的C語言實現

              積分飽和通俗講就是系統在一個偏差方向上的飽和,下面一起來跟著小編學習一下PID算法的C語言實現方法吧,希望可以幫助到大家!

              比如一個系統設定了輸出不會超過100,但因為出現一個方向上的偏差積分使得輸出超過了100,此時達到了飽和狀態,如果繼續在這個方向上積分會導致PID控制超過100系統卻運行在100,相當于積分調節對系統輸出沒有作用,就出現失控的狀態,這是系統不能接受的,而且飽和積分越深,退出飽和就越久。上面是在正向的飽和,負向的飽和類似!

              為了解決這個問題,我們采用抗積分飽和算法,其思路就是:如果上一次的輸出控制量超過了飽和值,飽和值為正,則這一次只積分負的偏差,飽和值為負,則這一次只積分正的偏差,從而避免系統長期留在飽和區!

              下面我以 位置型+抗積分飽和+積分分離的PID控制算法C語言來觀察調節結果:(相對應的代碼可以參考以往的文章)

              //位置型+抗積分飽和+積分分離 PID控制算法

              struct _pid{

              float SetSpeed;

              float ActualSpeed;

              float Err;

              float Err_Last;

              float Kp,Ki,Kd;

              float Voltage;

              float Integral;

              float Umax; //最大正飽和上限值

              float Umin; //最大負飽和下限值

              }pid;

              void PID_Init(void)

              {

              printf("PID_Init begin! ");

              pid.SetSpeed = 0;

              pid.ActualSpeed = 0;

              pid.Err = 0;

              pid.Err_Last = 0;

              pid.Kp = 0.2;

              pid.Ki = 0.1; //增大了積分環節的值

              pid.Kd = 0.2;

              pid.Voltage = 0;

              pid.Integral = 0;

              pid.Umax = 400; //正飽和值為400

              pid.Umin = -200; //負飽和值為-200

              printf("PID_Init end! ");

              }

              float PID_Cal(float Speed)

              {

              unsigned char index;

              pid.SetSpeed = Speed;

              pid.Err = pid.SetSpeed - pid.ActualSpeed;

              if(pid.ActualSpeed>pid.Umax) //如果上一次輸出變量出現正向的飽和

              {

              if(abs(pid.Err)>200)

              {

              index = 0;

              }

              else

              {

              index = 1;

              if(pid.Err<0)

              {

              pid.Integral += pid.Err; //正飽和只積分負偏差

              }

              }

              }

              else if(pid.ActualSpeed {

              if(abs(pid.Err)>200)

              {

              index = 0;

              }

              else

              {

              index = 1;

              if(pid.Err>0)

              {

              pid.Integral += pid.Err; //負飽和只積分正偏差

              }

              }

              }

              else

              {

              if(abs(pid.Err)>200) //積分分離的PID優化,可參考以往的文章

              {

              index = 0;

              }

              else

              {

              index = 1;

              pid.Integral += pid.Err;

              }

              }

              pid.Voltage = pid.Kp*pid.Err +index*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(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;

              }

              最后運行結果:

              我們發現,相對以往的算法,還算法大大提高了調節的速度和穩定!

            【PID算法的C語言實現】相關文章:

            PID算法的C語言實現:抗積分飽和的PID優化02-20

            C語言中實現KMP算法實例08-09

            C語言實現魔方陣算法02-13

            C語言實現歸并排序算法02-04

            希爾排序算法的C語言實現示例02-06

            6種常見的排序算法的C語言實現06-18

            C語言實現歸并排序算法實例03-19

            c#實現sunday算法實例08-07

            KMP算法的C#實現方法04-11

            <delect id="sj01t"></delect>
            1. <em id="sj01t"><label id="sj01t"></label></em>
            2. <div id="sj01t"></div>
              1. <em id="sj01t"></em>

                      <div id="sj01t"></div>
                      黄色视频在线观看