用python3编写的pid控制器

jataruku的Python项目详细描述


保留所有权利。


条件列表和以下免责声明。

*以二进制形式重新分发必须复制上述版权声明,此
文档中的条件列表和以下免责声明和/或分发时提供的其他材料。


*不得修改代码以破坏现有的物理世界。

"按原样"和
任何明示或默示保证,包括但不限于对适销性和特定用途适用性的默示
保证,概不承担。在任何情况下,版权所有人或贡献者均不对
任何直接、间接、附带、特殊、惩戒性或后果性损害
(包括但不限于购买替代商品或服务;
使用、数据或利润损失负责;(或业务中断)无论是何种原因造成的,在
任何责任理论,无论是在合同中,严格责任或侵权
(包括疏忽或其他)产生的任何方式使用本
软件,即使已告知此类损坏的可能性。

原版由Jeremy Bornstein制作,基于[Brett Beauregard编写的Arduino PID代码](https://github.com/br3ttb/Arduino PID库)。

Brett的代码是他经过大量研究和思考的结果,他[有大量的文档](http://brettbeaugard.com/blog/2011/04/improving the初学者pid introduction/)。
我所做的大部分工作都是将它转换成一种形式,我希望如果您用python实现一个希望使用pid
控制。

学习如何使用它的最好方法是查看test.py文件(见下文)。


参数:

*``输入`:报告输入值的lambda,例如控制温度的对象的温度

*``输出`:控制输出设置的函数,例如是否
加热器是否打开。它接受一个单独的参数,
这是输出对象应该接收的值

*``设定点`:输入的目标值,例如所讨论对象的期望温度

*``kp``,``ki`,和"kd":三个pid参数。(如果你不知道它们是什么,你应该[去阅读pids是如何工作的](http://en.wikipedia.org/wiki/pid_controller)。尽管您可以根据本文中的测试代码使用默认值,但还是可以不使用这些代码。)

*``direct`:如果输出值的增加将导致输入值的增加,则为true;否则为false。output,setpoint,kp,ki,kd,direct)`

创建对象后,使用``pid.auto=true`,
打开PID控制,并使用``pid.set输出限制(最小输出,max_out)``.
此时,您可以调用``pid.compute()``作为
尽可能频繁,最好是通过某种中断。良好结果所需的
频率将取决于整个系统的特性,但默认的更新频率100
毫秒可能是一个很好的开始。如果系统工作,则输入值将接近设定值并保持在该值。


您可以通过将"pid.auto"设置为"false"(用于手动控制)或"true"(用于手动控制),随时在
将系统从自动模式切换到手动模式。(对于"自动"。

如果要更改采样率,请将"pid.sample_time"设置为毫秒数。默认值为"100"。如果要更改
设置点,只需设置"pid.set point",如果要重新设置任何
pid参数,则可以调用"pid.set"调整(kp、ki、kd)。在这些变化下,系统应该是非常合理的。

为了证明它的基本工作原理,我写了一个非常简单的水箱加热器的模拟,并做了一些测试,看看pids的行为。当连接到加热器模拟时。
当加热器打开时,以一定速率加热,如果其
温度高于环境温度,则随着时间的推移,
将向环境损失一定量的热量。


第一次试验应证明模拟加热器基本正常工作。

test.py 0

第二次试验应证明系统能够将水加热到给定的温度并保持在该温度下。


试验py 1



注意事项
----


代码。因为对象相对简单,所以几乎不需要。如果这让你感到不安,那就把它们加进去吧,
尽管我最终会自己解决这个问题并非不可想象。不过,它应该可以正常使用,不会有太多困难。

此代码取决于以可预测的间隔调用"pid.compute()"。它不会在延迟呼叫太多的情况下工作,例如在试图做太多事情的非实时操作系统下使用。


更好。我甚至不知道他们是什么。如果你这样做了,请随意编写并提交请求。


p.s."jataruku"是warlpiri语言中的一个词,根据澳大利亚土著语言协会的walpiri词典(http://ausil.org/dictionary/warlpiri/lexicon/index.htm)。意思是"固执、固执、脾气暴躁。"


平台:未知

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java“抹去”了整个swing GUI,只有一个组件例外   有人能解释一下为什么这个用来反转字符串的Java程序不起作用吗?   jar使用java代码发送电子邮件   java如何使用keyRelease连续激发筛选表?   安卓 studio在java中执行lua脚本   java在实现StatefulJob时,“延迟”是什么意思?   当我再次尝试上传时,java Android无法查看保存在新目录中的图像   爪哇岩布剪刀问题只返回一半结果   使用Jersey Rest客户端进行java异步大文件上载   Java日历。加错年份   java对于多个autosize文本视图只有一个大小   java JodaTime:句点、间隔和持续时间之间有什么区别?   java对返回数据的正确处理   多线程多线程在java中打印偶数和奇数?   摆动Java弹跳球移动   httpconnection Java HttpUrlConnection抛出连接被拒绝   寻找C#的XmlConvert的Java等价物。编码名称   jetty在一个cookie Java代码中设置多个值   使用maven构建java jar显示错误   java我可以只使用输入在iText中生成超级脚本吗?