博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PID算法(C语言)
阅读量:5172 次
发布时间:2019-06-13

本文共 4981 字,大约阅读时间需要 16 分钟。

/************  PID算法(C语言)  ************/  #include 
  #include
    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++;    }   }

 

转载于:https://www.cnblogs.com/gaohongchen01/p/3700018.html

你可能感兴趣的文章
_itoa_s替换 itoa
查看>>
面试问题
查看>>
Jmeter-【JSON Extractor】-响应结果中一级key取值
查看>>
mysql建库
查看>>
bzoj1066: [SCOI2007]蜥蜴
查看>>
jQuery自定义右键菜单
查看>>
mybatis实现延迟加载多对一
查看>>
JS拖拽,移动与拉伸
查看>>
Linux资源站
查看>>
操作Visual Studio 2010中的SQL Server数据库比较工具
查看>>
windows命令行快速启动软件
查看>>
查看修改apk里resources.arsc的资源文件的工具
查看>>
如何用adb链接手机,并异常情况下的处理(转)
查看>>
对象行为型 - Observer观察者模式
查看>>
ubuntu 19.04 + lenovo-xiaoxin-I2000 触摸板右键单击无法使用
查看>>
layui日期输入框
查看>>
poi 和jxl导出excel(2)
查看>>
javascript时间戳转换成yyyy-MM-DD格式
查看>>
2059 mysql
查看>>
service XXX does not support chkconfig
查看>>