正文

PID控制C源程序2006-05-05 15:59:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/vfdff/13584.html

分享到:

PID控制C源程序   BC31 TC30 编译过,可运行。      #include <stdio.h>  #include<math.h>    struct _pid {   int pv; /*integer that contains the process value*/   int sp; /*integer that contains the set point*/   float integral;   float pgain;   float igain;   float dgain;   int deadband;   int last_error;  };    struct _pid warm,*pid;  int process_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 process variable and the setpoint. *pv and *sp are   integer pointers.   ------------------------------------------------------------------------*/   void pid_init(struct _pid *warm, int process_point, int set_point)  {    struct _pid *pid;       pid = warm;    pid->pv = process_point;    pid->sp = 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->pgain = p_gain;    pid->igain = i_gain;    pid->dgain = d_gain;    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_bumpless     DESCRIPTION Bumpless transfer 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 process value in *pv should   be the updated just before this function is used.   ------------------------------------------------------------------------*/   void pid_bumpless(struct _pid *pid)   {      pid->last_error = (pid->sp)-(pid->pv);      }     /*------------------------------------------------------------------------   pid_calc     DESCRIPTION Performs PID calculations 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 consistent 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->sp) - (pid->pv);    if (abs(err) > pid->deadband)    {    ferror = (float) err; /*do integer to float conversion only once*/    pterm = pid->pgain * 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->dgain;    result = pterm + pid->integral + dterm;    }    else result = pid->integral;    pid->last_error = err;    return (result);   }      void main(void)  {   float display_value;   int count=0;     pid = &warm;    // printf("Enter the values of Process point, Set point, P gain, I gain, D gain \n");  // scanf("%d%d%f%f%f", &process_point, &set_point, &p_gain, &i_gain, &d_gain);         process_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 Process point, Set point, P gain, I gain, D gain \n");   printf(" %6d %6d %4f %4f %4f\n", process_point, set_point, p_gain, i_gain, d_gain);     printf("Enter the values of Process point\n");     while(count<=20)   {         scanf("%d",&process_point);     pid_init(&warm, process_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 input value for process point   pid_bumpless(&warm);     // how to display output   display_value = pid_calc(&warm);    printf("%f\n", display_value);    //printf("\n%f%f%f%f",warm.pv,warm.sp,warm.igain,warm.dgain);    count++;       }     }  http://blog.21ic.com/more.asp?name=cxjr&id=15012

阅读(8432) | 评论(4)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册