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 控制器相当的东西,我们必须解决一些问题: ...

April 9, 2023 · 3 min · Rancho

PID中积分饱和及其解决办法

PID控制中常出现的积分饱和概念及其解决方案; 积分饱和的概念: 这种现象往往发生在误差有大幅变化(例如大幅增加),积分器因为误差的大幅增加有很大的累计量,因为积分器的输出满足下式: 离散化形式表示为: 所以随着时间的增加,每次累积较大的误差,很容易造成积分饱和并产生较大的过冲,而且当误差变为负时,其过冲仍维持一段时间之后才恢复正常的情形。 通常会产生的输出如下图所示: 从图中我们不难发现,这里有三个过程: 因为这个过程存在 较大幅度变化的误差,因此积分器累积了较大的值,从图中可以看到,积分器的面积比较大(阴影部分); 此时积分已经饱和,产生了较大的过冲,并且在较长的一段时间内,一直处于过冲的状态; 积分脱离饱和状态,产生了积极的调节作用,消除静差,系统输出达到设定值; 如何防止积分饱和: 为了防止PID控制器出现积分饱和,需要在算法加入抗积分饱和(anti-integral windup)的算法;通常有以下几种措施; 积分分离或者称为去积分算法; 在饱和的时候将积分器的累计值初始化到一个比较理想的值; 若积分饱和因为目标值突然变化而产生,将目标值以适当斜率的斜坡变化可避免此情形; 将积分累计量限制上下限,避免积分累计量超过限制值; 如果 PID输出已经饱和,则重新计算积分累计量,使输出恰好为合理的范围; 参考: 1、一文详细解析到底什么是积分饱和;

March 10, 2022 · 1 min · Rancho