arduino实现pid,
最近看到Brett Beauregard发表的一系列关于PID的文章,觉得对理解PID算法很有帮助,于是翻译了系列文章!在自我提升的过程中,也希望对志同道合者有所帮助。作者Brett Beauregard原文网址:http://brettbeauregard . com/blog/2012/01/arduino-PID-auto tune-library/
最后,我发布了一个自动调优库来补充Arduino PID库。当我发布当前版本的PID库时,我发布了一系列异常广泛的帖子,以使人们更容易理解其中发生的事情。
虽然没那么深,但这是本帖的目标。我将解释Autotune库想要完成什么,以及它如何处理它的业务。
1.原因
几年了,一直想有一个自动设置库,但是因为和雇主的约定,写不出来。但是!当我找到William Spinelli编写的AutotunerPID工具箱时,我已经准备好了;我的公司对我来说移植和扩展现有的开源项目没有问题。
我把matlab的代码转换过来,对峰值识别码做了一些调整,从标准形式(Kc,Ti,Td)切换到理想形式(Kp,Ki,Kd)。另外,所有的荣誉都属于斯皮内利先生。
2.理论
PID控制器的最佳调谐参数(Kp,Ki,Kd)将取决于控制器驱动的对象。烤箱的最佳设置参数与低温烹饪电器不同。
自调谐装置试图找出控制器驱动的内容的性质,然后从中调整参数。有许多方法可以做到这一点,但大多数方法都涉及以某种方式改变PID输出,然后观察输入如何响应。
库中使用的方法称为中继方法。它是这样工作的:
从稳态开始(输入和输出都是稳态),输出在一个方向上跨过一定距离D,当输入跨过触发线时,输出在另一个方向上跨过距离D。
通过分析峰的距离和峰相对于输出的变化,“自动调优器”可以区分不同类型的过程。因此,不同的系统将获得定制的调整参数:
3.履行
这在理论上行得通,但现实世界的数据并不十分配合。输入通常有噪声,这导致两个主要问题。
3.1.问题#1:何时迈步?
因为噪声信号是波动的,当输入信号通过触发线时,触发线很可能会被跨越几次。这可能会导致输出出现轻微抖动,严重的话可能会完全破坏:
我选择通过要求用户指定噪声波段来避免这个问题。实际上,这将创建两条触发线。由于它们之间的距离等于噪声(如果设置正确),因此不太可能因信号抖动而发生多次交叉。
3.2.问题#2:峰识别
在模拟世界中,很容易识别峰值:当输入信号改变方向时,它是最小值或最大值(取决于发生的变化)。然而,在嘈杂的世界里,这种方法失败了:
每个噪声信号都是一个方向的变化。为了处理这个问题,我增加了一个“回溯时间”参数。这是一个可怕的名字。如果你能想到更好的办法,请告诉我。
总之,用户定义了某个窗口,比如说10秒。然后,库将当前点与最近十秒的数据进行比较。如果是最小值或最大值,它将被标记为可能的峰值。
当标记点从最大值切换到最小值时,反之亦然,先前标记的点被确认为峰值。
另一种解释回溯时间的方法是,如果一个点是回溯未来或过去的最大(或最小)值,它将被标识为峰值。就像我说的:可怕的名字。
4.你也应该知道。
的执行周期数从3到10不等。该算法一直等到最后三个最大值彼此相差在5%以内。这是为了保证我们达到了一个稳定的振荡,没有外部的奇怪现象发生。这让我思考.
我不是Autotune的超级粉丝。我经常说,并且仍然相信,一个受过适度训练的人可以轻松击败自动调整器。如果不知道算法,很多地方很容易出错。话虽如此,Autotune是帮助新手进入竞技场的一个有价值的工具。
欢迎关注:
想更方便及时的阅读相关文章,请关注我的微信微信官方账号【木南创智】
转载请联系作者取得转载授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。