PID进阶教程
PID精进教程; 这篇文章的主要内容是如何改进初学者的PID控制器。文章中提到,初学者的PID控制器设计的目的是不规则地调用。这会导致两个问题:您无法从PID获得一致的行为,因为有时它被频繁调用,有时则没有。您需要进行额外的数学计算,以计算导数和积分,因为它们都依赖于时间的变化。作者提出了一种新的方法,称为“Proportional on Measurement”,可以解决这些问题。 任何编写自己的 PID 算法的人都可以看看我是如何做的,并可以从中学到他们需要的东西。 这将是一个艰难的过程,但我想我找到了一种不太痛苦的方式来解释我的代码。我将从所谓的“初学者的 PID”开始。然后我将逐步改进它,直到我们得到一个高效、健壮的 pid 算法。 PID的开始 这是初学PID的人都知道的公式: Output=K_pe(t)+K_t\int{e(t)dt}+K_D{\frac{d}{dt}}e(t) Where:e=Setpoint-Input 公式(2)也就是指偏差e等于设定值和当前值的差别; 根据这个公式,大多数都能写出下面的代码: /*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 控制器相当的东西,我们必须解决一些问题: ...