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

PID非常好的光感巡线思路

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

积分具有记忆性

关于integral(积分),还有最后一个要注意的细节。通常情况下,integral(积分)只能趋近于0,我们加入到integral(积分)中的error(误差)值绝大多数都是符号相异的,在integral为0 时,它对控制器是不起任何作用的。例如,在经过几次循环后,error(误差)值为1,2,2,3,2,1,相加后得到integral(积分)为11。在最后一点的error(误差)仅为1,比在那一点的integral要小很多。让integral趋近于0 的方法只有一个,就是加入负的error(误差)来平衡早期加入的正的error(误差),来逐渐减少integral。如,下面几个error(误差)是-2,-2,-3,则integral(积分)会从11降到4,还需要加入更多的负error(误差),才会使积分降到0。此外,integral(积分)期望error(误差)在正负误差之间均匀分布。
如果巡线机器人在线边缘的左侧,而积分部分累积的误差也在线的左侧,那么积分控制部分不仅要把机器人送回线的边缘,还要使机器人越过线,到线的右侧。如果有大的误差持续一段时间,积分会趋向于无穷。这在包含有积分控制的控制器里,会引起一些问题。当积分部分设法修正的误差很大时,积分的这种倾向会引起超调,我们必须在程序上做一些调整以避免出现问题。解决integral(积分)趋向于无穷问题,有两个常见的解决方案:(1)将integral(积分)置零——每次error(误差)为0,或error(误差)改变符号,就将变量integral(积分)设置为0;(2)当计算一个新的integral时,对累积的integral乘以一个小于1的因数来抑制积分:
integral = (2/3)*integral + error
这样,每次循环会把积分值降低1/3。如果你认为积分控制部分是一个控制器的“memory”(存储器),那么这种抑制会在一段“较长”的时间后强迫它变得健忘起来。

PI控制器的虚拟代码

在控制器中加入积分控制部分,我们需要增加新的变量Ki和integral。别忘了,为了进行整数运算,我们要把Ks乘以100。
Kp = 1000 !记住我们用 Kp*100,因此Kp实际为10
Ki = 100记住我们用Ki*100,因此Ki实际为1
offset = 45 ! 初始化变量
Tp = 50
integral = 0在这个变量里存储积分值
Loopforever
LightValue = read light sensor ! 当前光电传感器读值
error = LightValue - offset !减去offset(补偿量)计算error(误差)
integral = integral + error新增的积分控制部分
Turn = Kp*error+ Ki*integral比例控制部分”+“积分控制部分”
Turn = Turn/100 ! 记住消除Kp,Ki中因数100的影响 !
powerA = Tp + Turn ! A马达的功率值
powerC = Tp - Turn ! C马达的功率值
MOTOR A direction=forwardpower=powerA! 在马达模块里设置A马达的功率值和转向
MOTOR C direction=forwardpower=powerC! 在马达模块里设置C马达的功率值和转向
end loop forever ! 结束循环,返回,进行下一次循环 ! “ ! ! !

在控制器中加入“D”:完整的PID控制器

(“D”:接下来会发生什么?)

我们的控制器里有了比例控制部分,用于纠正当前的误差;有了积分控制部分,用于纠正过去的误差。有没有一种办法能让我们及时预测未来,对还没发生的误差进行纠正呢?
这就要用到高等数学里的另一个概念——导数,就是PID中的D。像积分一样,导数也是高等数学中相当重要的数学方法。
假定误差的下一个变化与当前最后一个变化是相同的,我们据此来预测将来。
这个意思是说,下一个误差的期望值是:当前误差+前两次传感器采样误差的变化量。在两个连续点之间的误差变化量就叫做导数。导数是一条直线的斜率。

看上去,计算起来有些复杂。用数据举例能帮助我们说明这个问题。让我们假设当前误差是2,前一个误差是5,那么我们预测的下一个误差会是多少呢?误差的变化,也就是导数,是:

(当前误差)-(前一个误差)

按照我们的数值就是 2 - 5 = -3 。因此,当前的导数就是-3 。我们使用导数预测下一个误差就是

(下一个误差) = (当前误差)+ (当前导数)

按照我们假定的数值就是2 + (-3) = -1 。因此,我们预测下一个误差会是-1 。在实践中,我们实际上并不是要完全一致地预测下一个误差。相反地,我们只是在控制器的公式中直接使用导数。

导数控制部分,与积分控制部分一样,实际上也包含时间因素,正式的导数控制部分是:

Kd(导数)/(dT)

与比例控制和微分控制一样,我们需要对导数乘上一个常量。因为这个常量是与导数相关的,因此被称之为Kd。注意,在导

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

网站地图

Top