专栏名称: 面包板社区
面包板社区——中国第一电子人社交平台 面包板社区是Aspencore旗下媒体,整合了电子工程专辑、电子技术设计、国际电子商情丰富资源。社区包括论坛、博客、问答,拥有超过250万注册用户,加入面包板社区,从菜鸟变大神,打造您的电子人脉社交圈!
目录
相关文章推荐
企业专利观察  ·  汤森路透的胜利,是否为“AI版权化”开了绿灯 ·  昨天  
企业专利观察  ·  汤森路透的胜利,是否为“AI版权化”开了绿灯 ·  昨天  
小小牛财经  ·  deepseek最新消息23家公司新增概念 ·  昨天  
结构先声  ·  DeepSeek结构计算案例分析,实力超乎想象! ·  3 天前  
结构先声  ·  DeepSeek结构计算案例分析,实力超乎想象! ·  3 天前  
涵江时讯  ·  负债千亿!一代零售巨头苏宁,宣告破产! ·  3 天前  
涵江时讯  ·  负债千亿!一代零售巨头苏宁,宣告破产! ·  3 天前  
51好读  ›  专栏  ›  面包板社区

Arduino 中的 PID 实施

面包板社区  · 公众号  ·  · 2024-04-27 20:00

正文


作者:Jeremy Cook

对于从事工业控制工作的人来说,比例、积分、微分 (PID) 理论可能是一个耳熟能详的概念。对大多数人来说,这个术语完全陌生,但但您可能比自己想象的更熟悉。当您踩下汽车的油门踏板时,您不仅要考虑您离理想速度(PID 的比例部分)有多远,还要考虑您的特定车辆如何加速以及上坡等的条件。

这些更为微妙的影响正是 I 和 D 项在数学上所考虑的。在这个例子中,它们可以防止汽车的速度从上限跳到下限,我们可以将同样的概念应用于各种控制情况。虽然基于限值的控制可以让您大致实现目标上,但您的系统往往会表现得有些不稳定。

PID 方程


我们可以用下面的公式来表示 PID 控制的数学运算。P、I 和 D 由这里相加的三项表示。K p 、K i 和 K d 是常数,用于调节系统对每个因素的反应:
我们还可以分别用 1/T i 和 T d 替换 K i 和 K d 。这一改动使公式与其物理意义有了更好的联系,并允许单位正确计算出无单位数:
我们还可以转置该方程,以提取 K p 值,并将其应用于整个方程,这就是所谓的标准形式。这种形式的一个优点是,我们可以一次调整整个方程的整体 K p 常数:
所有这些可能看起来有点吓人,甚至对于拥有工程学位的毕业生来说也是如此。好消息是,您不必翻出 《动态系统建模和分析》 教科书,就能理解这里的内容。虽然没什么坏处,但您甚至不需要会做微积分。

分解第一个等式,我们通过在等号右侧添加三个数学元素:P、I 和 D,得出等式左侧的无单位控制器输出 u(t)。每个元素前面都有一个常数 K 值(K p 、K i 和 K d ),这表示每个元素在形成 u(t) 时或特定时间的控制输出时的权重。我们可以单独调整每个 K 值,以获得更好的系统性能,我们将在下面进一步解释:

成比例 (P—K p )

方程中的第一项也是最重要的一项是 e(t)。因此,在它之前的 K p 值通常大于等式中的其他 K 值。这里,e(t) 就是某个时间点的瞬时误差—受控设备的实际值减去期望值。将其乘以 K p ,即可得出其对控制器总输出的贡献。

积分 (I—K I )

该等式的第二项与一段时间内的综合误差有关。它是设备上出现的所有误差的总和:

每当控制器计算 u(t) 时,都会将瞬时误差添加到运行计数中。

然后将这个数字乘以 K i ,并与 u(t) 相加。

考虑这样一种情况,即在正常情况下,一个力将电机保持在原位,并且不允许电机返回到设定点。随着超出规格的时间越来越长,I 项将继续增加,最终克服该力或达到电机的能力极限。

导数 (D—K d )

等式中的第三项与误差变化的速度有关:

从理论上讲,如果该等式中只有一个 D 项,并且您的流程稳定地保持 错误 值,则该项将保持为零,不会对正确的输出产生任何影响。另一方面,如果其他两项中的一项试图使设备的输出迅速恢复原位,导数可以帮助抑制这种影响。

虽然这一概念的微积分表达可能很有用,但 PID 控制的实际情况却远没有想象中那么神奇。实际上,我们只使用加法、减法和乘法计算输出,将误差和读数之间的时间因素考虑在内。事实上,我们使用气动系统来实现早期形式的 PID 控制,使用机械方式输入每个“项”。

1.控制器获取瞬时误差读数。
2.从中减去之前的瞬时读数。
3.将结果值乘以 K d ,以计算其对 u(t) 的贡献。

Arduino PID 控制器教程


在许多情况下,在您的过程中插入专用 PID 控制器是一种权宜之计,但您也可以使用 Arduino 或其他类似的开发板制作自己的控制器。您甚至可以 编写自己的 PID 程序 。在代码中以类似以下的方式表达每个项:

  • P:instanteneousError = 设定点 – 输入;
  • I:cumulativeError = += error * elapsedTime;
  • D:rateOfError = (error – errorLastCalculation)/elapsedTime

要获得必要的输出,将这些项分别乘以各自的 K 值,然后相加。另一方面,如果您不想重新创造,您可以使用
Brett Beuregard 的 PID 库 (https://github.com/br3ttb/Arduino-PID-Library)。该库会为您处理细节问题,让您专注于根据需要调整 P、I 和 D 常数值。


为了演示 PID 理论的实际应用,我从工具箱中拿出了 Arduino Nano Every,同时还有以下器件:

  • 电机驱动板
  • 红外传感器
  • 从 Hubsan H107C 无人机上拆下来的电机

我为电机打印了一个试验板支架以及一个“风扇”,该风扇在 50% 的时间里阻挡光线,以避免电机旋转时错过脉冲。电机驱动器是(否则不受控制的)电机的输入,反馈则基于脉冲之间的时间间隔。

当我最终 编好代码 (https://github.com/JeremySCook/PropPID/)并获得 3D 打印的零件时,我能够以一种比使用恒定 PWM(脉宽调制)输出操作电源按钮更复杂的方式控制电机。






请到「今天看啥」查看全文