Arduino PID Autotune Library

原文章地址:http://brettbeauregard.com/blog/2012/01/arduino-pid-autotune-library/

Arduino PID Autotune Library

终于,我发布了一个自动调PID参数的一个库来完善Arduino PID库文件。在我发布当前版本的PID库的时候,我做了大量的博客让读者明白,这个库内部是怎么运行的。但是也不是那么深入,这个也是这篇博客的目标。我会解释这个自动调谐库能够完成什么,是怎么完成的。

Attribution

很多年来,我都想写一个自动调谐库,但是因为我和雇主的一些协议,我不能发布一个。但是!当我发现William Spinelli 写的AutotunerPID Toolkit的时候,我便开始打算写一个了。我自己的公司对于我发布、评论和维持开源项目没有提出异议。

对于matlab的代码,我对于峰值检测部分做了一些微调,将标准形式(Kc, Ti, Td)调为理想形式(Kp, Ki, Kd),就像以往一样,所有的权利归于 Spinelli先生。

理论基础

对于一个PID控制器来说,最好的调谐参数 (Kp, Ki, Kd,) 是取决于控制器控制的是什么。一个烤箱的最佳调谐参数不一定是烤牛排工具( sous-vide cooker)的最佳参数。所有的自动调谐研究者都试图发现控制器控制的到底是什么,然后再计算调谐参数。自动调谐有许多的方法,但是大多数都是改变PID的输出,然后观察输入的响应。

这个库用到的方法是著名的延迟方法,它的工作方式如下:

最开始使output和input都是在稳态,然后使output在某个方向上改变某个位移D。当Input穿过触发线的时候,output改变为另一个方向的位移D。通过分析,峰峰值的距离和它们与输出的关系,这些自动调谐工具可以分辨出两种不同的过程。最终,不同的系统得到特定的PID参数。

应用

这个理论在理想条件下运行良好,但是在真实的世界,他并不运行的那么良好。因为在工作条件下,输入信号通常是噪音繁多,这将导致连个主要问题。

问题1:何时改变 When to step?

当含噪声的信号不断改变方向的时候,Input 有可能在会重复通过触发线很多次。这个问题可以导致输出会发生严重的震荡,如果更严重的话,会对物品造成损害。


我选择回避这种问题的方式是用户指定一个噪声带noise band。事实上,我们是创造两条触发线。因为,这两条线的距离是噪声的幅值(如果设置妥当),这样的话,因为噪声的原因多次触发的情况就会很少发生。

问题 #2: 峰值检测

在仿真世界,检测峰值很容易;当输入信号改变方向,那就有一个最大值和最小值(取决于是上升还是下降)。但是在一个有噪声的世界,这种方法就失效了。

每一个噪声信号都会造成一个方向的改变。为了处理这种问题,我加了一个“向后看"(“look-back time” )的参数 。当然这个是一个不好听的名字,请你一定要告诉我,如果你能想到一个更好的名字。

无论如何,用户定义一个窗口期,比如说10秒。那么这个库就会比较当前的点和前10秒钟点。如果当前点事最小或最大,那么这个点被标记为可能的峰值。当这个标志点从最大变为最小的时候,那么前一个点被认为是一个峰值。反之亦然。

另一种解释向后看的方式是,可疑点将被认作为一个峰值,如果它是最大或最小值在过去的一段时间或将来的一段时间。就像我说的,这个名字很糟糕。

其他…

  • The number of cycles performed will vary between 3 and 10. The algorithm waits until the last 3 maxima have been within 5% of each other. This is trying to ensure that we’ve reached a stable oscillation and there’s no external strangeness happening. This leads me to…
  • I’m not the biggest fan of Autotune. I’ve often said, and still believe, that a moderately trained person will beat an Autotuner every day of the week. There’s just so much that can go wrong without the algorithm knowing about it. That being said, Autotune is a valuable tool to help the novice get into the ballpark.
  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Arduino PID (Proportional-Integral-Derivative) 是一种控制算法,常用于控制系统中的自动调节和稳定性。PID 控制器可以根据设定值和实际值之间的误差来计算输出,以达到控制目标。在 Arduino 上,可以使用 PID 库进行 PID 控制的实现。 以下是一个简单的例子,演示如何在 Arduino 上使用 PID 控制器控制电机的转速: ```C++ #include <PID_v1.h> #define PIN_ANALOG_IN A0 #define PIN_PWM_OUT 3 // Define variables double Setpoint, Input, Output; PID myPID(&Input, &Output, &Setpoint, 2, 5, 1, DIRECT); void setup() { // initialize serial communication: Serial.begin(9600); // initialize the PWM output pin: pinMode(PIN_PWM_OUT, OUTPUT); // initialize the analog input pin: pinMode(PIN_ANALOG_IN, INPUT); // set the PID parameters: Setpoint = 500; myPID.SetMode(AUTOMATIC); } void loop() { // read the analog input value: Input = analogRead(PIN_ANALOG_IN); // compute the PID output: myPID.Compute(); // set the PWM output based on the PID output: analogWrite(PIN_PWM_OUT, Output); // print the PID values to serial monitor: Serial.print("Setpoint = "); Serial.println(Setpoint); Serial.print("Input = "); Serial.println(Input); Serial.print("Output = "); Serial.println(Output); delay(100); } ``` 这个例子中,我们使用了一个叫做 PID_v1 的库来实现 PID 控制器。在 setup 函数中,我们初始化了串口通信、PWM 输出和模拟输入等参数,设置了 PID 的参数。在 loop 函数中,我们读取了模拟输入的值,计算 PID 的输出,设置 PWM 输出,并且将 PID 的参数打印到串口监视器中。 需要注意的是,PID 控制器的参数需要根据实际的控制系统进行调整,以达到最佳的控制效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值