第三届智能汽车邀请赛军交3队技术报告.docx
《第三届智能汽车邀请赛军交3队技术报告.docx》由会员分享,可在线阅读,更多相关《第三届智能汽车邀请赛军交3队技术报告.docx(31页珍藏版)》请在冰豆网上搜索。
第三届智能汽车邀请赛军交3队技术报告
摘要
本智能车系统设计以MC68S912DG128微控制器为核心,通过光电传感器检测小车的位置和运动方向,光电编码器检测模型车的速度,PID控制算法调节驱动电机的转速和舵机的方向,完成对模型车运动速度和运动方向的闭环控制。
实验结果表明,系统设计方案可行。
关键词:
MC9S12DG128,光电传感器,PID
第一章:
引言1
1.1设计制作思路1
1.2设计方案概述3
第二章:
硬件部分3
2.1车模组装3
2.2传感器的设计与安装4
2.2.1光电传感器的选择及工作原理4
2.2.2光电传感器的布置方案5
2.2.3光电传感器信号探测及处理电路6
2.2.4速度传感器的安装7
2.3系统电路板的设计、安装与连接7
2.4驱动电机和舵机9
2.4.1工作原理9
2.4.2电路设计9
2.5主要车模参数11
第三章:
软件部分12
3.1控制算法12
3.1.1理论介绍12
3.1.2程序实现16
3.2代码设计16
第四章:
结论22
4.1主要性能22
4.2改进方向22
参考文献I
附录:
程序源代码II
第一章:
引言
1.1设计制作思路
为了实现对小车的智能控制,本设计以MC9S12DG128为核心,将传感器得到的路况信息进行综合判别和处理,然后以脉宽调制(PWM)的方式控制舵机转向和驱动电机加速或减速,从而控制小车,使小车能够快速、准确地识别特定路线并按适当速度行驶。
多传感器并行工作、CPU的综合数据处理为小车实现自动加速、减速、限速、左转、右转提供了充分的保证。
先后经过了组装车模、传感器的选择与布置、系统电路板的设计与安装、开发工具BDM的调试以及控制算法的不断改进等过程,完成对智能车粗略控制到精确控制,并使智能车由低速逐渐向高速过渡。
在实验的基础上不断发现问题,并不断调试解决问题,使智能车能够最大限度地沿着轨道快速、准确地行驶。
1.2设计方案概述
本设计方案主要分硬件、软件和结论三个方面进行介绍。
硬件部分主要阐述了外部传感器的选择、安装、传感器的探测原理、传感器的探测电路设计,系统电路板的电路设计及安装,驱动电机和舵机的控制。
软件部分主要介绍了控制算法的理论知识,程序以及代码的设计。
结论部分主要指出了小车的性能以及改进的方向。
现在对本技术报告的主要部分概括介绍如下:
传感器部分:
本智能车的传感器采用了反射式红外光电传感器,一字形布置。
智能车通电后,光电传感器的发光管发出探测光,如果探测到白色部分,接收管能够接收到反射光;如果探测到黑色部分则探测光被吸收,接收管就接收不到反射光。
根据此原理,把电信号转换成数字信号,从而把路面信息反映到控制系统,通过CPU的综合数据处理,对智能车的转向和速度进行控制。
控制系统部分:
我们制作了以MC9S12DG128芯片为核心的系统电路板,它给布置线路带来了极大的方便,并可以非常方便地安装在智能车上,使系统得到了简化。
控制算法部分:
采用了目前自动控制领域中最常用的控制算法PID控制算法进行车辆行驶控制。
在本方案的设计中采用了PID直接计算法。
在行驶过程中,由于车辆转向造成车辆中心与黑线有一定的偏差量,我们就选择这一偏差量作为输入的偏差。
本设计方案中以前排电路板的中心为车辆中心线所在位置,在车辆行驶过程中,当某一传感器感应到黑线位置时,就以该传感器与电路板中心的距离作为车辆的行驶偏差,以此作为PID控制器的输入量。
为了改善控制算法中输入量不连续的问题,我们引入车速作为算法辅助输入量。
开发工具我们采用了主办方提供的BDM调试器,在本报告中就不再赘述。
第二章:
硬件部分
2.1车模组装
严格按照说明对车模进行组装。
重点对舵机的安装方法和模型车的机械结构进行了调整。
舵机的调整
根据小车在快速行进中的转向特点,我们对舵机的安装方法进行了如下的调整,如图2.1所示:
图2.1
通过这种安装方法增加了从舵机到连杆之间的长度,这样与以前的长度相比让前轮转过同样的角度舵机只需转过比以前更小的角度,虽然舵机本身的动作的速度没有变,但对于转向来说则比以前更快了。
其次,把舵机立起来放置,使舵机位于两轮的中心线上,再把连接两轮胎到舵机的连杆改为一样长,使舵机左右转向时受力比较均匀,使舵机能灵活的转向。
通过以上这些改造舵机的响应速度提高许多,为快速灵巧的转向提供了硬件的保证。
模型车前轮的调整
主销后倾角的调整:
模型车通过增减黄色垫片的数量来改变主销后倾角,每侧有4片垫片,前2后2,后倾角为0°;前1后3,后倾角为2°~3°;前0后4,后倾角为4°~6°.欲使模型车转向灵活,主销后倾角可设定为0°,即招牌前2后2;欲增大回正力矩,后倾角可设定为2°~3°,即垫片前1后3;一般情况下后倾角不宜设定为4°~6°。
主销内倾角的调整
主销内倾角是前轮主销在赛车水平面内向内倾斜的角度,虽然增大内倾角也可以增大回正的力矩,但增大内倾角会在赛车转向的过程中,增大赛车与路面的滑动,从而加速轮胎的磨损,由于轮胎对地的附着力对防止侧滑有很重要的影响,所以如果轮胎磨损则得不偿失,所以内倾角调整为0°。
前轮外倾角的调整
前轮外倾角是前轮的上端向外倾斜的角度,如果前面两个轮子呈现“V”字形则称正倾角,呈现“八”字则称负倾角。
由于前轮外倾可以抵消由于车的重力使车轮向内倾斜的趋势,减少赛车机件的磨损与负重,所以赛车安装了组委会配备的外倾角为1°的配件。
前轮前束的调整
前轮前束是前轮前端向内倾斜的程度,当两轮的前端距离小后端距离大时为内八字,前端距离大后端距离小为外八字。
由于前轮外倾使轮子滚动时类似与圆锥滚动,从而导致两侧车轮向外滚开。
但由于拉杆的作用使车轮不可能向外滚开,车轮会出现边滚变向内划的现象,从而增加了轮胎的磨损。
前轮外八字与前轮外倾搭配,一方面可以抵消前轮外倾的负作用,另一方面由于赛车前进时车轮由于惯性自然的向内倾斜,外八字可以抵消其向内倾斜的趋势。
外八字还可以使转向时靠近弯道内侧的轮胎比靠近弯道外侧的轮胎的转向程度更大,则使内轮胎比外轮胎的转弯半径小,有利与转向。
2.2传感器的设计与安装
2.2.1光电传感器的选择及工作原理
根据对市场上的光电传感器进行调查分析后,我们采用了反射式红外光电传感器,以一定的频率向CPU提供路面标志信号。
CPU经过比较处理,粗略判断出小车所处的相对位置。
该传感器体积小,价格便宜,使用方便,而且占用系统资源较少。
为了获得更远的前瞻距离,我们选用了探测距离为5~6cm的红外光电传感器。
工作原理如图2.2所示:
路
接收
面
探测距离
图2.2传感器工作原理图
反射式光电传感器有发射管和接收管组成,工作时由发射管发射红外线,经被探测物体面反射,反射的红外线由接收管接收,接收管把接收的物理信号转换成电信号。
被检测物体表面的颜色和粗糙程度影响反射光的强弱,反射面越不光滑,颜色越暗,反射光就会越弱。
我们这里就是要运用红外光电传感器对颜色敏感的特点,当检测物体表面的颜色为黑色时,反射光很弱,接收管接收的光线可以忽略,使接收管处于一种状态,例如开关管截止;当检测物体表面的颜色为白色时,反射光较强烈。
使接收管处于另一种状态,例如开关管导通。
这两种相反的状态表现在电路中就是高低电平组成的脉冲信号。
这个脉冲信号就是控制系统的输入信号,并且设高电平的输入信号为1低电平信号输入为0。
通过编写控制算法,根据传感器搜集的路况信息,调节PWM的占空比,控制舵机和驱动电机,实现小车的智能控制。
2.2.2光电传感器的布置方案
为了减弱外界光线对反射式红外光电传感器的影响,且考虑到小车底盘较低,我们把传感器放置在设计的电路板下,垂直探测地面。
传感器的布置方案有单排、双排、W字形排列等。
我们采用了单排一字形的排列方式。
具体的布置方式如图2.3,也就是在车模的头部安装一块电路板,其底部安装13个传感器。
通过对传感器探测到黑色导航线的情况的分析,我们用编码的形式把传感器探测到的路面信息表示出来。
然后把这些路况信息输入到控制系统通过编写的控制算法就可以控制舵机和驱动电机,实现智能车的加速、减速、左转、右转了。
通过不断的实验,来进一步地调整各种编码下,智能车要转的角度的参数。
改进算法,采用PID控制算法,它可以解决车辆行驶速度与转向角度大小的相关性问题,行驶轨迹的跟踪及预测问题;我们还最大限度地增大传感器的预描距离,在满足组委会规定的尺寸内,让传感器的安装位置尽量向前靠。
图2.3
带传感器的电路板的布置如图2.4所示:
两个相邻的传感器的中心距离位1.8cm;
传感器距地面的高度为5cm,离车身前沿的距离为10cm.传感器的探测有15°的外倾角。
图2.4
2.2.3光电传感器信号探测及处理电路
传感器信号探测及处理电路设计如图2.5所示:
图2.5
D1为红外光电传感器的发射管,D2为其接收管。
D1发射红外线,D2接收信号,判断是否有反射信号。
如果有则D2输出高电平,如果没有则输出低电平,信号经过三极管、集成运放器输出到CPU的PORTA或PORTB。
13个传感器获得的信号并行输入单片机,从而把路面信息反馈到控制系统,实现对智能车的控制。
制作电路板后,要把探测电路上的元件一一对应地焊接到电路板上。
焊接电阻时,要注意防止虚焊;焊接插件时要注意避免两个焊接点连接在一起造成短路;焊接发光二极管和接收二极管前要用万用表测量一下极性,防止将二极管反向安装。
2.2.4速度传感器的安装
编码器
编码器
图2.6
速度传感器安装于车模后部,可以从电机的驱动齿轮上安装取速齿轮,也可以从后轴的大齿轮上安装取速齿轮,通过取速齿轮带动电子编码器,当车轮转动时取速齿轮随之转动,电子编码器随之向单片机输出脉冲信号,从而获得车模的速度。
如图2.6所示,速度转感器的安装与固定要考虑到信号的准确性和稳定性。
2.3系统电路板的设计、安装与连接
我们没有采用主办方提供了核心S12的电路板,自行设计了系统电路板。
首先核心S12电路板体积比较大,既不方便在智能车上安装,也不美观;其次在核心S12电路板上找到正确的引脚插线,也显得比较复杂。
我们设计的系统电路板就解决了这方面的问题,可以把它很方便地固定在智能车的底盘上,并制作了转用的插槽。
我们制作了以MC9S12DG128芯片为核心,并附以复位电路、晶体振荡器及时钟电路、+5V的电源、驱动电机的供电插座、单片机引脚插槽以及其他一些常规电子元件组成的系统控制电路。
系统控制电路原理图如图2.7所示:
图2.7
本设计自制了单片机最小系统板,主要包括以下几部分:
时钟电路、复位电路、串口RS-232驱动电路等(如图2.8所示)。
安装方法如图2.9所示。
图2.9最小系统板安装图
2.4驱动电机和舵机
2.4.1工作原理
图2.10舵机和电机工作原理原理图
驱动电机和舵机是智能车整个系统的执行部件。
以MC9S12DG128芯片为核心的控制系统由传感器获得路面信息,通过PID控制算法来调节舵机和驱动电机的PWM的占空比,控制智能车的转向和车速。
其工作原理图2.10所示。
本次比赛要求不得对驱动电机进行改造,本文对其不再赘述。
2.4.2电路设计
本设计的电源模块具有5V供电和3.3V供电两种输出电压,两种稳压的电路图如图2.11所示。
本设计的舵机采用PWM脉冲控制,通过调整脉冲的占空比实现舵机的左转和右转,如图2.12所示。
MC9S12DG128具有8路8位PWM通道(即4路16位PWM通道),并且用PWM模块产生方波并不占用CPU资源。
为了获得尽量高的转向速度,本设计用电池直接给舵机供电。
为了获得较高的转向精度,用1路16位PWM(PWM67)控制舵机旋转,将前轮从左极限位置旋转到右极限位置所需的舵机转角分成数百份,即获得数百个转向级别,足以满足设计需要。
本设计用H桥芯片MC33886驱动直流电机。
由于电机启动和快速加速时所需电流较大,采用两片MC33886并联工作。
MC33886的D2和D1脚直接接地和接高电平,使MC33886按预设方式工作,用PWM5和PWM0作为输入信号,OUT2和OUT1分别为功率放大了的相应的输出信号,控制电机转动。
通过调整PWM5和PWM0的占空比,实现车模的加速、减速,甚至制动(电机反转实现制动)。
MC33886驱动电路图如图2.13所示。
本设计中的各个硬件模块的设计为车模的行驶稳定性和快速性提供了坚实的基础,各个功能模块的调试与功能实现都符合大赛相关规定。
2.5主要车模参数
a)车重:
1.5kg长:
384mm宽:
185mm高:
77mm
b)电路功耗:
所有电容总容量:
1589uF
c)传感器种类:
反射式红外光电传感器数目:
13
d)伺服电机个数:
0
e)赛道信息检测精度:
6mm频率:
1000Hz
第三章:
软件部分
3.1控制算法
本智能车辆的控制算法部分主要需解决如下问题:
车辆直线行驶的稳定性问题,车辆转弯控制问题,车辆行驶速度与转向角度大小的相关性问题,行驶轨迹的跟踪及预测问题等。
为了更好的解决设计中存在的问题,本方案采用了目前自动控制领域中最常用的控制算法PID控制算法进行车辆行驶控制。
3.1.1理论介绍
PID控制算法包括直接计算法和增量算法,所谓的增量算法就是相对于标准的相邻两次运算之差,得到的结果是增量。
也就是说在上一次的控制量的基础上需要增加(负值意味着减少)控制量,例如对于智能小车控制算法,就是智能小车相对于上一次转向角度还需要增加或减少的转向角度。
在本方案的设计中采用了PID直接计算法。
(一)PID算法中常用概念解释如下:
1、基本偏差e(t)
表示当前测量值与设定目标间的差,设定目标是被减数,结果可以是正或负,正数表示还没有达到,负数表示已经超过了设定值。
这是面向比例项用的变动数据。
2、累计偏差:
公式1
表示每一次测量到的偏差值的总和,这是代数和,是面向积分项用的一个变动数据。
3、基本偏差的相对偏差e(t)-e(t-1)
表示用本次的基本偏差减去上一次的基本偏差,用于考察当前控制对象的趋势,作为快速反应的重要依据,这是面向微分项的一个变动数据。
4、三个基本参数:
Kp,Ki,Kd
这三个参数是做好控制器的关键常数,分别称为比例常数、积分常数和微分常数,不同的控制对象需要选择不同的数值,还需要经过现场调试才能获得较好的效果。
5、标准的直接算法公式
公式2
(二)三个基本参数Kp,Ki,Kd在实际控制中的作用:
比例调节作用:
是按比例反映系统的偏差,系统一旦出现了偏差,比例调节立即产生调节作用用以减少偏差。
比例作用大,可以加快调节,减少误差,但是过大的比例,使系统的稳定性下降,甚至造成系统的不稳定。
积分调节作用:
是使系统消除稳态误差,提高无差度。
因为有误差,积分调节就进行直至无差,积分调节停止,积分调节输出一常值。
积分作用的强弱取决于积分时间常数Ti,Ti越小,积分作用就越强。
反之Ti越大则积分作用越弱,加入积分调节可使系统稳定性下降,动态相应变慢。
积分作用常与另两种调节规律结合,组成PI调节器或PID调节器。
微分调节作用:
微分作用反映系统偏差信号的变化率,具有预见性,能预见偏差变化的趋势,因此能产生超前的控制作用,在偏差还没有形成之前,以被微分调节作用消除。
因此,可以改善系统的动态性能。
在微分时间选择合适情况下,可以减少超调,减少调节时间。
微分作用对于噪声干扰有放大作用,因此过强的加微分调节,对系统抗干扰不利。
此外,微分反应的是变化率,而当输入没有变化时,微分作用输出为零。
微分作用不能单独使用,需要与另外两种调节规律相结合,组成PD或PID控制器。
(三)智能车辆PID控制算法中参数的选择
此次参赛的智能车辆主要是寻迹行驶,控制算法所要做的就是控制车辆沿着预先设计好黑线行驶,保证车辆中心线在黑线上。
在行驶过程中,由于车辆转向造成车辆中心与黑线有一定的偏差量,我们就选择这一偏差量作为输入的偏差。
本设计方案中以前排电路板的中心为车辆中心线所在位置,在车辆行驶过程中,当某一传感器感应到黑线位置时,就以该传感器与电路板中心的距离作为车辆的行驶偏差,以此做为PID控制器的输入量。
如图3.1所示:
图3.1
通过直接算法公式(公式2)计算出t时刻智能车的控制转向角,由此达到对智能车转向进行控制的目的。
但是由于输入量取值是由传感器的位置决定,而传感器的数量又是有限的,所以我们只能获得有限的精确输入量,这样通过控制算法得出的控制转角就不是很理想。
为了改善控制算法中输入量不连续的问题,我们引入车速作为算法辅助输入量。
通过车速、车辆上一次转角、车辆长度等值之间的数学关系,可以计算出车辆中心与黑线中心在一次传感器采样周期内的偏差,以此值与传感器采样值之间做比较,从而获得比较理想的偏差值,为控制算法找到较理想的输入量。
车速、车辆上一次转角、车辆长度等数值之间的关系可由图3.2导出:
经过△t时间后车辆转过的角度为
公式3
(
是车辆上一时刻的转角。
)公式4
图3.2
由图上各值的几何关系可知:
公式5
公式6
公式7
公式8
公式9
公式10
最后计算出的L即为经过t时间后车辆中心的横向位移,将此值与传感器获得的车辆中心与黑线的偏差进行比较,得到我们需要的输入量。
通过输入量与输出量之间的比较,初步定下PID控制算法中参数Kp,Ki,Kd的值,然后通过实验找到合适的三个控制参数值。
3.1.2程序实现
数值分析和变量之间的联系我们通过以上的分析过程已经基本了解,要通过程序将以上过程实现并达到预期的效果,还需要做一些准备工作。
首先是将转向舵机和驱动电机的驱动程序设计好,然后测出智能车的最大行驶速度和最大转角,量出车辆轴距以及程序设计中需要用的一些参数。
完成这些准备工作之后,画出程序流程图,如图3.3所示:
否
是
否
图3.3
图3.3
通过程序流程图,很快就可以确定下来编程方案,按照结构化程序设计的要求,对程序中的函数都进行模块化设计,保证程序的可读性和易维护性,实现预期的设计目的。
3.2代码设计
通过以上分析,我们在编程时需要解决以下问题:
(1)PID控制算法的程序实现
(2)基本计算函数的编程实现
(3)输入输出量与PID算法之间的结合
(4)变量之间数据类型的变化
根据以上的问题提出了下述解决方法:
定义PID计算的结构体如下:
typedefstructPID{
floatSetPoint;//设定目标DesiredValue
floatProportion;//比例常数ProportionalConst
floatIntegral;//积分常数IntegralConst
floatDerivative;//微分常数DerivativeConst
floatLastError;//Error[-1]
floatPrevError;//Error[-2]
floatSumError;//SumsofErrors
}PID;
(2)定义基本计算函数
floatPIDCalc(PID*pp,floatNextPoint)//PID计算
{
floatdError,
Error;
Error=pp->SetPoint-NextPoint;//偏差
pp->SumError+=Error;//积分
dError=pp->LastError-pp->PrevError;//当前微分
pp->PrevError=pp->LastError;
pp->LastError=Error;
return(pp->Proportion*Error//比例项
+pp->Integral*pp->SumError//积分项
+pp->Derivative*dError//微分项
);
}
floatR(floatx)//计算车辆转弯半径
{
floatresu=200.0*(cosf(x*3.1415926/180.0))*(cosf(x*3.1415926/180.0))/(sinf(x*3.1415926/180.0));
returnresu;
}
floatangela(floatx)//计算角度a
{
return(180.0+x-51.3);
}
floatangelb(floatx,floaty)//计算角度b
{
floatrest=(180.0*y*0.025)/(R(x)*3.1415926);
returnrest;
}
floatangelc(floatx)//计算角度c
{
floatresul=acosf((Rnext(x)*Rnext(x)+16400.0-R(x)*R(x))/(256.0*Rnext(x)))*180.0/3.1415926;
returnresul;
}
floatRnext(floatx)//计算车辆中心点转弯半径
{
floatresaff=R(x)*R(x)+16400.0-2.0*R(x)*128.0*cosf(angela(x)*3.1415926/180.0);
floatreste=sqrtf(resaff);
returnreste;
}
floatclength(floatx,floaty)//计算部分位移
{
return(2.0*Rnext(x)*sinf(y*3.1415926/180.0));
}
floatslength(floatx,floaty)//计算最终位移
{
return(clength(x,y)*sinf((90.0+y/2-38.66-angelc(x))*3.1415926/180.0));
}
(3)确定输入输出量与定义函数之间的关系
intcoding(unsignedcharsensors)
{inta=0;
floatlength=0.0,rIn=0.0;
switch(sensors)
{
case1:
length=12.5;;a=1;break;//speed=50
case3:
length=25.0;a=1;break;//speed=50;
case2:
length=37.5;a=1;break;//speed=45;
case6:
length=50.0;a=1;break;//speed=40;
case4:
length=62.5;a=1;break;//speed=35;
case12:
length=75.0;a=1;break;//speed=30;
case8:
length=87.5;a=1;break;//speed=26;
case16:
length=12.5;a=-1;break;//speed=50;
case48:
length=25.0;a=-1;break;//speed=50;
case32:
length=37.5;