跳至内容
深圳市捷比信实业有限公司 · 产品选型与采购咨询联系业务人员
LED灯珠捷比信 · 专业器件主题站

学习和使用PID库,轻松掌握PID

每个与PID接触的人都知道PID的公式:然后,根据该公式,您可以编译arduino程序来计算输出,如下所示:注意:该程序的源代码可以复制在原始文本上。但是,在上述程序中,当不定期地调用PID时,会出现两个问题:1.有时会定期调用它,有时会停止调用,并且无法获得PID的连续和稳定的特性。 2.需要积分和微分的附加数学计算,因为它们与时间密切相关。解决方案:确保在固定的时间间隔内调用PID。我通过每个周期中的预设采样时间调用计算功能,然后PID决定是立即计算还是返回该值。一旦知道在固定的时间间隔内调用了PID,就可以简化积分和微分的计算。因此我们的程序变为:灰色部分是新添加的语句。在这个新程序中,作者在第29行将时间转换为秒。这简化了计算。同时,新增了后两个功能,以将PID参数转换为基于秒的参数。当上述PID程序运行时,可能会出现差分超调的问题。看上图,因为error = Setpoint-Input,只要Setpoint发生变化,就会引起error值的突然变化。在微分操作中,微分值的突然变化是无限的。解决方案:这样我们的程序就变成了:我们可以看到我们只是用-dInput替换了+ dError。当我们的PID运行时,此时更改PID参数将导致输出更改。例如,如果我们仅将ki的值减小一半,则输出将减小一半。为什么会这样呢?可以在下面的积分公式中找到原因:这说明了为什么在KI不变之前,系统一直稳定运行。突然,您将一个新的KI值的累积总和与先前的偏差相乘。由此带来的变化不是我们所希望的,我们只是想朝着变化后希望的方向发展。解决方案:有很多解决方案。我在最新的Arduino PID库中使用的方法是重新调整errSum(偏差之和)。当KI变为原始值的两倍时,errSum变为原始值的一半,尽管此方法有些笨拙,但是下面有更明智的方法。此方法需要基本的代数或计算技能。将KI乘以内部,尽管似乎没有变化,但我们将看到这个小的变化会带来很大的不同。现在我们将误差和Ki相乘。并保存乘积和,当Ki更改时,此时将没有大的变化,因为已存储KI的先前乘积和值。因此我们的程序变为:这样,如果我们更改参数,输出将不会有太大变化。本帖最后在2015-4-13 19:17进行了一半编辑。当我们的PID运行时,有时会发生甩尾现象。如图所示:当PID认为自己可以执行实际上无法执行的操作时,就会发生这种情况。例如,最大输出为255,但PID输出为300。原因是PID不知道最大输出只能为255。因此我们在程序中对PID输出值添加了一些限制。告诉PID可以输出的最大值。我们的程序变为:如果存在,则无需使用PID所计算的输出值,而是要使用您设置的值。 (例如,如果您希望输出为0),则程序可能会写:void loop(){Compute(); Output = 0;}在这种情况下,无论PID要输出什么,程序总是输出0。这会使PID混淆:“我试图更改输出,但是什么也没发生,我该怎么办?让我增加变化的强度。以这种方式,当您停止使用设置为输出的值并重新使用PID作为输出时。 PID输出很大的值,因此系统混乱。因此,当我们使用自己设置的值时,必须在程序中添加一个开关,以关闭PID并阻止其计算。我们的程序变为:在上面的程序中,我们向PID添加了一个开关,但是当我们打开PID开关并返回PID时,将发生以下情况:是的,PID输出该值将跳回到它发送的最后一个输出值。并根据该值调整自己。因此,当再次打开开关时,我们需要一个初始化函数来重新初始化数据。首先看一下程序:您可以知道,更改模式后,将执行IniTIalize()函数将lasTInput的值更新为当前采样值。将ITerm的值更新为输出的值,以避免第一次执行PID时发生跳转。