智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 3825|回复: 4
打印 上一主题 下一主题

小车巡线控制算法

[复制链接]

1

主题

6

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
272
威望
232
贡献
38
兑换币
0
注册时间
2010-10-25
在线时间
1 小时
跳转到指定楼层
1#
发表于 2010-10-26 17:25:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
控制算法
电机控制算法的作用是接受指令速度值,通过运算向电机提供适当的驱动电压,尽快地和尽快平稳地使电机转速达到指令速度值,并维持这个速度值。换言之,一旦电机转速达到了指令速度值,即使在各种不利因素(如斜坡、碰撞之类等使电机转速发生变化的因素)的干扰下也应该保持速度值不变。为了提高机器人小车控制系统的控制精度,选用合适的控制算法显得十分必要。控制算法是任何闭环系统控制方案的核心,然而并非越复杂、精度越高的算法越好,因为比赛要求非常高的实时性,机器人必须在非常短的时间内作出灵敏的反应,所以现代的一些先进控制算法,比如模糊控制、神经元网络控制等就不能应用到小车控制系统里。本系统选用了最常规、最经典的PID控制算法,通过实际应用取得了很好的效果。

1 比例项
控制回路中的第一个偏差转换环节就是比例项。这一环节简单地将偏差信号乘以常数K 得到新的CV值(值域为-100~100)。基本的比例控制算法如下:
loop:
          PV=ReadMotorSpeed()
          Error=SP-PV
          CV=Error*Kprop
          Setpwm(cv)
          Goto loop

上一段程序中的SetPWM()函数并非将CV值作为绝对的PWM占空比来对待。否则,不断降低的偏差值会使输出值接近零,而且由于电机工作时需要持续的PWM信号,控制系统将会使电机稳定在低速运转状态上,从而导致控制系统策略失败。
相反,CV值一般被取作当前PWM占空比的改变量,并被附加到当前的PWM占空比上。这也要求SetPWM()函数必须将相加后得到的PWM占空比限制在0%~100%。正的CV值将使电机两端电压增加。负的CV值将使电机两端电压降低。如果CV值等于0,则无需改变但前占空比。较低的K 值会使电机的速度响应缓慢,但是却很平稳。较高的K 值会使速度响应更快,但是却可能导致超调,即达到稳定输出前在期望值附近振荡。过高的K 值会导致系统的不稳定,即输出不断震荡且不会趋于期望值。

2 微分项
任何变量的微分项被用来描述该变量是如何相对于另一个变量(多位时间)变化的。换句话说,任何变量的微分项就是它随时间的变化率。如位移随时间的变化率是速度。速度相对于时间的微分是加速度。
在PID控制器中,值得关心的是偏差信号相对于时间的微分,或称变化率。绝大多数控制器将微分项定义为:
                          Rate=(E-E )/T
式中,E为当前偏差,E 为前次偏差值,T为两次测量的时间间隔。负的变化率表明偏差信号的改善。当微分项被具体应用于控制器中时,将一个常数乘以该微分项,并将它加到比例项上,就可以得到最终的CV值计算公式:
                        CV=( K  E)+( K  Rate)
当偏差信号接近零时,CV值将为负,所以当偏差信号开始改善时,微分项的作用将逐渐减弱校正输出量。在某些场合下,微分项还有利于超调量的消除,并可以允许使用较大的K 值,从而可以改善响应的快速性。微分环节还预示了偏差信号的变化趋势。当控制对象对控制器的输出响应迟缓时,微分环节的作用尤为明显。
    含有微分项的控制算法的伪代码实现如下:
  loop:
          PV=ReadMotorSpeed()
          LastError=Error
          Error=SP-PV
          Rate=Error-LastError
          CV=Error*Kprop+Krate*Rate
          SetPWM(CV)
          Goto loop

3 积分项
积分正好与微分相对。假如有一个描述变化率(微分)的表达式,那么对该表达式的积分就将得到随时间变化的原物理量。如加速度的积分是速度,速度的积分是位移。
在PID控制回路中,偏差的积分代表从控制开始时算起所有偏差积累的总和。该总和被常数K 所乘后再添加到回路输出中。在回路中,如果没有积分环节,尽管控制系统也会趋于稳定,但是由于某种原因输出值可能最终也无法达到SP值。
一个简单但完全的PID控制器地伪代码实现如下:
        loop:
          PV=ReadMotorSpeed()
          LastError=Error
          Isum=Isum+Error
          Error=SP-PV
          Rate=Error-LastError
          CV=Error*Kprop+Krate*Rate+Kint*Isum
          SetPWM(CV)
          Goto loop

由于积分项会越来越大,这就会使控制回路在SP值的改变时响应变慢,某些应用场合在CV值达到取值边界(如为:-100~100)时会停止累加Isum。在SP值改变时,也可以除去Isum项。

0

主题

5

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
214
威望
175
贡献
37
兑换币
0
注册时间
2011-4-10
在线时间
1 小时
2#
发表于 2011-4-17 21:09:56 | 只看该作者
好·········
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
214
威望
175
贡献
37
兑换币
0
注册时间
2011-4-10
在线时间
1 小时
3#
发表于 2011-4-17 21:10:02 | 只看该作者
好·········
回复 支持 反对

使用道具 举报

0

主题

126

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
486
威望
329
贡献
37
兑换币
0
注册时间
2010-10-16
在线时间
60 小时
4#
发表于 2011-5-3 21:44:51 | 只看该作者
xieixe
回复 支持 反对

使用道具 举报

3

主题

229

帖子

0

精华

高级会员

Rank: 4

积分
948
QQ
威望
465
贡献
213
兑换币
4
注册时间
2010-10-19
在线时间
135 小时
5#
发表于 2011-5-10 12:44:58 | 只看该作者
very good
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-9-22 23:27 , Processed in 0.374751 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表