本文为翻译 Brett Beauregard 的博文

提高初学者的 PID - 介绍

结合新的Arduino PID 库的发布,我决定发布这一系列的帖子。最后一个库虽然可靠,但并没有真正提供任何代码解释。这一次的计划是非常详细地解释为什么代码是这样的。我希望这对两类人有用:

这将是一个艰难的过程,但我想我找到了一种不太痛苦的方式来解释我的代码。我将从我所谓的 ==初学者的 PID== 开始。然后我将逐步改进它,直到我们得到一个高效、健壮的 pid 算法。

初学者的PID

这是每个人第一次学习的 PID 方程:

img

这导致几乎每个人都编写了以下 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;}

Compute() 被定期或不定期地调用,它工作得很好。不过,这个系列并不是关于“效果很好”。如果我们要将这段代码变成与工业 PID 控制器相当的代码,我们必须解决一些问题:

  1. 采样时间:如果以固定间隔进行评估,则PID算法功能最佳。如果算法知道这个区间,我们还可以简化一些内部数学。
  2. 衍生踢:不是最大的问题,但很容易摆脱,所以我们将这样做。
  3. 即时调整更改:一个好的PID算法是一种可以在不影响内部工作的情况下更改调整参数的算法。
  4. 重置终止缓解:我们将探讨重置终止是什么,并实施具有附带好处的解决方案
  5. /关(自动/手动):在大多数应用中,有时需要关闭PID控制器并手动调整输出,而不会受到控制器的干扰。
  6. 初始化:当控制器第一次打开时,我们需要==“无扰动传输”==。也就是说,我们不希望输出突然猛增到某个新值**
  7. 控制器方向:最后一个并不是健壮性名称的改变。它旨在确保用户输入带有正确符号的调谐参数。