PID学习笔记(先翻译大神教程)
三水 于 2011-11-16 11:47 编辑
提高初学者PID原文地址:
http://brettbeauregard.com/blog/ ... s-pid-introduction/
提高初学者的PID:
这里是第一次接触PID需要学习的公式:
2011-11-16 11:41 上传
(18.08 KB)
它能引导大多数人写出如下的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控制器相近的驱动器,我们需要解决几个问题:
Sample Time(采样时间)——如果这是一个固定的时间间隔,PID算法的功能实现将是非常好的。如果已知了这个间隔时间,代码中也可以简化一些内部的数学运算。
Derivative Kick(微分的过冲)——不是最大的问题,但是很容易解决,所以我们也将处理这个问题。
On-The-Fly Tuning Changes——好的PID函数是当调整参数的时候不会干扰内部运算的。
Reset Windup Mitigation(缓解积分饱和)——我们将会了解什么是积分饱和,并且在有利的方向上进行解决方案的实施。
On/Off (Auto/Manual)(开关-自动或手动)——在大多数应用中,有时候我们希望关闭PID控制器手动调节输出而不受控制器的干涉。
Initialization(初始化)——当控制器打开的时候我们希望是“无扰切换”,即我们不希望输出值忽然变成一个新的值。
Controller Direction(控制器的方向)——这是最后一个不是在鲁棒本身名称下的变化。它是为了确保用户能输入正确的调优参数而设计的。
一旦我们解决了这些问题,我们将有一个对PID算法深刻的了解。我们还会拥有最新的Arduino PID控制库。所以不管你是想自己写出自己的PID算法还是想去了解PID算法里到底发生了什么,我希望这些都能帮上你。现在我们开始旅程吧。
via - 极客工坊