用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如何忽略缓冲读取器中在“”之后的行的其余部分,或行上的特定字符?   java在db中创建空对象或稍后保存   java如何实现UI无关的后台工作任务   java未能在Android中从BaseAdapter扩展的类中启动Tactivity?   java斐波那契迭代移动数组[]   安卓从文件读取提供了java。木卫一。StreamCorruptedException:无效的流标头:73720027   java计算矩形中的六边形数?   仅使用Java 1.5(或更早版本)读写XML   java如果所有元素都以相同的bucked结尾,为什么要进行大小调整?   java Apache POI Excel在xx中发现无法读取的内容。xlsx   swing我可以在普通java应用程序中使用GWTGUI吗?   来自自定义Java客户端的http删除请求的行为与邮递员不同   运行批处理文件时,java当前目录无效   使用TypeReference将java字符串转换为ArrayList<STRING>   documentlistener突出显示所有匹配词Java