previous_error = 0
integral = 0
start:
error = setpoint - measured_value
integral = integral + error*dt
derivative = (error - previous_error)/dt
output = Kp*error + Ki*integral + Kd*derivative
previous_error = error
wait(dt)
goto start
开始时,积分设置为零。然后,在循环中,它会随着时间的推移整合错误。当我对设定值进行(正)更改时,误差将变为正,积分将随着时间(从头开始)“消耗”这些值。但是我不明白的是,当误差稳定回到零时,积分部分仍将具有一定的值(随着时间的推移而产生的积分误差),并且仍将对控制器的输出值有所贡献,但不应这样做,因为如果误差为零, PID的输出也应该为零,对吧?
有人可以请我解释一下吗?
#1 楼
积分项的主要目的是消除稳态误差。在正常情况下,稳态误差较小,而积分主要用于消除该误差。
确实,当误差变为0时,积分仍将为正,并会使您超调。然后,在超调后,积分将再次开始下降。这是积分项的负面影响。
因此,总要权衡利弊,您必须调整PID控制器以确保过冲尽可能小,并将稳态误差最小化。
这是派生术语起作用的地方。导数项有助于最大程度地减小系统中的过冲。
#2 楼
想象一下,您在自己的手臂上设置了PID控制器,这样您就可以直接拿出一杯咖啡。比例元素将控制您的手臂力量(相对于您的手的位置而言,是太高还是太低。
派生元素将根据您的运动速度来调整该力量)移动,这样您就不会超出目标。
积分元件将补偿重力的影响;没有它,杯子将停在比例力等于重力的位置。
听起来,您所坚持的代码部分是系统必须以某种方式测量重量咖啡,一种方法是随着时间的推移累积位置误差。大多数PID控制器都有一个附加术语,用于指定积分元素可以大小的合理限制。
评论
$ \ begingroup $
+1。 “如果误差为零,那么PID的输出也应该为零,对吗?”正如伊恩(Ian)解释的那样,即使咖啡杯处于理想位置且误差为零,PID的输出也需要施加一定的向上力才能将咖啡杯保持在适当的位置。
$ \ endgroup $
–大卫·卡里(David Cary)
2012年11月26日18:55
#3 楼
这是一段视频,可以直观地了解PID回路。它对积分项以及比例项和导数项进行了解释。https://www.youtube.com/watch?v=l03SioQ9ySg
有一段后续视频,解释了数学原理并展示了如何从通用公式中导出代码。
https://www.youtube.com/watch?v=sDd4VOpOnnA
评论
$ \ begingroup $
稳态误差的一个很好的例子是关节的摩擦。假设您的PD控制器稳定在目标关节角度附近,但由于摩擦而无法完全到达目标关节角度。 “ I”项将逐渐建立,并最终产生足够大的输入以克服摩擦。
$ \ endgroup $
–Ben♦
2012年11月25日,3:19
$ \ begingroup $
另一个例子是转向偏差。如果事实证明转向控制中存在轻微偏差,或者对于踏板式机器人,尽管控制器将它们设置为相同的值,但一个踏板的旋转速度却比另一个踏板稍慢。正确设置的积分项可以对此进行更正。
$ \ endgroup $
–ViennaMike
13年1月24日在4:00
$ \ begingroup $
Ian提供了正确的答案。
$ \ endgroup $
– Ugo Pattacini
昨天