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

 

转载于:https://my.oschina.net/u/3955129/blog/2049845

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值