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; }
PID
最新推荐文章于 2024-06-05 22:56:00 发布