标题: PID 算法(c语言)
molpp
游客




UID 12
精华 0
积分 7078
帖子 7078
威望 0
金钱 0
阅读权限 1
注册 2007-7-13
状态 离线
发表于 2007-7-13 16:34  资料  短消息  加为好友 

PID 算法(c语言)

BC31 TC30 编译过,可运行。      #include &;lt tdio.h>  #include<math.h>    struct _pid {          int pv; /*integer that contai  the proce  value*/          int   /*integer that contai  the set point*/          float integral;          float pgai           float igai           float dgai           int deadband;          int last_error;  };    struct _pid warm,*pid;  int proce _point, set_point,dead_band;   float p_gain, i_gain, d_gain, integral_val,new_integ          /*------------------------------------------------------------------------   pid_init     DESCRIPTION This function initializes the pointers in the _pid structure   to the proce  variable and the setpoint. *pv and *  are   integer pointers.   ------------------------------------------------------------------------*/   void pid_init(struct _pid *warm, int proce _point, int set_point)  {           struct _pid *pid;                     pid = warm;           pid-&;gt v = proce _point;           pid-&;gt  = set_point;   }       /*------------------------------------------------------------------------   pid_tune     DESCRIPTION Sets the proportional gain (p_gain), integral gain (i_gain),   derivitive gain (d_gain), and the dead band (dead_band) of   a pid control structure _pid.   ------------------------------------------------------------------------*/     void pid_tune(struct _pid *pid, float p_gain, float i_gain, float d_gain, int dead_band)   {           pid-&;gt gain = p_gai            pid->igain = i_gai            pid->dgain = d_gai            pid->deadband = dead_band;           pid->integral= integral_val;           pid->last_error=0;   }     /*------------------------------------------------------------------------   pid_setinteg     DESCRIPTION Set a new value for the integral term of the pid equation.   This is useful for setting the initial output of the   pid controller at start up.   ------------------------------------------------------------------------*/   void pid_setinteg(struct _pid *pid,float new_integ)  {           pid->integral = new_integ;           pid->last_error = 0;   }     /*------------------------------------------------------------------------   pid_bumple      DESCRIPTION Bumple  tra fer algorithim. When suddenly changing   setpoints, or when restarting the PID equation after an   extended pause, the derivative of the equation can cause   a bump in the controller output. This function will help   smooth out that bump. The proce  value in *pv should   be the updated just before this function is used.   ------------------------------------------------------------------------*/   void pid_bumple (struct _pid *pid)   {             pid->last_error = (pid-&;gt )-(pid-&;gt v);             }     /*------------------------------------------------------------------------   pid_calc     DESCRIPTION Performs PID calculatio  for the _pid structure *a. This function uses the positional form of the pid equation, and incorporates an integral windup prevention algorithim. Rectangular integration is used, so this function must be repeated on a co istent time basis for accurate control.     RETURN VALUE The new output value for the pid loop.     USAGE #include "control.h"*/       float pid_calc(struct _pid *pid)  {           int err;          float pterm, dterm, result, ferror;                     err = (pid-&;gt ) - (pid-&;gt v);           if (a (err) > pid->deadband)           {                   ferror = (float) err; /*do integer to float conversion only once*/                   pterm = pid-&;gt gain * ferror;                   if (pterm > 100 || pterm < -100)                  {                          pid->integral = 0.0;                   }                  else                   {                           pid->integral  = pid->igain * ferror;                           if (pid->integral > 100.0)                           {                                  pid->integral = 100.0;                           }                          else if (pid->integral < 0.0) pid->integral = 0.0;                   }                   dterm = ((float)(err - pid->last_error)) * pid->dgai                    result = pterm   pid->integral   dterm;           }           else result = pid->integral;           pid->last_error = err;           return (result);   }      void main(void)  {          float di lay_value;          int count=0;            pid = &;warm;    //        printf("Enter the values of Proce  point, Set point, P gain, I gain, D gain \n");  //        scanf("%d%d%f%f%f",  roce _point,  et_point,  _gain, &;i_gain, &;d_gain);                proce _point = 30;          set_point = 40;          p_gain = (float)(5.2);          i_gain = (float)(0.77);          d_gain = (float)(0.18);                dead_band = 2;          integral_val =(float)(0.01);              printf("The values of Proce  point, Set point, P gain, I gain, D gain \n");          printf(" m m O O O\n", proce _point, set_point, p_gain, i_gain, d_gain);            printf("Enter the values of Proce  point\n");            while(count<=20)          {                scanf("%d", roce _point);            pid_init(&;warm, proce _point, set_point);          pid_tune(&;warm, p_gain,i_gain,d_gain,dead_band);          pid_setinteg(&;warm,0.0);        //pid_setinteg(&;warm,30.0);            //Get i ut value for proce  point          pid_bumple (&;warm);                    // how to di lay output                  di lay_value = pid_calc(&;warm);                   printf("%f\n", di lay_value);                   //printf("\n%f%f%f%f",warm.pv,warm. ,warm.igain,warm.dgain);                   count  ;                     }     }

顶部
[广告]
 


Google

当前时区 GMT+8, 现在时间是 2008-10-8 19:04
粤ICP备07500170号

By Discuz! 5.5.0 © 2007-2008
Processed in 0.060294 second(s), 6 queries , Gzip enabled

清除 Cookies - 联系我们 - Autooo! Inc. - Archiver - 繁体中文