第五届飞思卡尔杯全国大学生智能汽车竞赛技术报告.docx
《第五届飞思卡尔杯全国大学生智能汽车竞赛技术报告.docx》由会员分享,可在线阅读,更多相关《第五届飞思卡尔杯全国大学生智能汽车竞赛技术报告.docx(66页珍藏版)》请在冰豆网上搜索。
第五届飞思卡尔杯全国大学生智能汽车竞赛技术报告
第五届飞思卡尔杯全国大学生智能汽车竞赛技术报告
第一章引言
“飞思卡尔杯”智能车大赛起源于韩国,是韩国汉阳大学汽车控制实验室在飞思卡尔半导体公司资助下举办的以HCSl2单片机为核心的大学生课外科技竞赛。
组委会提供一个标准的汽车模型、直流电机和可充电式电池,参赛队伍要制作一个能够自主识别路径的智能车,在专门设计的跑道上自动识别道路行驶,谁最快跑完全程而没有冲出跑道并且技术报告评分较高,谁就是获胜者。
其设计内容涵盖了控制、模式识别、传感技术、汽车电子、电气、计算机、机械、能源等多个学科的知识,对学生的知识融合和实践动手能力的培养,具有良好的推动作用。
智能小车系统由HCS12微控制器、电源管理单元、路径识别电路、车速检测模块、舵机控制单元和直流驱动电机控制单元组成。
本系统以飞思卡尔公司的16位微处理器MC9S12XS128为控制核心,并采用CodeWarrior软件编程和BDM作为调试工具。
运用激光发射强大光线,使用采集光敏传感器AD值进行道路信息采集,并采用PWM技术来控制舵机的转向和电机转速。
舵机控制主要采用PWM信号开环控制,而速度控制方面,由数据表来设定速度,PID控制来调整速度。
通过将总线频率超频到40M来更快更准确地进行控制。
各个部分经过MCU的协调处理,能够以较快的速度在指定的轨迹上行驶,在进弯道之前能够提前减速并改变角度,达到平滑过弯和减小路程的效果。
在前几个月的努力中,我们自主设计机械结构和控制电路,构思独特算法,并一次次地对单片机具体参数进行调试。
可以说,这辆在跑道上奔驰的小车凝聚着我们的汗水和智慧。
在准备比赛的过程中,我们小组成员涉猎多个学科,这次磨练对我们的知识融合和实践动手能力的培养有极大的推动作用。
第二章方案选择
智能汽车比赛以快速平稳地完成赛程作为目标,这就要求赛车能够快速准确地检测跑道路径,及时做出合理的控制并迅速执行。
这跟总体方案的确立有很大的联系。
2.1路径识别传感器的选定
路径识别模块是智能车系统的关键模块之一,路径识别方案的好坏,直接关系到最终性能的优劣,因此,选定黑线识别传感器模块是总体方案确立的首要步骤。
主要有以下几种识别方法:
(1)使用光电发射接收管来检测黑线:
光电发射管发射出光,经过赛道的反射回来,由于白色平面和黑线反射光强度不同,不同位置上的光电接收管接收到强弱不同的光,因此可以判断出黑线相对小车的位置。
这种检测的方法明显的优点是检测速度快,检测的方法简单,成本相对低廉。
但是比赛规定传感器不能超过16个,这样就限制了水平分辨率。
不能精确的分辨黑线的位置,同时也许垂直分辨率可能只有一线,不能很好的预测路径的走线。
总的来说使用这种方法优点很明显,缺点也很明显。
(2)使用图像传感器CCD来检测黑线:
图像传感器分为线阵和面阵两种。
线阵的图像传感器分辨率高,能克服光电传感器水平分辨率低的缺陷,但是检测速度较慢,且垂直分辨率只有一线。
面阵的图象传感器成象是一个平面,无论是水平分辨率还是垂直分辨率都很高,识别上具有很大的优势,可以做到提前预测路径,是最理想的路径检测传感器;但是数据量比前两种方案都大很多,而且数据处理较为困难,大大加重了单片机的负担。
(3)使用磁传感器来检测黑线:
黑线下面部有电线,通电后会产生磁场,根据磁场场强大小和电线距离的关系,可以用磁传感器测出车体与黑线的相对位置。
这样检测稳定,但是磁场场强大小与电线距离有着较复杂的非线性关系,而且使用磁传感器无法做到很好的前瞻,这是对车速很大的限制。
比较了三种传感器优劣之后,决定选用应用广泛的光电传感器,相信通过选用大前瞻的激光传感器,加之优秀的程序控制和较快的信息处理速度,相信激光传感器可以极好的控制效果。
2.2系统总体框图
智能车系统采用飞思卡尔的16位微控制器MC9S12XS128单片机作为核心控制单元用于智能车系统的控制。
在选定系统采用光电传感器后,由安装在车前部的光电传感器负责采集信号,并将采集到的信号传入核心控制单元,核心控制单元对信号进行判别处理后,由内部ECT模块发出PWM波,分别对转向舵机、直流电机和制动电机进行控制,完成智能车的转向、前进和制动。
智能车驱动电机上安装有光电编码器,用来对车轮转速反馈信号的采取,经由核心控制单元进行专家PID控制算法自动调节输入到电机驱动模块的PWM波占空比,从而控制小车的速度。
另外,系统带有拨码开关选择程序的运行参数,还有液晶显示模块实时显示智能车的状态。
系统总体结构方框图如图2.1所示。
图2.1系统总体结构方框图
根据上面的方案设计,可知系统主要由以下几个部分组成:
(1)MC9S12X128主控制器。
系统采用112脚的MC9S12XS128MAL,该单片机具有ECT模块,2个SPI模块,8路16位计数器,4路外部事件触发中断输入端口,8路PWM,16路10位AD,转换时间约为3us;
(2)传感器模块。
使用一字线激光器发射强大光线,用13个光敏传感器采集路面信息,将信号反馈给控制单元,由控制单元判别黑线位置以控制车的速度、转向和制动;
(3)电机驱动模块和速度控制模块。
根据码盘反馈信号,用MOS管搭建的桥式驱动电路驱动电机的运转状态,形成闭环控制,对电机的速度机型准确快速的调节;
(4)转向控制模块。
根据路面信息,准确地控制转向舵机的转角;
(5)刹车模块。
使用伺服舵机构成刹车装置,使智能车在转弯时两轮差速,更及时地转向;
(6)人机交互模块。
我们使用拨码开关调整智能车的运行参数,并用液晶将车的运行状态显示出来。
第三章机械结构设计
为了使模型车更能发挥竞速特长,我们对车体进行了机械设计和改造,主要包括前轮定位,传感器的设计安装,转向舵机的安装,测速编码器的安装和后轮刹车装置的设计。
3.1车体机械建模
光电组采用的是新的B型车模。
B型车模采用的是国内厂商生产的1:
16的电动越野遥控车的底盘部分,突出特点为四轮驱动,四轮独立悬挂。
智能车的外形大致如图3.1所示:
图3.1智能车大致外形
3.2前轮定位
车轮定位是为了使智能车具有直线行驶稳定,转向轻便,转向后能自动转正,并减少轮胎和转向系零件的磨损等优点。
车轮定位主要的参数有:
主销后倾、主销内倾、车轮外倾和前束。
由于前轮负责转向,我们主要调整前轮的各个参数。
主销后倾能够产生一个方向与车轮偏转方向相反的力矩,使车轮回到原来的位置,从而保持了汽车直线行驶的稳定性。
但回正力矩过大,将会引起前轮回正过猛,加速前轮摆振,并导致转向沉重。
主销内倾使转向时路面作用在转向轮上的阻力矩减小,从而可减小转向时舵机施加的力,使转向轻便,同时也减小了由于路面不平而从转向轮输出到转向矩上的力反馈。
但主销内倾角过大,将会导致转向时轮胎与路面间产生较大的滑动,从而增加轮胎与路面的摩擦力。
B车模的主销已经固定了,故没有改动。
前轮外倾角一方面可以在汽车重载时减少或消除主销与衬套、轮毂与轴承等处的装配间隙,使车轮接近垂直路面滚动而滑动,同时减少转向阻力,使汽车转向轻便;另一方面还可防止由于路面对车轮垂直反作用力的轴向分力压向轮毂外端的轴承,减少轴承及其锁紧螺母的载荷,从而增加这些零件的使用寿命,提高汽车的安全性。
由于模型车主要用于竞速,在设计中要尽可能减轻重量,所以其底盘承重不大,因此将前轮外倾角设为0°即可。
前轮前束是克服了车轮转向时在地面上出现边滚边向内滑移的现象,从而避免增加轮胎的磨损。
在调整过程中,发现较小的前束,约束0~3mm可以减小转向阻力,使模型车转向更为轻便。
3.3传感器的设计安装
结合往届队伍对光电传感器的研究,我们决定采用“一”字型排布方式,如图3.2所示。
采用了13个激光传感器,居于中间部分的11个传感器两两相距较近,两个边缘的传感器相对距离较大些,以探测到更宽的平面信息。
图3.2激光传感器以“一”字型排布
如何安装激光传感器也是一个要考虑的机械结构问题,因为如果传感器离车太近,则前瞻性会受到很大影响;而传感器若离车太远则机构不稳定,行走过程会产生振动,影响传感器的工作状态,无法保证稳定、准确的信号反馈,而且比赛规则有限定车体的长宽。
综合考虑以上因素,我们通过实验确定了传感器的安装距离和方法。
如图3.3所示。
图3.3激光传感器的安装
3.4转向舵机的安装
舵机响应时间很大程度上决定了小车的灵活性,从而决定着小车在一定赛道条件下的极限速度,为了加快车轮转向响应速度,我们设计并安装了舵机转向机构。
我们改变了舵机的安装位置,舵机安装高度的最佳值也通过试验获得。
如图3.4所示。
图3.4转向舵机的安装
3.5测速编码器的安装
在车的调试过程中,由于电池的电量时刻在消耗,车的实际速度往往在发生变化,于是,我们采用了光电编码器。
光电编码器安装主要考虑的问题是与齿轮的咬合,太紧会使电机转动吃力并且会发出很大的噪声,太松有时候会丢齿。
因此最好使得安装的编码器松紧程度能够调整最好。
光电编码器的安装如图3.5所示。
通过光电编码器,程序可以通过调整电机的PWM波来控制车速在稳定在一个范围。
图3.5光电编码器位置示意图
3.6后轮刹车装置设计
在调试过程中,我们发现车模在高速状态转急弯时有时不够及时,导致碾出跑道。
为了保证车辆行驶的安全,我们加装了制动舵机,如图3.6所示。
图3.6制动舵机示意图
我们在制动舵机上加装了一个连杆,连杆的两边各附有刹车片。
在转弯时,通过刹车片向内侧车轮施加摩擦阻力,由于B型车内部装有差速器,当内侧车轮由于受到阻力变慢时,外侧车轮将变快,起到了差速作用,这样车辆能够更及时地转向,避免冲出跑道,更可以在直道上提高速度。
例如:
左转弯时,调节舵机给左轮一定的摩擦力,降低左轮的速度,起到减速作用。
同时,由于内置的差速器作用,右轮的速度将会更快。
由于两个车轮间存在差速,速度快的车轮会以另一个车轮为圆心向左甩,这样有利于车左转。
同样,右弯时,调节舵机给右轮一定的摩擦力,降低右轮的速度,使其左转平稳而又不冲出跑道。
第四章硬件电路的设计和实现
硬件电路的设计应在稳定和可靠的基础上尽量简单化,使其满足工作的基本要求。
4.1主控板的设计
4.1.1电源模块
(a)
(b)
图4.1电源模块原理图
比赛使用智能车竞赛统一配发的标准车模用7.2V2000mAhNi-cd供电,而单片机、激光传感器、光电编码器等均需要5V电源,伺服舵机(包括前轮转向舵机和后轮刹车舵机)的额定工作电压为6V,直流电机可直接用7.2V电池直接供电。
5V稳压电源用于单片机、激光传感器模块、光电编码器模块供电,实验证明,用LM2940搭建成的5V稳压电路(见图4.1(a))
给这些模块供电,能稳定地实现功能,且各个模块不会互相干扰,整个电路简单实用。
舵机稳压电源由LM2941组成的稳压电路提供,其输出电压可调(通过调节图中的10k电位器)
。
由于转向舵机易烧坏,一般将稳压的电路输出调在5.5V~6V范围内较合适。
4.1.2电机驱动模块
电机的驱动可以使用专用的电机驱动芯片、达林顿管驱动、场效应管驱动。
电机驱动芯片MC33886,内部具有过流保护电路,刹车效应好,接口简单易用,虽然能够提供比较大的驱动电流,但对于小车骤然加速时所需的电流还是不够的,发热量也比较大,若使用达林顿管作驱动管,其等效电阻也相对比较大,发热量也会比较大,不利于电机转速的骤起骤降驱动,使用场效应管作为驱动管,其导通电阻可以达到毫欧级,且可以提供强大驱动电流,最后选用场效应管做驱动电路。
如图4.2,场效应管IRF4905和IRF3205组成桥式电路,作为电机驱动,从单片机输出的控制信号PP5和PP7(PWM信号)经反相器CD4011放大电流后作为桥式电路的输入
。
图4.2电机驱动模块原理图
4.1.3光电编码器模块
图4.3光电编码器模块原理图
考虑到小车在加速和减速时可能会出现轮胎与赛道打滑的现象,就采用检测电机齿轮的转速作为小车的当前速度。
速度检测的方法主要有霍尔开关检测、光电编码器检测。
霍尔开关的开关速度比较快,精度容易调节(只需调节小磁铁块的个数与间距),但是当小车的速度较快时,会出现测量误差。
光电编码器对速度的反应很灵敏,精度比较高,速度的实时检测比较好。
经考虑,决定采用光电编码器检测模型车的速度。
如图4.3所示,LM358起放大信号和比较信号的作用,其输出经上拉接至单片机的脉冲计数管脚PT7。
4.1.4人机交互模块
图4.4人机交互模块原理图
为能够对程序运行的参数进行方便的修改,使用了一个八位的拨码开关。
拨码开关的状态通过单片机的PA口读得,在程序里进行判断并决定采用哪一组参数。
另外,为了能够方便调试,我们还外接了一个1602液晶,可以方便地查看传感器的输出值。
4.2激光传感器模块的设计
图4.5激光传感器模块原理图
图4.6激光发射器实物图
采用激光作为光源可以使光敏传感器的前瞻能达到40cm~50cm,这对智能车的控制已经足够。
激光发射器DS1采用一字线激光器,规格为650nm/100mw,如图4.6所示。
该发射器内置透镜,能将激光以一字线型发射出,这样代替了多个的点状激光发射器,从而减轻重量,简化了电路。
接收电路如图4.5所示。
接送器采用普通的光敏管,接收器的输出接至单片机的AD口,通过读取AD值的方法来确定路面信息。
电位器的作用是调整接收器的电流,从而调整输出的电压,从而调整AD值,起到适应环境的作用。
4.3单片机资源使用情况
MC9S12XS128单片机作为本系统唯一的控制器,所有控制信号都由其作逻辑判断后输出,表3.1所示的即为单片机的管脚分配表。
表3.1MC9S12XS128单片机管脚分配表
S12单片机管脚分配
普通IO
PA0-PA7
八路拨码开关
PB0-PB7,PK0-PK2
液晶显示
ECT
PT7
码盘脉冲检测
PWM23
直流电机PWM1
PWM67
直流电机PWM2
PWM01
转向伺服电机PWM
PWM45
刹车伺服电机PWM
AD
AD00~AD15
激光传感器信号输入(含备用)
中断
PH7
用于调整参数
串口通信
RXD0
串口接收
TXD0
串口发射
第五章功能实现原理及算法
5.1主程序流程框图
图5.1主程序流程图
5.2程序初始化
初始化包括:
总线时钟的设置,
I/O端口的设置,
ADC通道选择和工作方式配置,
PWM通道选择和工作方式设置,
中断设置,
速度PID初始化,
SCI初始化。
5.3黑线的判别
一开始通过采用固定阀值对AD采样值进行判别,大于阀值的位置即为黑线位置,但是发现受环境光影响很大,而且调试场地光线并不均匀,所以无法跑动。
然后就使用查找最大值的方法判断黑线位置,这样可以很大程度的减少环境光的影响,只要光线不是特别的不均匀,还能正常跑动。
5.4舵机控制
当黑线处于传感器两边缘时,让舵机以最大角度转动。
当黑线处于中间时主要使用PD算法,调试好PD的参数后既可以很稳定的跑动。
5.5速度控制
速度采用脉冲计数器测量,光电编码器的输出接在定时器接口上。
在软件里,通过每隔8ms的中断处理程序读取一次脉冲次数,读完后立即清零,等待下一次的中断。
读取数据后除去偶然误差,做为速度值。
再根据此速度值作为反馈,使用增量式PID算法对速度进行控制,使速度达到设定值。
第六章开发工具、制作、安装、调试过程
6.1开发工具
我们采用CodeWarrior作为程序编译软件。
CodeWarriorforS12是面向以HC12或S12为CPU的单片机嵌入式应用开发的软件包,包括集成开发环境IDE、处理器专家、全芯片仿真、可视化参数显示工具、项目工程管理器、C交叉编译器、汇编器、链接器以及调试器等。
在CodeWarrior软件中可以使用汇编语言或C语言。
6.2调试过程
我们采用S12系列单片机的BDM(BackgroundDebugMode)调试方式。
在BDM模式下主要可以实现3方面的功能:
应用程序的下载和在线更新;
单片机内部资源的配置与修复;
应用程序的动态调试。
初次使用BDM时,需要在PC上安装相应的驱动程序和动态链接库。
第七章主要技术参数说明
项目
参数
路径检测方法(赛题组)
光电组
车模几何尺寸(长、宽、高)(毫米)
350230250
车模轴距/轮距(毫米)
150
车模平均电流(匀速行驶)(毫安)
2000
电路电容总量(微法)
500
传感器种类及个数
13光敏管,2红外管
1编码器
新增加伺服电机个数
1
赛道信息检测空间精度(毫米)
10
赛道信息检测频率(次/秒)
125
主要集成电路种类/数量
LM29402片、LM29411片、CD4011BD1片、IRF49052片、IRF32052片、NE5552片
车模重量(带有电池)(千克)
1.8
第八章总结
从一开始走到现在确实不易,未拿到新车模之前就在网上看到种种对新车模的评论,一开始大多是期望新车模能带来更快的速度,然后是怨声四起,然后我们也拿到车模了,然后发现车模的那个转向结构真的是非常的恶心,那种结构根本就跑不了60cm的弯,更别提50cm了。
后来看到官网上说可以改装,于是马上改了,改装过程也花了挺长时间。
然而更加恶心的是在后面,在网上看到许多烧舵机的言论后,我们的舵机电压就一直控制在6v以下,然而后面跑着跑着突然发现车子晃动得厉害,后来才发现是舵机的中心线偏了。
后来换舵机,但是那舵机是一代比一代烂。
有的能支撑好几天,有的刚接上还没转几下就突然不动了。
最后只能换回最初的那个,所以现在的车上的舵机的中心线跑了一段时间后会有变动的,还好变动在可以接受的范围。
再吹下我们的传感器,我们使用了一字线的激光管代替了一排的点状激光管,可谓是一次创新,不过可能接收管没太在意,选的管子比较普通,在黑线与白板之间的电压差只有0.5v左右,还好已经够用了。
由于这几天为了能更好的过坡道和弯道提速,对车子进行了不小的改动,时间仓促,报告或许有许多地方不尽人意,忘谅解。
参考文献
[1]卓晴,黄开胜,邵贝贝等.学做智能车——挑战“飞思卡尔”杯[M].北京.北京航空航天大学出版社.2007
[2]孙育才,孙华芳,王荣兴.单片机原理及其应用[M].北京.电子工业大学出版社.2006
[3]张睿.Altiumdesigner6.0原理图与PCB设计[M].北京.电子工业出版社.2007
[4]沈长生.常用电子元器件使用一读通[M].北京.人民邮电出版社.2004
[5]张文春.汽车理论[M].北京.机械工业出版社.2005
附录
Source文件
/*********************************************定义头文件以调用其他函数**************************************************/
#include
#include
#pragmaLINK_INFODERIVATIVE"mc9s12xs128"
#include"System_Init.h"//初始化模块函数
#include"Sensor_operation.h"//传感器模块函数
#include"PID.h"//PID闭环控制模块
#include"SCI.h"
#include"LCD.h"
/***************************************设置全局变量为在其他函数的初始化*****************************************/
ucharfirst_black_po;
ucharsecond_black_po;
uchartemp2;//端口a的值
uchartemp3;
byteLCD_FLAG;
inttime_temp;
intsec;
bytetime10=0;
byteup_time_flag=0;
byteup_time_temp=0;
byteflag=0;
ucharflag_time=0;
byteup_flag=0;//上坡标志
byteup_de_value;
bytead_smallest;
byteblack_flag=0;
charthis_min,this_max;
bytelast_ad_largest_po=6;
bytede_value=225;//黑白阀值
byteblack_count=0;
intad_average;
intup_ad_average;
intVV_MIN=0;//PID输出最小值
intVV_MAX=2000;
intpwmvalue=0;//舵机转角对应的PWM高电平值
intspeed=10000;//电机速度对应的PWM高电平值
intlast_speed=0;
intmax_speed=40;
intsensortemp=0;//黑线位置
intlast_sensor2=0;
intlast_sensor=0;//存储上一次转角值
intlast_sensor_array[10];
intd_sensor=0;
intsensor=0;//本次转角和上一次转角差值
bytead[14];
bytead_largest,ad_largest_po;
bytead_larger,ad_larger_po;
charsensor_value[14]={-13,-11,-9,-7,-5,-3,-1,1,3,5,7,9,11,13};
intpo_kp;
intvi_Ref;//速度设定值
intvi_FeedBack;//速度反馈值
intlast_vi_FeedBack;
intvi_PreError;//速度误差,,vi_Ref-vi_FeedBack
intvi_PreDerror;//速度误差之差,d_error-PreDerror;
intv_Kp;//比例系数
intv_Ki;//积分系数
intv_Kd;//微分系数
intvl_PreU;//PID输出值
ucharreceive_data[4];//串口接收值
uintsci_count1;
ucharstart_state=0;//起跑线相关的数值
ucharstartline_flag=0;
ucharstartsum=0;
ucharstartsum1=0;
ucharstartsum2=0;
ucharstartsum3=0;
ucharstartsum4=0;
ucharsecond_white_po=0;
ucharfirst_white_po=0;
ucharblack_state=0;//十字线相关的数值
ucharblacksum1=0;
ucharblacksum2=0;
ucharblacksum3=0;
ucharcross