PID控制算法的C语言实现(四)

增量型PID的C语言实现

上一节中介绍了最简单的位置型 PID 的实现手段,这一节主要讲解增量式PID 的实现方法,位置型和增量型 PID 的数学公式请参见个人系列文《PID 控制算法的 C 语言实现二》中的讲解。实现过程仍然是分为定义变量、初始化变量、实现控制算法函数、算法测试四个部分,详细分类请参加《PID 控制算法的 C 语言实现三》中的讲解,这里直接给出代码了。算法

struct _pid{
	    float SetSpeed;   //定义设定值
		  float ActualSpeed;//定义实际值
	    float err;        //定义误差值
	    float err_last;   //定义上一个误差值
		  float err_past;   //定义前一个误差值
	    float Kp,Ki,Kd;   //定义比例、积分、微分系数
	    float voltage;    //定义电压值(控制执行器变量)
	    float integral;	  //定义积分值
	
	      int index;     // 积分分离时的变量
	    float umax;      //积分极限
	    float umin;
     }pid;	

		 
void PID_init()    //pid变量初始化
{
  printf("PID_init begin \n");
  pid.SetSpeed = 0.0;
	pid.ActualSpeed = 0.0;
	pid.err = 0.0;
	pid.err_last = 0.0;
  pid.err_past = 0.0;
	pid.voltage = 0.0;
	pid.integral = 0.0;
	pid.Kp = 0.4;
	pid.Ki = 0.2;
	pid.Kd = 0.2;
	pid.umax = 400;
	pid.umin = -200;
  printf("PID_init end \n");
 }
//增量型PID算法 
//结果和最近三次的偏差有关,,输出=U(K)+增量调节值
float PID_realize2(float speed)
{
  pid.SetSpeed = speed;
	pid.err = pid.SetSpeed - pid.ActualSpeed;
	
	float incrementSpeed = pid.Kp * (pid.err - pid.err_last)+ pid.Ki * pid.err 
	                       + pid.Kd * (pid.err - 2 * pid.err_last + pid.err_past);//电压
	pid.ActualSpeed += incrementSpeed;
	pid.err_past = pid.err_last;
	pid.err_last = pid.err;

  return pid.ActualSpeed;
 }

实验数据以下:函数

83.000000  11.555000  59.559677  28.175406  52.907425  38.944149  51.891701  46.141655  53.339050
51.510002  55.908447  55.944637  58.970676  59.882942  62.224998  63.537247  65.527702  .......
199.999359  199.999374  199.999374  199.999390  199.999390  199.999405  199.999405  199.999420
199.999420  199.999435  199.999435  199.999451  199.999451  199.999466  199.999466  199.999481
199.999481  199.999496  199.999496  199.999512  199.999512
相关文章
相关标签/搜索