长春星宿网站建设公司怎么样,网站页面建议,网站怎么做h5支付,网站网站制作400多少钱最近看到了Brett Beauregard发表的有关PID的系列文章#xff0c;感觉对于理解PID算法很有帮助#xff0c;于是将系列文章翻译过来#xff01;在自我提高的过程中#xff0c;也希望对同道中人有所帮助。作者Brett Beauregard的原文网址#xff1a;http#xff1a;//brettb…最近看到了Brett Beauregard发表的有关PID的系列文章感觉对于理解PID算法很有帮助于是将系列文章翻译过来在自我提高的过程中也希望对同道中人有所帮助。作者Brett Beauregard的原文网址http//brettbeauregard.com/blog/2011/04/improving-the-beginners-pid-introduction/ 结合新的Arduino PID库的发布我决定发布这一系列帖子。最后一个库虽然稳定但并没有真正提供任何代码解释。这次计划的目的是详细解释为什么代码是这样的。我希望这对两类人有用
直接对Arduino PID库中发生的事情感兴趣的人将得到详细的解释。 任何编写自己的PID算法的人都可以看看我是如何做的并借鉴他们喜欢的东西。
这将是一个艰难的过程但我认为我找到了解释我的代码的一个不太痛苦的方法。我将从我称之为“初学者的PID”开始。然后我将逐步改进它直到我们留下一个高效强大的pid算法。
初学者的PID
这是每个人第一次学习它时接触的PID方程式 这导致几乎每个人都编写以下PID控制器
/*working variables*/
unsigned long lastTime;
double InputOutputSetpoint;
double errSumlastErr;
double kpkikd;
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 Kpdouble Kidouble Kd)
{kp Kp;ki Ki;kd Kd;
}
Compute被定期或不定期地调用并且它运行良好。不过这样的PID并不是“非常好用”。如果我们要将此代码转换为与工业PID控制器相同的代码我们将不得不解决以下问题 1、采样时间—如果以固定间隔评估PID算法则该算法的运行效果最佳。如果算法知道这个间隔我们也可以简化一些内部的数学计算。
2、微分冲击—这虽然不是最重要的但很容易处理所以我们就先处理它。
3、改变整定参数—一个好的PID算法是可以在不影响内部工作的情况下改变整定参数的算法。
4、积分饱和—我们将讨论积分饱和并实现一个很好的解决方案。
5、开/关自动/手动—在大多数应用中有时需要关闭PID控制器并手动调节输出而不会影响控制器。
6、初始化—当控制器第一次打开时我们想要一个“无扰动切换”。也就是说我们不希望输出突然变成一些新值。
7、正反作用—最后一种方法并且不改变系统的鲁棒性和名称。它旨在确保用户使用正确的符号输入调整参数。
8、新测量的比例—添加此功能可以更轻松地控制某些类型的过程。
一旦我们解决了所有这些问题我们就会拥有一个可靠的PID算法。我们还将获得Arduino PID库最新版本中使用的代码这并非巧合。因此无论您是尝试编写自己的算法还是试图了解PID库中的内容我希望这可以帮助您解决问题。让我们开始吧。
更新在所有代码示例中我使用的是双精度。在Arduino上double与float相同单精度。真双精度对于PID来说可能会成为累赘。如果您使用的语言确实是双精度我建议将所有双精度更改为浮点数。
欢迎关注