Microduino 单维度PID调整/zh

来自Microduino Wikipedia
Radiumray9@gmail.com讨论 | 贡献2014年10月29日 (三) 05:46的版本 程序
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳转至: 导航搜索
Language English

目的

本教程将让大家了解PID,并通过processing展示的波形图来更好的理解PID控制,为以后制作自平衡小车打下坚实的基础。

设备

  • 其他硬件设备
    • USB数据连接线 一根
    • 电位器 一个

理解PID

PID在自动控制领域有着极其重要的作用,作为最早实用化的控制技术已经有70多年的历史,近几年一些创客们自制的一些很酷的东西,如:四轴飞行器,自平衡车等等都离不开它的身影。

首先了解什么是PID。PID实指“比例proportional”、“积分integral”、“微分derivative”,如果我们要求被控制的对象最终趋于一个稳定的结果,一般就可以使用PID算法。

假设说,有一辆速度为1m/s的小车,我们要求他的速度改变为5m/s,要完成这样的一件事,我们必须要有:

小车驱动装置(用程序控制它输出多大的电压,电压决定驱动的马力)

被驱动器控制的部分(即小车)

检测当前速度的装置(当前速度与目标速度的差称为误差)。本来,我们可以给小车一个驱动力让小车加速,直到检测到小车速度达到5m/s,撤去驱动力。

然而,这样做会带来几个问题:

1,当小车速度达到5m/s时,从装置检测到这个速度,通知控制器,让控制器改变输出的电压,这一个过程需要耗费一定时间,在这个时间里面,小车速度可能增加了不少。

2,撤去驱动力后,外界条件如摩擦会让小车速度进一步改变。

然而,PID算法可以在一定误差内解决这些问题。

使用PID算法时,大致是这样的。每一个采样周期,通过速度检测装置获得当前速度,传入程序,通过程序计算得到电压控制小车得到新速度。下一个采样周期又把新速度传入,获得新电压,再传入速度,再获得电压,如此反复。

PID算法的关键,是如何根据当前得到的速度值,输出一个“恰当”的电压,以致小车最终能够趋于稳定。

PID算法采用比例,积分,微分(Proportion Integral Differential)三种方法进行控制。三种方法都有自己对应的一个常量(pconst,iconst,dconst)。这三个变量都需要在实验中多次尝试得出。

用数学公式表达PID算法如下图所示:


下面就让我们用Microduino和processing来实现一个,简单PID调整,从而更直观的理解PID。


原理图


程序

PID_FrontEnd_v03

调试

步骤一:下载Processing2.0 Beta 7 IDE软件:http://processing.org/download/

步骤二:下载Arduino官方库—PID Library 和 PID Front-End using Processing.org:http://playground.arduino.cc//Code/PIDLibrary

步骤三:下载Processing官方库—ControlP5 :http://www.sojamo.de/libraries/controlP5/

步骤四:将Arduino官方库—PID Library解压到你的arduino IDE的libraries里面

如果想知道PID库中的算法如何实现的请参见:http://brettbeauregard.com/blog/2011/04/improving-the-beginners-pid-introduction/

步骤五:将Processing官方库—ControlP5解压到你的processing安装文件夹里的\modes\java\libraries里面

步骤六:解压Arduino PID_FrontEnd_v03.zip到任何一个地方

步骤七:用Arduino IDE打开PID FrontEnd ArduinoSampleCode.pde,然后点击编译下载到Microduino上

在代码中,注意如下:

double Setpoint, Input, Output;

//setpoint为目标值,也就是经过PID调整要达到的值

//Input为输入值,在系统中就是通过某些传感器检测到的实际值。比如:在自平衡车中input就是传感器获取的角度值。

//Output为输出值,也就是经过PID调整得出的需要调整的值。如果在自平衡车系统中就是给电机输出的PWM的值,使得角度正好改变到0度。

int inputPin=0, outputPin=3;

//在本例中,只做简单的PID调整,输入值inputPin是A0,是通过一个电位器得到的,输出值outputPin是pin3,也会体现到processing的波形图中。

步骤八:用Processing打开PID_FrontEnd_v03.pde

要注意 myPort = new Serial(this, Serial.list()[1], 9600); 和下面信息[0] "COM2", [1] "COM7",总之,写对你的com口就成。

步骤九:硬件搭建,如下图:

步骤十:先运行arduino IDE代码,在运行processing,然后会出现如下图:


步骤十一:转动电位器,观察input, setPoint, output的波形。



结果

在本例中setpoint=100,当input(电位器)的值为0时,output达到最大值255为了让最快的达到setpoint。

当input达到100,甚至超过100时,output变为最小。

视频

http://v.youku.com/v_show/id_XNzAxMDk4Mjcy.html