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

PID非常好的光感巡线思路

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

数控制部分,我们是除以dT,而在积分控制部分,我们是乘以dT。我们会和在积分控制部分一样,采用同样的技巧从导数控制部分去掉这个dT。如果在每一个循环中dT的值相同,分数Kd/dT就是一个常量。我们可以用另外一个Kd来代替Kd/dT。同先前的Ks一样,这个K值是未知的,需要通过反复试验来确定,因此它是Kd/dT或是一个新的Kd,都没有关系。

现在我们可以写出PID控制器的完整公式了:

Turn(转向)= Kp*error(误差) +Ki*integral(积分)+Kd*derivative(导数)

显然,我们可以“预测将来”了,但是这么做有什么帮助?预测又能准确到什么程度呢?
如果当前误差比前一个误差更糟糕,导数控制部分就会纠正这一误差。如果当前误差比前一误差要好一些,导数控制控制部分就会停止控制器去纠正这个误差。第二个非常有用的作用是,误差越接近于0,我们就越接近想正确停下的那个点。但是系统可能需要一段时间来响应马达功率的变化,因此我们在误差趋近于0之前,就要开始降低马达的功率,以防止过冲。不用担心导数控制部分的方程式很复杂,你所要做的只有一件事,就是按照正确的顺序做减法运算。所谓正确的顺序,就是用“当前”减去“前一个”。因此在计算导数时,我们要用“当前误差”减去“前一个误差”。

PID控制器的虚拟代码

在控制器中加上导数控制部分,我们需要为Kd增加一个新的变量,还需要增加一个变量来记录最后一个误差。同样不要忘记,我们在Ks上乘以100,来进行整数运算。
Kp = 1000 !记住我们用 Kp*100,因此Kp实际为10
Ki = 100 !记住我们用Ki*100,因此Ki实际为1
Kd = 10000 !记住我们用Kd*100,因此Kd实际为100
offset= 45 ! 初始化变量
Tp = 50
integral = 0 ! 用于存储积分的变量
lastError =0 !用于存储最后一个误差值的变量
derivative = 0 ! 用于存储导数的变量
Loop forever
LightValue = read light sensor ! 当前光电传感器的读值
error = LightValue - offset ! 减掉 offset(补偿量),计算误差值
integral = integral + error ! 计算积分值
derivative = error - lastError !计算导数值
Turn = Kp*error + Ki*integral +Kd*derivative! “比例控制部分”+“积分控制部分”+“导数控制部分”
Turn = Turn/100 ! 记住消除Kp,Ki和 Kd中因数100的影响!
powerA = Tp + Turn ! A马达功率值
powerC = Tp - Turn ! C马达功率值
MOTOR A direction=forwardpower=PowerA !在马达模块中设置A马达的功率值和转向
MOTOR C direction=forwardpower=PowerC ! 在马达模块中设置A马达的功率值和转向
lastError = error !把当前误差存储在变量lastError中,作为下一次循环的最后一个误差
end loop forever ! 结束循环,返回,进行下一次循环
以上就是PID控制器用于巡线机器人的完整代码。这其中最困难的部分,就是如何把Kp,Ki和Kd调整到最好的,至少是调整到还说的过去。

调整PID控制器,不使用复杂的数学方法

(但是我们还是要做一些计算)

在本文中,我使用了其他人总结出来的PID控制器调整的方法,测量几个系统参数就可以让你非常好地计算出Kp,Ki和Kd的值。有几种技术可用于计算Ks,其中之一就叫做 "Ziegler–Nichols方法" 。通过谷歌搜索可以找到很多讲述这种技术的网页。我所使用的版本几乎是直接使用了维基网页——PID控制器中的内容(在很多其他的地方也可以找到相同的内容),我只做了一点小小的改动,包括下表中所示计算过程中的循环时间。
按以下步骤调整PID控制器:

将Ki和Kd的值置为0,即关闭控制器中的这些部分,将控制器作为一个简单的比例控制器。

把Tp(目标功率值)设置的小一点。对于我们使用的马达来说,可以设为25.

将Kp设置为一个“合理”的值,什么是合理的?

1)用我们想让马达功率达到的最大值(100)除以能使用的最大误差值。对于我们的巡线机器人,我们假定这个最大误差是5,所以推测出Kp值为 100/5=20。当误差为+5,,马达的功率将达到100,。当误差为0,马达的功率会在Tp(目标功率值)上。

2)或者,将Kp值设为 1 (或100),看看会发生什么。

3)如果你要把 Ks的值乘以100,在这里,1就要记成100,20记成2000,100记成10000.

运行机器人,观察运行状态。如果它不能巡线,从线上脱离开,就提高Kp值;如果它剧烈摆动,就降低Kp 值。调整Kp值,直到机器人能够巡线,并且没有明显的摆动

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

网站地图

Top