微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > PID非常好的光感巡线思路

PID非常好的光感巡线思路

时间:11-30 来源:互联网 点击:

一个叫Kp的比例系数,就得到了系统的修正值。在我们的巡线机器人例子中,我们通过加大/减小马达的功率值来应用这个修正值。这个叫Kp的比例系数要用有根据的推测来确定,并通过反复试验进行调整。
P控制器能够处理很多控制问题,不仅仅是用在乐高机器人巡线上。一般来说,在满足条件的情况下,P控制器都能良好工作。

1.传感器需要有足够宽的动态范围(不幸的是,我们的巡线机器人却不是这样)

2.被控制的东西(在我们的例子里是马达)也需要有足够宽的动态范围。每个马达在功率值上的宽动态范围应该很接近(NXT马达在这一方面非常好)。

传感器和被控制的东西必须响应迅速。“迅速”的意思是“比系统内发生的任何变化都快”。控制马达时,通常不太可能获得马达的“迅速”响应,因为马达需要一定的时间来改变功率。就是说机器人的动作要比P控制器的命令滞后,这对P控制器的精确控制,会产生一定的困难。

在控制器中加入“I”:PI控制器

(“I”:会给我们带来什么呢?)

为了提高P控制器的响应速度,我们在表达式中加入一个新的部分——积分,PID中的“I”。积分是高等数学中非常重要的内容,在这里,我们只需要直截了当地使用它。
积分用于计算误差的动态求和。
每次我们读取光电传感器的值,并计算error(误差)时,我们将error(误差)加到一个变量中,这个变量我们称之为integral(积分)。
integral(积分)=integral(积分)+error(误差)
这个表达式不是普通的数学表达方式,它使用了将一系列数值累加的方法,这个方法在编程中经常使用。在计算机程序里,这个表达式有着和数学不相同的含义。(在本文中,会用文字加重的方式来表明这是编程的方式,而不是普通的数学表达式。)这个“=”是赋值的意思,意味着将它右边的计算结果赋值给左边的那个变量名,就是计算机把原有的integral的值加上error的值,将结果赋值给integral。

接下来,同P的部分一样,我们对integral乘以一个比例常数,这是另一个K。因为这个比例常数与积分部分有关,所以我们称其为Ki。与P比例控制部分相同,我们把integral(积分)乘以一个常量,会得到一个修正值。我们要把这个修正值加到Turn变量中去。

Turn=Kp*(error) +Ki*(integral)

上面就是PI控制器的基本表达式。Turn是对马达的修正,Kp*(error) 是比例控制部分,Ki*(integral)是积分控制部分。
积分控制部分有什么作用呢?如果误差在几次循环中都保持同样的值,积分部分就会越来越大。例如,如果我们读取光电传感器值,计算出error为1,很短时间后,我们再次读取光电传感器值,这一次error为2,第三次的error还是为2,那么此时的integral将是1+2+2=5。Integral为5,但这一步的error只为2。在修正量中,积分部分能产生很大的影响,但通常来说,它需要比较长的时间才能发挥作用。
积分控制的另一个作用是能去除小的误差。在巡线过程中,如果光电传感器非常接近线的边缘,但又不是正好在线的边缘上,那么error会很小,只能产生一个很小的修正量。你可以通过改变比例控制中的Kp来修正这个小的error,但经常会产生机器人的振荡(来回摇摆)。积分控制部分就可以完美地修正小的误差,因为integral(积分)是对errors(误差)的累加,几个连续的小误差可以使integral(积分)大到足以发生作用。
我们可以把积分控制理解为控制器的"memory"(存储器)。Integral(积分)表现的是error(误差)累积的过程,可以持续向控制器提供修正误差的方法。

有关积分的一些微妙问题

我隐藏了一个小问题(其实也不是小问题,但是我们要把它变成小问题)—— 时间。积分计算的其实是error×(单位时间) 的总和,单位时间(dT)是我们从上一次读取光电传感器值到这一次读取光电传感器值的时间间隔。
integral=integral+error*(dT)

因此,我们每次向integral中增加的应该是error×dT。测量机器人的dT是相当容易的事。在每次读取光电传感器值时,我们可以读取计时器的值。如果我们从当前时间中减掉上一次的时间,就得到了从上一次读值起的dT。如果不去测量这个dT,不做乘法计算,是不是会更好一些呢?如果这个dT总是相同值呢?如果我们每一次加入到integral中的部分,其dT值都是相同的,我们就能够把因数dT从error×(dT)中提取出来,只做求和的运算。
integral=integral+error
实际上只有当我们需要用integral做另外的运算时,我们才需要去乘以dT。因此我们可以把这个时间因数藏起来。在PI控制器中,积分部分的表达式是Ki×(integral)×dT,其中Ki是一个需要我们进行微调的系数(就像Kp一样),所以为什么不用一个新的Ki来代替Ki×dT这一部分呢?这个新的Ki与原来的是不同的,但是因为我们哪个都不知道,所以用哪一个、叫什么,都没有关系。无论它叫什么、代表什么含义,我们都需要通过反复试验来找到相对准确的值。
所以,只要把所有的时间步进值——dT设定成相同的(或大致相同的)值,我们就可以从积分控制部分中去除时间因素。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top