PID

PID:就是比例(P),积分(I),微分(D)控制器。
自己的理解:P是对当前误差的处理,I是对过去误差的处理,D是对将来误差的处理,将过去现在和未来综合考虑就会跟我们一个更好的输出不是么。
仔细的解释:对于P,把就是简单的加了一个比例系数,比如我们要的是20,当前是10,误差为10=20-10,如果P的设定较小为0.1,收敛的很慢而且只能逼近目标值,不可能到达目标值,另外一些干扰有可能会消除小P的影响,如果P太大,不稳定,并且因为物体有滞后现象,所以不可能达到目标值,所谓的滞后,比如四轴飞行器,我们给电机一个控制,但是在电机作用的那一段时间里,他不可能到达我们想要达到的角度,比如这次的误差是10,我们想减少这个误差到8,根据计算我们给电机一个值,到下一次我们计算误差的时候,他并不是是我们想要的8有可能是6有可能是10,因为理想与现实还是有差距的,这种差距是一种稳态误差,也就是利用P逼近后会在目标值前或后稳定,而不是在目标值稳定;
因为P有稳态误差,所以要加入I,对于I,因为是对于过去进行积分,换句话说,他的目的就是求过去误差的平均值(积分时的小动作),因为P不可能到达目标值,因此这个平均误差就出力了,因为是对时间进行积分,所以只要存在误差他的控制作用会随时间增加而变大,当误差为0时,他的作用才会没有;积分调节的“大方向”是正确的,积分项有减小误差的作用。因为积分项会一直变大,当影响超出目标值时,他就会反向调节,所以他是有滞后性的。(理解会反向调节就好)
对于D呢,D是对误差进行求导,防止误差太大超过目标值,因为误差e(t)不断减小,误差的微分(导数)和控制器输出的微分部分为负值,减小了控制器的输出量,相当于提前给出了制动作用,以阻碍被控量的上升,所以可以减少超调量。利用他来在接近目标的时候步伐放慢一点。
对于PID最好不要一起同时间使用,要分阶段使用效果更好。

/*working variables*/
unsigned long lastTime;
double Input, Output, Setpoint;
double errSum, lastErr;
double kp, ki, kd;
void Compute()
{
   /*How long since we last calculated*/
   unsigned long now = millis();
   double timeChange = (double)(now - lastTime);
  
   /*Compute all the working error variables*/
   double error = Setpoint - Input;
   errSum += (error * timeChange);
   double dErr = (error - lastErr) / timeChange;
  
   /*Compute PID Output*/
   Output = kp * error + ki * errSum + kd * dErr;
  
   /*Remember some variables for next time*/
   lastErr = error;
   lastTime = now;
}
  
void SetTunings(double Kp, double Ki, double Kd)
{
   kp = Kp;
   ki = Ki;
   kd = Kd;
}
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值