PID的C语言实现进阶

梯形积分的PID控制算法 C语言实现(不常用)

PID控制的积分项,其作用为消除余差。为尽量减小余差,应提高积分项运算精度,于是可以将矩形积分改为梯形积分,积分环的公式如下

梯形积分的PID积分环公式

该算法的PID实现为

pid.voltage=pid.Kp*pid.err+index*pid.Ki*pid.integral/2+pid.Kd*(pid.er
r-pid.err_last);

其他代码(参数定义赋值测试代码)与位置型和增量型一致。

变积分的PID控制算法C语言实现

变积分PID可以看成积分分离PID的跟一般的形式。一般的PID算法中Ki为常数,但是在整个系统中对于积分项的要求是,系统偏差大时,Ki应该减弱,而系统偏差大时,Ki应该增强。因此变积分是有必要的。
该算法的基本思想是设法改变积分项的累加速度,使其与偏差大小相对应。实现方法为
给积分系数前加上一个比例值 index:
当 abs(err)<180 时,index=1;
当 180<abs(err)<200 时,index=(200-abs(err))/20;
当 abs(err)>200 时,index=0;
最终的比例环节的比例系数值为 ki*index;


......
pid.Kp=0.4;
pid.Ki=0.2; //增加了积分系数
pid.Kd=0.2;
......
float PID_realize(float speed){
float index;
pid.SetSpeed=speed;
pid.err=pid.SetSpeed-pid.ActualSpeed;
if(abs(pid.err)>200) //变积分过程
{
index=0.0;
}else if(abs(pid.err)<180){
index=1.0;
pid.integral+=pid.err;
}else{
index=(200-abs(pid.err))/20;
pid.integral+=pid.err;
}
pid.voltage=pid.Kp*pid.err+index*pid.Ki*pid.integral+pid.Kd*(p
id.err-pid.err_last);
pid.err_last=pid.err;
pid.ActualSpeed=pid.voltage*1.0;
return pid.ActualSpeed;
}

其他代码(参数定义赋值测试代码)与位置型和增量型一致。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值