北京科技大学天津学院-二队 - 记忆算法

更新时间:2024-03-28 20:05:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第二届“飞思卡尔”杯全国大学生

智能汽车邀请赛

技 术 报 告

学 校:北京科技大学天津学院 队伍名称:北京科技大学天津学院二队 参赛队员: 张素杰 程诚 王醒 带队教师: 罗富臣

关于技术报告和研究论文使用授权的说明

本人完全了解第二届全国大学生“飞思卡尔”杯智能汽车竞赛关保留、使

用技术报告和研究论文的规定,即:参赛作品著作权归参赛者本人,比赛组委会和飞思卡尔半导体公司可以在相关主页上收录并公开参赛作品的设计方案、技术报告以及参赛模型车的视频、图像资料,并将相关内容编纂收录在组委会出版论文集中。

参赛队员签名:

带队教师签名: 罗富臣

日 期: 2007.8.17

张素杰 程诚 王醒

摘要

本文详细介绍了我们为第二届全国智能车大赛而准备的智能车系统方案。该系统以Freescale16位单片机MC9S12DG128作为系统控制处理器,采用激光传感器对赛道信息进行采集,并通过赛道记忆方法对赛道信息进行记录,反馈回给电机和舵机,在第二圈中达到校正。通过欧姆龙光电编码器获取小车速度,进行速度反馈处理,最后利用PID控制方式作为了最终的选择。文中还将介绍赛车传感器布置及安装方法,自制电路主板、赛道记忆算法及开发出的调试系统,还将介绍机械结构和调整方法,及舵机安装方式。

关键词:激光传感器、控制策略、速度传感器、赛道记忆

Abstract

This paper introduces us to the second session of the National Smart car racing prepared smart car system plan. The system Freescale16 MC9S12DG128 bit extreme but as a system control processor, Using modulation laser sensors to track information Acquisition, through the memory circuit and method for information on the track record, feedback back to the motor and steering, The second lap achieve Correction. Omron through photoelectric encoder speed access Trolley, Speed feedback processing. Finally PID control as a means to the ultimate choice. The article will introduce the car sensor layout and installation methods, Self-made circuit board, the circuit memory algorithm and the development of the system debugging, also introduced mechanical structure and adjustment methods, and installation Rudder.

Key word:Laser Sensor, Control Strategy, speed sensor circuit memory

目录

第一章 引言 ……………………………………………………………1 1.1 比赛背景介绍……………………………………………………1 1.2 方案介绍…………………………………………………………1 1.3本文结构………………………………………………………1第二章 赛车系统整体设计…………………………………………….2 2.1系统硬件结构设计………………………………………………2 第三章 光电传感器 ………………………………………………… 3 3.1传感器选型…………………………………………………… 3 3.2 传感器排布…………………………………………………… 3 第四章 主控板硬件电路设计.…………………………………………5 4.1电源模块…………………………………………………………5 4.2电机驱动模块……………………………………………………6 4.3硬件抗干扰措施…………………………………………………7 4.4印制电路板可靠性和抗干扰设计………………………………8 4.5主控板的安装………………………………………………… 8 第五章 电机驱动模块………………………………………………….9 5.1 硬件电路设计………………………………………………………9 5.2 驱动电机性能测试…………………………………………………9 5.3 程序代码………………………………………………………… 10 第六章 舵机驱动模块…………………………………………………14 6.1硬件电路设计…………………………………………………… 14 6.2程序代码……………………………………………………………14 第七章 速度传感器……………………………………………………16

7.1传感器设计及安装………………………………………………16 7.2 硬件电路设计……………………………………………………16 7.3 软件设计…………………………………………………………17 7.4速度传感器准确性测试…………………………………………18 7.5 安装方式…………………………………………………………18 第八章 赛道记忆………………………………………………………19 8.1智能车运动状态实时监测系统总述……………………………19. 8.1.1系统整体硬件架构……………………………………………19 8.1.2系统整体软件架构……………………………………………20 8.2起跑信号发送装置………………………………………………21 8.2.1起跑信号发送装置工作原理…………………………………21 8.3车载数据采集系统设计及实现…………………………………22 8.4机数据接收处理系统设计及实现………………………………22 8.5手持数据接收及监测系统设计及实现…………………………23 8.6动态数据接收及显示模式………………………………………24 第九章 赛车机械结构调整……………………………………………25 9.1舵机安装调整……………………………………………………25 9.2前轮倾角的调整…………………………………………………25 第十章 总结……………………………………………………………26 10.1比赛准备阶段……………………………………………………26 10.2激光传感器设计…………………………………………………26 10.3赛道记忆控制策略及开发的赛车运动状态实时监测系统………………………………………………………………26 10.4设计中存在的问题…………………………………………26. 10.5未来寄语……………………………………………………27

第一章 引 言

1.1 比赛背景介绍

受教育部高等教育司委托,高等学校自动化专业教学指导分委员负责主办全国大学生智能车竞赛。该项比赛已列入教育部主办的全国五大竞赛之一。2007年8月日,在上海交通大学举行第二届全国大学生智能车竞赛。本届的比赛,首先是在全国五大赛区进行预选赛,之后将有 只赛车到上海进行总决赛。在比赛中,“参赛选手须使用大赛组委会统一提供的竞赛车模,采用飞思卡尔16控制器MC9S12DG128作为核心控制单元,自主构思控传感器信号采集处理、控制算法及执行、动力电机驱动、转向舵机控制等,完成智能车工程制作及调试,于指定日期与地点参加场地比赛。参赛队伍之名次(成绩)由赛车现场成功完成赛道比赛时间为主,技术方案及制作工程质量评分为辅来决定”,“须采用统一提供的车模,须采用限定的飞思卡尔16位微控制器 MC9S12DG128 作为唯一控制处理器,车模改装完毕后,尺寸不能超过:250mm 宽和400mm长,高度无限制”,“跑道宽度不小于600mm,跑道表面为白色,中心有连续黑线作为引导线,黑线宽25mm”,并且跑道有坡道。

1.2 方案介绍

由评分规则可知,本次比赛的关键在于提高小车的速度和稳定性。其实际问题是如何更早且更好的提取到赛道信息。我们采取的策略是激光传感器加赛道记忆,共同实现我们的目标。这样不仅可以提高赛车的前瞻性,使赛车的稳定性提高。而且通过赛道信息的记录,可以在第二圈中,对赛车状态进行校正,提高成绩。

1.3本文结构

本文共十章。其中第一章为引言部分。简单介绍比赛背景及赛车的基本方案。第二章主要介绍赛车整体系统结构,对赛车整体流程及控制进行介绍和说明。第三章介绍赛车传感器,包括选型、排布及安装方式。第四章将对自行研制的主控板进行介绍及说明,包括电路设计及主控板的安装。第五章介绍电机驱动模块,包括硬件电路的设计及电机性能的测试。第六章将对舵机驱动模块进行说明。第七章为速度传感器,包括电路设计、安装方式及准确性。第八章为赛道记忆控制策略及开发的赛车运动状态实时监测系统。第九章介绍赛车机械结构调整。第十章将对全文作出概括总结。

第1页

第二届全国大学生智能汽车竞赛技术报告

第二章 赛车系统整体设计

2.1系统硬件结构设计

根据激光传感器方案设计,赛车共包括大模块:激光传感器模块 控制处理芯片MC9S12DG128,舵机驱动模块,电机驱动模块、速度传感器

转向舵机 MC9S12DG128 传感器信号 电机 速度传感器 第一圈记录数值

第2页

第三章 光电传感器

3.1传感器选型

由于赛道具体信息还不知道,所以必须选择合适的路面信息检测传感器。通过查阅相关资料,了解到目前常用的寻线技术有:光电寻线、磁诱导寻线和摄像头寻线。光电寻线一般由多对红外收发管组成,通过检测接收到的反射光强,判断黑白线。在这种方案中,一对收发管只能检测一个点的信息,精度有限。但其优点是电路简单,处理方便。路面磁诱导与智能车辆的车载机器视觉诱导相比,最大优点是完全不受光照变化的影响。但这种方式必须以车道中心线上布设的离散磁道钉作为车道参考标记,这违背了比赛规则。摄像头寻线通过图像采集,动态拾取路径信息,并对各种情况进行分析。它具有信息量大,能耗低的优点,但对数据的处理相对复杂。作为第一次参加此次大赛,并通过对第一届比赛的研究,我们决定还是从光电管入手。

要提高速度并保证在入弯时不撞到标竿,就必须增加传感器的“视野”,以便及时减速。

通过比较,发现市场上的激光管有比较好的性能,它可以照射很远的距离依然有很高的强度,根据激光特性,除了激光的入射光和反射光是最强的以外,其他的所有散射光的强度都是相同的,在此情况下,实际测量发现激光可以看到20cm以上的距离,对于赛车的前瞻性大有好处,可以适当把光照调远,实现前瞻性循线控制。

3.2 传感器排布

为了完成赛道记忆算法,我们采用了前十后五的传感器排布方式。这样前十路传感器采集的数据负责对赛车进行转角的控制。而后五路传感器采集的数据则传递给单片机后通过分析并记录下来,为第二圈舵机、电机控制提供反馈信息。

数字型光电传感器只有0与1 两种状态,因此各个传感器的布局间隔将影响车对路径的识别精度以及对舵机的控制算法的优劣。赛道规定的是:黑线宽度25mm,赛车可以沿着黑线自主循线。

当任何时刻只有一路传感器在黑线上的情况(每两个传感器之间的间距是25mm):

第3页

第二届全国大学生智能汽车竞赛技术报告

图3.1 传感器间距为25mm的情况

由图3.1可知,传感器由一种状态转化为另一种状态所移动的距离,即有效距离为:25mm。

当有时有一路传感器在黑线上,有时有两路传感器在黑线上的情况下(12.5mm<传感器两两间距<25mm):

图3.2 传感器间距在12.5mm和25mm之间的情况

由图3.2可知,d1=25-x,d2=2x-25

若要舵机平缓过渡,减少瞬时精度高,长时间精度低的情况出现,令d1=d2为最优情况,即:25-x=2x-25 得x=16.7mm,d1=d2=8.3mm

传感器安装:传感器有发射和接收两部分,所以需要制作支架固定其位置。根据尺寸要求,在支架上打孔固定发射管和接收管。为了有较合适的重心位置,应该选择质量较轻的材料,最后利用胶水使传感器固定。见图一

第4页

第四章 主控板硬件电路设计

4.1电源模块

比赛提供7.2V电池,整个系统需要为以下模块供电: 为单片机供电;(5V); 为传感器供电;(5V); 为电机驱动供电;(7.2V);

为舵机供电(转向舵机和制动舵机);(7.2V或6V) 可能会有发热元件,接出5V风扇供电口。

由上可以知道,系统需要7.2V、6V、5V,其中7.2V可以由电池直接供电,6V和5V就需要稳压芯片来供电了,由于有上届比赛的经验,如果把所有接到5V的电源都从一个口输出,万一出现异常状况(例如大电流),单片机必然重启,因此需要多个稳压芯片同时工作,以保证单片机正常工作。

图4.1电源模块电路图

5V稳压电路的设计:

市场上5V的稳压芯片有很多,例如LM2940、LM7805、开关型LM2575、LM2596,其中2940和7805转换效率比较低,只有40%左右,但是输出纹波很小,对于单片机这种对电源要求比较高的元件而言很适合,而2575和2596是开关型的稳压芯片,转换效率可以达到75%甚至80%以上,但是输出有纹波,很可能让单片机出现重启现象。

第5页

第二届全国大学生智能汽车竞赛技术报告

图4.2 LM2940电路原理图

图4.2是2940稳压的电源模块原理图,7805和2940的原理图相同,但是7805需要输入7.5V以上才可以稳定输出5V,而2940载输入电压达到6V以上就可以稳定输出5V了,因此,在给单片机供电的电源中选择2940稳压芯片。

4.2电机驱动模块

图4.3 电机驱动模块电路

由CPU 发出PWM 波通过33886驱动芯片控制电机的电压,PWM5输出PWM波,经由IN1口输入,OUT输出电机调速信号。驱动芯片MC33886内部具有短路保护、欠压保护、过温保护等功能。MC33886内部集成有两个半桥驱动电路,本设计中,因为只需控制小车前进的速度不需要控制运行电机反转,因此不需要采用全桥驱动运行电机。而为了增大电流驱动能力,将两个半桥并联使用。

各接口模块

第6页

第四章 主控板硬件电路设计

图4.4 各接口模块电路

如图4.4所示为S12单片机的各接口模块。

其中fan为一个2口白接头,可以提供5V和GND,为需要散热的芯片提供风扇电源接口;Keyboard为一个6口白接头,提供键盘接口;Code接口是一个3口白接头,提供码盘的电源、地和信号;Reverse是一个反相器,为码盘返回数据进行反相,使得软件控制的时候有一个高电平就可以得到光栅的一格,更易于控制;PWM1、PWM3、PWM7分别为转向舵机和制动舵机供电控制;PortAPortB和PortEPAD为传感器提供电源、控制和返回;Monitor是一个监控系统的接口,在主控板上插上监控系统可以监视车模运行时候的一些参数。

4.3硬件抗干扰措施

在嵌入式系统中,系统的抗干扰技术是系统可靠性的重要方面。一个系统的正确与否,不仅取决于系统的设计思想和方法,同时还取决于系统的抗干扰措施。

嵌入式系统的干扰源一般有三个渠道:一是空间干扰,电磁信号通过空间辐射进入系统;二是过程通道干扰,干扰信号通过与系统相连的前、后通道及与其它系统的连接通道进入,它叠加在有用信号之上,扰乱信号传输,使有效信号产生畸变。使得数据采集误差加大,导致控制状态失灵,导致程序运行失常;三是系统干扰,电磁信号通过供电通道进入系统或系统本身产生干扰。 虽然抗干扰问题是嵌入式系统在实际应用中最令人头疼的问题,而且没有一定之规,也没有一成不变的方法,但若进行科学的分析并加以合理的设计,采取一定的措施,将系统的硬件和软件结合起来,是可以有效地提高应用系统的可靠性的。

第7页

第二届全国大学生智能汽车竞赛技术报告

4.4印制电路板可靠性和抗干扰设计

印制电路板是嵌入式系统中,器件、信号、电源线的高密度集合体,印刷电路板设计的好坏对抗干扰能力的影响很大。

设计时应合理走线、合理接地,三总线分开走线.。尽量将数字、模拟电路分开走线,电源线和地线应尽量加宽,同时使电源线、地线的走向与数据传递的方向一致。应尽量使用45°折线而不要使用90°折线,以减少高频信号对外的发射与耦合,减少互感振荡;将接地和屏蔽正确结合起来使用。

CPU、RAM、ROM等主芯片以及VCC、GND之间接电解电容和瓷片电容;去掉高、低频干扰脉冲;石英晶体振荡器的外壳接地而不要走信号线,且要适当加大接地面积;时钟线要尽量短,并用地线将时钟区圈起来,使周围电场尽可能地减小。独立系统结构,减少接插件与连线;输入输出驱动器件、功率放大器件应尽量靠近线路板边的引出接插件;提高可靠性,减少故障率。集成块与插座接触可靠,用双簧插座,最好集成块直接焊在印制板上,防止器件接触不良。信号的输入、输出端以使用光耦进行光电隔离为好。这样既可以防止外围器件动作时产生的回流冲击系统,又可使输入端的干扰信号没有足够的功率去干扰发光二极管的正常工作。

4.5主控板的安装

通过在底盘上打孔,通过塑料螺钉固定。见图一

第8页

第五章 电机驱动模块

5.1 硬件电路设计

由CPU 发出PWM 波通过33886 驱动芯片控制电机的电压. PWM5 输出PWM波,经由IN1 口输入。OUT1 输出电机调速信号。通过预设的占空比对电机的转速进行调解。工作电压为5-40V,导通电阻为120 毫欧姆,输入信号是TTL或CMOS,PWM 频率小于10KHz,具有短路保护、欠压保护、过温保护等。MC33886内部集成有两个半桥驱动电路,本设计中,因为只需控制小车前进的速度不需要控制运行电机反转,因此不需要采用全桥驱动运行电机。而为了增大电流驱动能力,

图5.1 电机驱动电路

本文将两个半桥并联使用。(?????)

5.2 驱动电机性能测试

根据我们的速度传感器,对电机性能进行了测试。主要测试了,开环控制下,车辆启动加速的性能。

在开环控制下,分别设定占空比为90%和100%,其启动效果如下(x 轴为时间(s),Y 轴为车速):

第9页

第二届全国大学生智能汽车竞赛技术报告

图5.2 开环占空比90%启动效果

图5.3 开环占空比100%启动效果

从图中可以看出,无控制状态下,赛车起动加速度约为1.2m/s2。而赛车启动,如果设定直道速度为2m/s,则需要约1.7m 的加速距离。另外,在机械上我们适当调整了传动齿轮的间距,提高电机传动效率。重点调节了赛车后轮差速机构,使其正常工作。在小车进行转向时,后轮差速机构有效地弥补了左右两个后轮的行程差,使两个后轮都在无滑动状态下过弯。

5.3 程序代码

电机转速设置在软件上都通过pwm 波占空比设置完成的。 void PWM45_Init(void) { PWME_PWME5 = 0; PWMCNT45 = 0;

PWMDTY45 = 0; /* Store initial value to the duty-compare register */

PWMPER45 = 24000; /* and to the period register */

PWMCTL_CON45=1;

PWMPRCLK = 0; /* Set prescaler register */

第10页

第五章 电机驱动模块

PWMSCLA = 1; /* Set scale register */ PWMCLK_PCLK5 = 1; /* Select clock source */ PWMPOL_PPOL5=1;

PWME_PWME5 = 1; /* Run counter */}

测试开环控制下PWM占空比与电机转速之间的关系:为了在控制策略中分配给电机合适的速度,需要知道PWM占空比与电机转速之间的关系。为此,我们做了以下测试。

在长直道上分别给不同的占空比,测的码盘返回值如下表

图5.4 占空比70%下的PWM与转速关系 表5.1 占空比与转速关系数据表 占空比 稳定后的速度(m/s) 30% 18*0.064 35% 25*0.064 40% 31*0.064 45% 37*0.064 50% 43*0.064 55% 49*0.064 60% 56*0.064 65% 63*0.064 70% 71*0.064 75% 76*0.064 80% 80*0.064 图5.3为其中的占空比70%的曲线,其他的图就不一一例举了。

在得到上述数据后,就可以在MATLAB中绘图并拟合曲线。 Matlab 源程序: c0=30;c=18; d0=35;d=25; e0=40;e=31;

第11页

第二届全国大学生智能汽车竞赛技术报告

f0=45;f=37; g0=50;g=43; h0=55;h=49; i0=60;i=56; j0=65;j=63; k0=70;k=71; l0=75;l=76; m0=80;m=80;

x1=[c0,d0,e0,f0,g0,h0,i0,j0,k0,l0,m0]; y1=[c,d,e,f,g,h,i,j,k,l,m];

x2=polyfit(y1,x1,1);y2=polyval(x2,y1); x2

plot(y1,y2,'r',y1,x1) 绘得曲线:

图5.5 PWM占空比与电机转速曲线与拟合曲线 图5.5中,纵轴为占空比,横轴乘以0.064便为电机转速。由此得到一次拟合函数。

P?0.7852*S?15.8097 (5-1)

其中P为PWM占空比,S为电机转速。

第12页

第五章 电机驱动模块

从图5.5中可以看出,PWM占空比与电机转速近似为线性关系,这也与预想中的关系一致。

第13页

第六章 舵机驱动模块

控制信号控制电路板 电极转动 齿轮组减速 舵盘转动 舵盘角度 控制量 控制电路板反馈 图6.1 舵机工作原理图 位置反馈电位计 6.1硬件电路设计

在进行转向测试之前需要设计合理的硬件电路,使之正常工作,所以首先简单的介绍以下转向舵机的硬件电路设计。

S12 脉宽调制模块有8 路独立的可设置周期和占空比的PWM 通道,每个通道配有专门的计数器。该模块有4 个时钟源,它们为PWM 波的设置提供了宽阔的频率范围。通过该模块内寄存器可设置PWM 的使能与否,每个通道的工作脉冲极性,每个通道输出的中间还是左对齐方式,时钟源,使用方式(是作为八个8 位精度通道还是四个16 位精度通道)。该模块还有紧急关闭功能。

图6.2 舵机电路

6.2程序代码

运行电机的转速以及舵机的转角,在软件上都是通过对PWM 波占空比进行

设置来相应控制的。

程序代码如下: void PWM67_Init(void) { PWME_PWME7 = 0; PWMCTL_CON67=1;

PWMPRCLK = 0; PWMSCLB = 2;

第14页

第六章 舵机驱动模块

PWMCLK_PCLK7 = 1; PWMPOL_PPOL7=1; PWMCNT67 = 0;

PWMDTY67 = 8875; PWMPER67 = 48000; PWME_PWME7 = 1; }

第15页

第七章 速度传感器

受车模机械结构的限制,必须采用体积小、重量轻的速度传感器。就目前常用的有三种方案可供选择:

霍尔传感器配合稀土磁钢:

在主后轮驱动齿轮处,通过打孔,将几块很小的稀土磁钢镶在里面,然后将霍尔元件安装在附近,通过检测磁场变化,可以得到电脉冲信号,获取后轮转动速度。

光电传感器

在主驱动齿轮表面附上黑白间隔的彩带,将反射型光电传感器安装在齿轮附近,当黑白彩带交替通过时,产生一系列电脉冲,由此获取转动角度。也可以对齿轮打孔,采用直射型光电传感器,通过间断接受到的红外光,产生电脉冲信号,获取转动角度。

光电编码器

购买光电编码器安装在主驱动齿轮上,通过齿轮传过来的转动信息,获取后轮转角。

比较以上3 种方案,考虑到系统的可靠性,首先排除霍尔元件方案,因为主后轮传动齿轮为塑料质地,打孔比较危险。同理排除光电传感器的直射型方案。之后,通过对市场的调查,发现可以购买到体积小且线数高的欧姆龙光电编码器,为了提高速度测量精度,最终,我们决定采用欧姆龙光电编码器方案。

7.1传感器设计及安装

设置S12 的模数向下计数器模块,同时捕捉光电编码器输出的电脉冲的上升沿。通过累计一定时间内的脉冲数,可以得到和速度等价的参数值。我们已知:轮胎一圈周长为16.7cm。设编码器共有e 线,即轮胎转动一圈将引起e 个脉冲数累积。假设对脉冲数累积的时间为t,在这段时间内共获取了n 个脉冲数累积。则赛车速度为:

v=16.7( n )/t (cm/s)e

光电编码器线数越多,同等速度下单位时间内所能检测到脉冲数也越多,因而速度检测的分辨率也更高。另一方面,线数增多后,相邻脉冲间的持续时间会变短,脉冲检测的可靠性会因相邻脉冲的干扰而受到影响。

7.2 硬件电路设计

第16页

第七章 速度传感器

图7.1 速度传感器模块电路图 7.3 软件设计

我们采用PT0 口作为脉冲信号输入。采用模数向下计数器,首先通过设置寄存器MCCTL,设置模数方式使能,向下中断使能,向下计数使能。设置FLMC位,使得载入寄存器进入模数计数方式。设置MCCNT寄存器,使得定时器每20ms中断一次。然后设置TIOS,设置PT0针脚为输入;然后设置TCTL4 寄存器,选择获取上升沿。之后,设置PBCTL寄存器,将PAC0和PAC1合用。设置代码为:

MCFLG_MCZF = 1;

MCCTL_MODMC = 1; MCCTL_MCZI = 1; MCCTL_MCEN = 1; MCCNT = 30000; MCCTL_MCPR = 3;

MCCTL_FLMC = 1;

TIOS_IOS0=0; TCTL4=0x01;

PBCTL_PBEN=1;

在中断服务函数中,通过读取PACN01 这个寄存器,获取当前的脉冲累加值。例程如下

void Int_mcount(void) {MCFLG_MCZF = 1; pulse=PACN10; PACN10=0;

sPID.vi_FeedBack=pulse ;

//读出脉冲计数值

第17页

第二届全国大学生智能汽车竞赛技术报告

PWMDTY45=(unsigned int)v_PIDCalc(&sPID); }

在每一控制周期开始,S12 读取脉冲累加器中的数值,然后将脉冲累加器清零。

这样就求得了之前m 个控制周期时间里共有多少个脉冲数累积,从而由公式3-1 可求得赛车速度值。程序流程图7.2:

读取当前脉冲累加器值器清零 速度传感模块出口 图7.2 速度传感模块程序流程图 速度传感模块入口 脉冲累加器清零 7.4速度传感器准确性测试

让赛车在赛道上行驶,每20ms 就将赛车当前速度值通过串口发送到电脑上一次。对赛车行驶的正好一圈中的速度值进行累加求和,再乘以20ms,得到的总共行驶距离为27m,而赛道总长为26m。两者的相对误差不到4%。这说明,速度传感器测量基本准确。

驱动电机空载运行时,改变脉冲获取方式,在上升沿获取方式、下降沿获取方式和两沿同时获取方式间进行切换。不改变驱动电机占空比设置,在三种情况下,单位时间内捕捉的脉冲数较理想地满足:上升沿获取下的脉冲数=下降沿获取下的脉冲数=两沿同时获取下的脉冲数/2;在脉冲获取方式不变的情况下,改变驱动电机占空比设置,检测的速度值与占空比近似成线性比例关系。另一方面,空载情况下,驱动电机速度确实与输入PWM 波占空比的大小近似成线性比例关系。以上间接说明脉冲检测的可靠性。

7.5安装方式

为了能够减轻赛车重量,我们并没有做安装码盘得架子,而是直接在赛车上打孔,进行定位,这样既保证了齿轮良好得啮合,而且又减轻了赛车的重量。

第18页

第八章 赛道记忆

经历了一段时间的智能车制作调试过程后,发现传统的调试方法有着比较大的弊端。传统的调试方法是调车者跟据智能车绕行赛道一圈的时间和肉眼观测到的智能车在赛道上的行驶路径作为修改智能车参数的指标,然后反复测试,反复修改,以达到最好的效果。这样的调试比较盲目,缺乏目的性,也浪费了大量的时间和精力在做重复性劳动,效果不好。并且,由于光电传感器本身的特性,使得前瞻性远不如ccd图象识别,使得电机控制效果很不好;并且,由于采集信号是离散的,转角的控制也显得不平滑。这时,为了能和ccd 图像识别进行抗衡,赛道记忆策略就发挥了作用。

赛道记忆算法是指在比赛的第一圈以最安全的速度缓慢驶过一圈,并将赛道信息保存下来,第二圈根据保存下来的信息进行车速和转角决策的相应最优化,从而在第二圈取得好成绩,这一算法在目前智能车竞赛中是比较先进的。要实现赛道记忆算法,智能车运动状态实时监测系统是必不可少的。

8.1智能车运动状态实时监测系统总述

本系统主要完成将智能车行驶过程中的各种状态信息(如传感器亮灭,车速,舵机转角,电池电量等)实时地以无线串行通信方式发送至上位机处理,并绘制各部分状态值关于时间的曲线。有了这些曲线就不难看出智能车在赛道各个位置的状态,各种控制参数的优劣便一目了然了。尤为重要的是对于电机控制PID参数的选取,通过速度—时间曲线可以很容易发现各套PID参数之间的差异。对于采用CCD传感器的队伍来说,该系统便成为了调试者的眼睛,可以见智能车之所见,相信对编写循线算法有很大帮助。而且还可以对这些数据作进一步处理,例如求取一阶导数,以得到更多的信息。 8.1.1系统整体硬件架构

设计方案主要分成四部分:起跑信号发送装置,车载数据采集系统,手持监测系统,PC机数据处理系统。系统基本构建如下图2-1所示。

第19页

第二届全国大学生智能汽车竞赛技术报告

图8.1 系统基本架构示意图

当小车启动后第一次经过起跑信号发送装置时,触发计时器启动,并且定时器通过无线串行数据收发模块发送起跑信号,在未收到该信号前,车载数据采集系统、PC机及手持监控系统均处于侦听状态,当收到该信号时,车载数据采集系统开始采集智能车的运行数据并发送至PC机和手持监控系统,而PC机和手持监控系统均进入正常工作模式,开始监测数据。 8.1.2系统整体软件架构

软件方面PC机数据处理程序依靠Visual C++ 6.0来实现,软件主体包括串口通信程序,数据分类程序,动态绘图程序,以及对一些外设(如鼠标,键盘等)事件响应程序。而起跑信号发送装置、车载数据采集系统及手持监测系统均使用ATMEL公司的8位单片机,故软件开发环境为ICCAVR6.31A,开发语言均为C语言。

在系统正常运行时,整个系统控制框图如图2-2所示,PC会通过串口通信模块来接收数据,并把接收来的数据进行分类,然后根据程序绘制四条曲线,即速度—时间,转角—时间,传感器—时间和电池电压—时间曲线。而手持系统则把数据经过处理后,动态的显示在液晶屏上。

第20页

第八章 赛道记忆

智能车 检测发送车实时状态 激光传感器 显示瞬时状态 起跑信号 发送 第一次触发时 车上系统 发送启动单片 机命令 车各部分信息 手持设备显示瞬时状态 PC 数据处理并画 图

图8.2整个系统控制框图

8.2起跑信号发送装置

智能车在赛道上行使过程中,为了可以了解赛车在赛道各个位置的状态以及将两次数据进行对比,我们就要设置监测的起始点。因为如果在赛车启动后立刻发送数据,那么任意两次的监控图像就会发生错位,不方便比较,而且没有起始点,也不方便把采到的数据对映到赛道各部分上去。因此在赛车冲过起跑线时,整个实时监测系统才正式运转,而起跑信号发送装置就是用来发送这个标志信号的。

8.2.1起跑信号发送装置工作原理

起跑信号检测装置由一组激光对射管构成,当激光对射管之间无障碍物遮挡光线时,激光发射管发出的光正好照射到接收管上,接收信号端为低电压,当发射与接收间被障碍物隔断时,光线被阻断,接收信号端变为高电压。单片机检测到激光对射管输出端电压变化,得到启动信号,并控制无线串口发送启动信息给车载数据采集系统,手持监测系统,PC机数据处理系统。

第21页

第二届全国大学生智能汽车竞赛技术报告

8.3车载数据采集系统设计及实现

数据采集是整个系统较为核心的一部分,无论后面对数据做如何的处理,这一部分都是基础,如果采集回来的信号有错误,是无法弥补的,故本章将会从各种信号的采集方法,数据格式的定义以及到数据传送方式作以详细的介绍数据。采集方案设计这部分系统功能主要是将智能车的速度、方向、传感器状态以及电池电量等物理信息转换为电信号,并由单片机进行采集,处理,最后通过无线串口将这些信息以字节为单位发射出去。

8.4机数据接收处理系统设计及实现

这部分工作主要是利用PC机的串行通信接口和VC++程序将车载数据采集系统发射出来的数据进行采集,保存,分类和处理。该系统分为两种工作模式,一种是动态数据接收及显示模式,另一钟是静态数据分析模式,前一种模式应用于智能车在赛道上行驶过程,因为此时车载检测系统会不断发出小车运动状态数据,所以PC机要对数据进行接收、分类、显示以及将分好类的数据存储在临时文件中。当智能车行驶结束后,PC机接收数据结束,此时就系统就需要转到静态数据分析模式。由于动态数据接收及显示模式中已经刚收到的数据已经被保存在临时文件中,故在此模式下用户可以直接察看任意时刻的智能车运动参数。而且,用户可以将数据保存到其他新的TXT格式文件中,以免下次运行程序时,临时文件内数据被更新,造成有用数据丢失,用户也可以把以前保存的数据文件(TXT文件格式)打开进行研究,分析和对比。

主程序的流程如5-1图所示,主程序经过初始化后根据用户作选择的模式进行工作,程序默认为动态数据接收及显示模式。

第22页

第八章 赛道记忆

开始 程序初始化 模式选择 0 Flag = ? 1 动态数据接收及显示模式 静态数据分析模式 执行相应操作

图8.3 主程序的流程图

8.5手持数据接收及监测系统设计及实现

对于PC机数据接收处理系统来说,接收大量的数据后绘出图像效果比较好,但是如果说想精确地知道赛道上某一点的赛车运动状态就比较困难了。因为PC机数据接收处理系统绘制出来的图像横轴为时间轴,而智能车在赛道上行驶时速度是不断变化的,所以要想通过时间来推算出智能车在赛道上的位置就很不精确了。然而手持数据接收及监测系统正是用来弥补这一不足,因为用户可以拿着它站在赛道边上,或是同智能车一起行进,想查看某一位置智能车运动状态时只需要按一下按键,系统就可以把当前时刻的数据显示在液晶屏上,使用起来简单方便。

手持数据接收及监测系统框图如图8.4所示,整个系统的电力来源是9V的叠层电池,经稳压电路稳至5V后提供给无线串口通信模块,单片机模块和液晶模块进行工作。无线串口收发模块用来接收车载数据采集系统发射出来的数据,当单片机接收到按键所触发的外部中断时,便通过无线串口进行数据接收,然后控制液晶模块进行显示。

第23页

第二届全国大学生智能汽车竞赛技术报告

+5V GND 无线串口通信模块 DATA 叠层电池 +9V GND 稳压模块+5V ATmega16单片机 INT0 按键 (外部中断) GND DATA +5V GND 128×64液晶模块 8.6动态数据接收及显示模式 动态数据接收及显示模式主要是应用于智能车在赛道上行驶过程中,PC机不断接收新的数据并不断将窗口重绘,以显示出实时的智能车运动状态图像。

通过运动状态实时监测系统,我们就可以得到赛道信息特征,并记录在单片机中。在第二圈中,提取记忆的赛道特征和第二圈的即时数据进行匹配及修正。

这样我们就可以在

直道上加速,弥补了光电传感器前瞻差的劣势。并且,得到的弯道数据,也这样就可以通过第一圈的数据对第二圈进行修正。

图8.5测试信号显示图

图8.4手持数据接收及监测系统框图

第24页

第九章 赛车机械结构调整

9.1舵机安装调整

为了解决舵机转向不够灵活得问题,我们采用舵机立式安装方式,这样能使左右拉杆得长度保持一致。这样左右转向时力是一样得,保证了左右转向控制相同。并且在立式时,舵机得位置相当于提高。当转动角度最大时,舵机连杆与拉杆的夹角达到90度。这样可以使转动最大角度时的力量达到最大。这样也可以使赛车在直道跑动时,舵机单位改变量使轮子改变的角度小于在弯道(舵机已有很大转角)时舵机单位改变量改变的轮子的转角。

9.2前轮倾角的调整

前轮定位的作用是保障汽车直线行驶的稳定性,转向轻便和减少轮胎的磨损。前轮是转向轮,由主销内倾、主销后倾、前轮外倾和前轮前束等4个项目决定,反映了转向轮、主销和前轴三者在车架上的位置关系。

主销内倾是指主销装在前轴略向内倾斜的角度,它的作用是使前轮自动回正。角度越大前轮自动回正的作用就越强烈,但转向时也越费力,轮胎磨损增大;反之,角度越小前轮自动回正的作用就越弱。

主销后倾是指主销装在前轴,上端略向后倾斜的角度。它使车辆转弯时产生的离心力所形成的力矩方向与车轮偏转方向相反,迫使车轮偏转后自动恢复到原来的中间位置上。由此,主销后倾角越大,车速越高,前轮稳定性也愈好。

前轮外倾角对汽车的转弯性能有直接影响,它的作用是提高前轮的转向安全性和转向操纵的轻便性。如果车轮垂直地面一旦满载就易产生变形,可能引起车轮上部向内倾侧,导致车轮联接件损坏。

前轮前束的作用是保证汽车的行驶性能,减少轮胎的磨损。前轮在滚动时,其惯性力会自然将轮胎向内偏斜,如果前束适当,轮胎滚动时的偏斜方向就会抵消,轮胎内外侧磨损的现象会减少。

第25页

第十章 赛车的基本参数

赛车总重量:1200克

长:38.7cm 宽:18.5cm

高:9.2cm 电路功耗:21 w 总电容约:1200μF。

传感器类型为光电编码器,共15个;速度传感器一个。 赛道信息检测精度为8.5毫米,频率为370赫兹。

图一

第26页

第十一章 总结

本文从智能车的硬件结构、电路设计、软件实现方面进行了介绍。虽没能参加

第一届全国大学生“飞思卡尔”杯智能汽车竞赛,但是我校对这项比赛有很大的兴趣,看到冠军队使用光电传感器仍然以绝对优势战败其他对手,我们认为在光电产感器方面还是有很大的开发潜力。与摄像头比较起来调制式激光传感器的前瞻是很近的,为了弥补这个不足我们决定运用赛道记忆算法。当然要实现这个想法还是需要对智能车各项系统又充分理解才行,我们在这个过程中也碰到许多问题与困难,以下就是对整个系统从构思到实现的回顾。

11.1比赛准备阶段

从第一届全国大学生“飞思卡尔”杯智能汽车竞赛落下帷幕就开始着手此次

比赛,在指导老师的帮助下大家经过不懈的努力,对智能车进行深入地研究,对飞思卡尔16控制器MC9S12DG128有了深入地了解。最终决定了主要的设计方案,一些细节则是通过各项试验才决定的。同时对于CodeworriorIED开发环境有了相当充分的了解,并熟练掌握BDM的调试方法。通过对整个设计建模,充分发挥动手能力把想法变为现实,并配以合理的理论解释,将智能车的硬件设计、软件辅助设计清晰表达出来。

11.2激光传感器设计

比赛规则中表明只允许运用15个传感器,我们通过试验采用性价比最为合适的激光管作为传感器,采用自主设计的电路板实现对黑线的识别。通过比对测试和理论计算最后采用前十后五排列方式,并实现赛道记忆的功能。

11.3赛道记忆控制策略及开发的赛车运动状态实时监测系统

由于光电传感器的前瞻较近,弥补其最好的方法就是采用赛道记忆算法,这样

第二圈中的前瞻就变“远”了。在开发阶段我们自主开发了赛车运动状态实时监测系统,利用该系统获取赛车的信息,通过算法把赛车的速度、转角最优化,充分发挥其性能。

11.4设计中存在的问题

1)舵机转向系统

赛车在转弯处主要靠舵机转动提供转角,虽然舵机的性能是固定的,但是不同的舵机安装方式会使其性能有所不同。最终采用立式舵机固定方式,使两端距两轮的距离相等,便于改变转角。可是舵机转动的灵活性还是与理论中存在着很大差距的,所以准确地为舵机定位,合理的机械结构也会使舵机得到充

第27页

第二届全国大学生智能汽车竞赛技术报告

分发挥。 2)静电干扰

由于赛车车轮与赛道间摩擦,会产生静电。受静电影响赛车会产生许多异常情况,如重起、传感器状态紊乱等等。为此我们在赛车前加上金属杠,吸收部分静电;也可以在车底贴上锡箔纸防止静电穿过单片机;从电路板的设计角度出发,改变电路板设计也可以有效防止静电。 3)重量分配方案

赛车在运动中重心会影响其稳定性,所以准确确定赛车重心可以在高速状态下减少赛车的晃动。通过各种试验,调整电池、主板的位置及高度,找到比较适合车身质量的重心位置,重心偏低可以提高赛车的稳定性,所以在电路板设计时要同时考虑其形状要求。 4)坡道传感器状态不稳定

比赛介绍中提到了决赛中有坡道,为了有比较大的前瞻,在上坡时光电传感器装态会有乱码出现。针对此问题,我们适当调整传感器前瞻距离和光电管的光强,并在程序中增加了滤波功能,降低了此状态出现的概率。 5)赛道记忆算法不能准确校核

赛车在高速运行中,行驶轨迹的微小变化以及车轮的打滑都会使前后两圈的路程校准产生较大误差。所以要在提高速度的同时保证赛车的稳定性,并且在程序上减小误差,提高校准精度,使赛道记忆算法得到充分的利用。

11.5未来寄语

通过比赛的方式让我们学到了许多,对于汽车的机械结构、光电传感器、

软件设计有了深入的了解,并拥有了一整套较为完善的软件系统。但是由于知识有限,同学们对于各项内容的理解还不够,在算法上还有很大的提高空间。当然现在的设计方案还存在一些问题,我们暂时还不能够解决,希望在比赛中可以学到更多,在以后的比赛中得以提高。

最后感谢飞思卡尔公司为我们提供这样一个平台,让大家在智能车比拼中感受到速度的快感和知识的乐趣。

第28页

参考文献

[1] 王英涛,印永华,蒋宜国等.我国实时动态监测系统的发展现状及实施策略研究.电

网技术,2005,29(11):44~48.

[2] 赵翔,李著信,萧德云等.故障诊断技术的研究现状与发展趋势.机床与液压,2002,

No4:3~7.

[3] 潘俊荣,王明凯,郭谆钦等.计算机辅助监测诊断系统的发展和趋势.机械,2002,

29(增刊):4~6.

[4] 王琳,商周,王学伟.数据采集系统的发展与应用.电测与仪表,2004,41(464):

4~8.

[5] 李娟,吕振.基于单片机SST89E564的数据采集系统.工业控制计算机,2006,19(12):

79~80.

[6] 苏厚军,杨家军,王润卿.基于小波分析的信号检测研究与应用.武汉理工大学学报,

2005,27(1):15~17.

[7] Edmonds P,Hirst G. Near-synonymy and Lexical Choice.Computational

Linguistics.2002, 28(2):105~144.

[8] 卓晴,黄开胜,邵贝贝.学做智能车.北京:北京航空航天大学出版社,2007. [9] 邵贝贝,龚光华.单片机认识与实践.北京:北京航空航天大学出版社,2006. [10] [11] [12] [13] [14] [15] [16] [17] [18] [19]

洪家平.Windows环境下PC机与单片机的通信.微计算机信息,2005,21(3):

137~143.

于庆广,刘葵,王冲等.光电编码器选型及同步电机转速和转子位置测量.电气

传动,2006,36(4):17~20.

江淑红,李涛,刘祖望.基于单片机的低成本高性能异步串口扩展技术.计算机

工程,2005,31(6):195~196.

Lightner, B. Tiny AVR serial port programmer. Circuit Cellar Inc . 2006,

192: 20-2,24~8,30.

胡立坤,王庆超.基于UART的可靠通信与性能分析.计算机工程,2006,32(10):

15~19.

邵贝贝. 嵌入式实时操作系统[LC/OS-Ⅱ(第2版)[M]. 北京.清华大学出版

社.2004

邵贝贝. 单片机嵌入式应用的在线开发方法[M].北京.清华大学出版社.2004 王晓明. 电动机的单片机控制[M].北京. 北京航空航天大学出版社.2002 臧杰,阎岩. 汽车构造[M]. 北京. 机械工业出版社.2005

安鹏,马伟.S12单片机模块应用及程序调试[J]. 电子产品世界. 2006.第211

期. 162-163

- - 35 - -

第二届全国大学生智能汽车竞赛技术报告

[20] [21] [22] [23] [24]

童诗白,华成英.模拟电子技术基础[M].北京. 高等教育出版社.2000 沈长生.常用电子元器件使用一读通[M].北京. 人民邮电出版社.2004 宗光华.机器人的创意设计与实践[M].北京. 北京航空航天大学出版社.2004 张伟等.Protel DXP高级应用[M].北京. 人民邮电出版社.2002 张文春. 汽车理论[M].北京.机械工业出版社.2005

- - 36 - -

第二届全国大学生智能汽车竞赛技术报告 程序源代码: V_PID.H

#define VV_KPVALUE 10 #define VV_KIVALUE 4 #define VV_KDVALUE 8 #define VV_MAX 1200 #define VV_MIN 0

#define VV_DEADLINE 0x00 typedef struct PID {

signed int vi_Ref;

signed int vi_FeedBack; signed long vi_PreError; signed long vi_PreDerror;

unsigned int v_Kp; unsigned int v_Ki; unsigned int v_Kd;

signed long vl_PreU; unsigned long vl_Pre;

// PID Control Structure

}PID;

PID sPID; {

signed long error,d_error,dd_error;

signed long v_PIDCalc( PID *pp )

error = (signed long)(pp->vi_Ref - pp->vi_FeedBack); d_error = error - pp->vi_PreError;

dd_error = d_error - pp->vi_PreDerror;

pp->vi_PreError = error;

pp->vi_PreDerror = d_error;

if( ( error < VV_DEADLINE ) && ( error > -VV_DEADLINE ) ); else

- II -

}

void PIDInit () { }

sPID.vi_Ref = 0 ;

sPID.vi_FeedBack = 0 ; sPID.vi_PreError = 0 ; sPID.vi_PreDerror = 0 ;

sPID.v_Kp = VV_KPVALUE; sPID.v_Ki = VV_KIVALUE; sPID.v_Kd = VV_KDVALUE;

} }

return (pp->vl_PreU);

if(error>20) { }

if( pp->vl_PreU >= VV_MAX ) {

pp->vl_PreU = VV_MAX; }

else if( pp->vl_PreU <= VV_MIN ) {

pp->vl_PreU = 0;

{

pp->vl_PreU+= (signed long)( pp -> v_Kp * d_error + pp -> v_Ki * error +

pp->v_Kd*dd_error);

pp->vl_PreU=VV_MAX;

sPID.vl_PreU = 0;

main.c

- III -

第二届全国大学生智能汽车竞赛技术报告

#include /* common defines and macros */ #include /* derivative information */ #pragma LINK_INFO DERIVATIVE \#include\

#include\#include\#include\#include\

uint Sen_Data;

uint ModulateSensor_Data; uint ModulateSensor_Data_Pre; uchar OutFlag;

uchar MSensorDataRecord[20]; uchar StraightFlag; uchar Flash;

long StartPos; uchar Sen_Data5;

uchar ModulateSensor_Data5; uchar ModulateSensor_Data5_Pre; uchar OutFlag5; uchar StartSenData; uchar JudgementCollect;

void s12clk_init() { PLLCTL = 0xFF; SYNR = 0x02; REFDV = 0x01;

while(CRGFLG_LOCK == 0){} CLKSEL_PLLSEL = 1; }

void ECT1_Init() {

TSCR2_PR = 0; //prescale factor is 1, bus clock/2=24Mhz TSCR2_TOI = 0; //timer overflow interrupt disable

- IV -

TSCR1_TEN = 1; //timer enable

TIOS_IOS1 = 1; //set IOS1 to output compare TC1 = 1000; //output compare value is 2400

TIE_C1I = 1; //output compare interrupt1 enable }

void device_init() { uchar init_databass; DDRA = 0xFC; DDRB = 0x00; DDRT = 0x62; DDRS = 0x03; DDRM = 0x3C; ATD0DIEN = 0xFF; PTT_PTT6 = 0; s12clk_init(); ECT1_Init(); init_7279(); PWM67_Init(); Motor_Init(); OutFlag = 1;

StartIdentification = 0; CrossIdentification = 0; DisControl = 20000; CheckStateFlag = 0; FinalJudge = 0; FirstJ = 0;

JudgementCollect = 0; QD_Dis = 20000; test = 9; test2 = 0; test3 = 0; test4 = 0;

for(init_databass = 1;init_databass < 98;init_databass++){ TrailInfoSave[init_databass].Location = 0xFFFFFF; TrailInfoSave[init_databass].TrailType = 0xFF;

- V -

第二届全国大学生智能汽车竞赛技术报告 }

TrailInfoSave[98].Location = 0; TrailInfoSave[98].TrailType = 1; TrailInfoSave[99].Location = 0; TrailInfoSave[99].TrailType = 1; Memory_init(); StrFlag = 0;

RushingLength = 80000; StrDistance = 20000; }

void SensorData_Record(){ uchar i;

for(i=0;i<19;i++){

MSensorDataRecord[19-i] = MSensorDataRecord[18-i]; }

MSensorDataRecord[0] = ModulateSensor_Data; }

void StraightJudge() { uchar i;

StraightFlag = 1; for(i=0;i<19;i++){

if((MSensorDataRecord[i]<8)||(MSensorDataRecord[i]>14)) StraightFlag = 2; } }

uint Sensor_Exchange() {

uint MSen_Data; MSen_Data = 0; SensorState = 1; switch(Sen_Data) {

case 1:MSen_Data = 2; if(OutFlag == 2)

- VI -

OutFlag = 1; break;

case 3:MSen_Data = 3; if(OutFlag == 2) OutFlag = 1; break;

case 2:MSen_Data = 4; break;

case 6:MSen_Data = 5; break;

case 4:MSen_Data = 6; break;

case 12:MSen_Data = 7; break; case 8:MSen_Data = 8; break; case 24:MSen_Data = 9; break;

case 16:MSen_Data = 10; break;

case 48:MSen_Data = 11; break;

case 32:MSen_Data = 12; break;

case 96:MSen_Data = 13; break;

case 64:MSen_Data = 14; break;

case 192:MSen_Data = 15; break;

case 128:MSen_Data = 16; break;

case 384:MSen_Data = 17; break;

case 256:MSen_Data = 18; break;

- VII -

第二届全国大学生智能汽车竞赛技术报告 case 768:MSen_Data = 19; if(OutFlag == 3) OutFlag = 1; break;

case 512:MSen_Data = 20; if(OutFlag == 3) OutFlag = 1; break;

case 896:MSen_Data = 22; break;

case 7:MSen_Data = 23; break;

case 448:MSen_Data = 24;

break; case 14:MSen_Data = 25; break;

case 224:MSen_Data = 26; break;

case 112:MSen_Data = 27; break;

case 56:MSen_Data = 28; break;

case 28:MSen_Data = 29; break;

////////////////////////////////////////////

// case 7: ModulateSensor_Data = ModulateSensor_Data_Pre; break; //case 14: ModulateSensor_Data = ModulateSensor_Data_Pre; break; //case 28: ModulateSensor_Data = ModulateSensor_Data_Pre; break; // case 56: ModulateSensor_Data = ModulateSensor_Data_Pre; break; //case 112:ModulateSensor_Data = ModulateSensor_Data_Pre; break; //case 224:ModulateSensor_Data = ModulateSensor_Data_Pre; break; //case 448:ModulateSensor_Data = ModulateSensor_Data_Pre; break; //case 896:ModulateSensor_Data = ModulateSensor_Data_Pre; break; ///////////////////////////////////////// default :MSen_Data = ModulateSensor_Data_Pre;

SensorState = 0;//传感器状态表明当前状态不稳定

- VIII -

break; }

return MSen_Data; }

uchar SensorBack_Exchange() { uchar MBSen_Data; MBSen_Data = 0; switch(Sen_Data5) {

//////////////////left/////////////////// case 16:MBSen_Data = 2;OutFlag5 = 1; break;

case 24:MBSen_Data = 3; break;

case 8:MBSen_Data = 4; break;

case 12:MBSen_Data = 5; break;

case 4:MBSen_Data = 6;OutFlag5 = 2; break;

case 6:MBSen_Data = 7; break; case 2:MBSen_Data = 8; break; case 3:MBSen_Data = 9; break;

case 1:MBSen_Data = 10;OutFlag5 = 3; break;

/////////////////////////////////////////////////////////////////// default :MBSen_Data = ModulateSensor_Data5_Pre; break; }

return MBSen_Data; }

#pragma CODE_SEG NON_BANKED

- IX -

第二届全国大学生智能汽车竞赛技术报告 #pragma TRAP_PROC void ECT1(void) {

TFLG1_C1F = 1; //clear flag

switch(TC1) {

case 1000 : TC1 = 7000;Sen_Data = 0;Sen_Data5 = 0;

PORTA_BIT6 = 1;PORTA_BIT7 = 0;PTT_PTT1 = 0; case 7000 : TC1 = 31000;

Sen_Data = Sen_Data + (uint)(PORTAB & 0x210); Sen_Data5 = Sen_Data5 + (uchar)(PORTAD0 & 0x80);

PORTA_BIT6 = 0;PORTA_BIT7 = 0;PTT_PTT1 = 0;

PORTA_BIT2 = 1;PORTA_BIT3 = 0;PORTA_BIT4 = 0; break;

PORTA_BIT2 = 0;PORTA_BIT3 = 0;PORTA_BIT4 = 0; shingLength);

break; case 31000: TC1 = 34000;

Motor_Control(ModulateSensor_Data,JudgementCollect,&StrFlag,&SpeedUpLength,&Ru

PORTA_BIT6 = 0;PORTA_BIT7 = 1;PTT_PTT1 = 0; case 34000: TC1 = 35000;

PORTA_BIT2 = 0;PORTA_BIT3 = 1;PORTA_BIT4 = 0; break;

Sen_Data = Sen_Data + (uint)(PORTAB & 0x108); Sen_Data5 = Sen_Data5 + (uchar)(PORTAD0 & 0x40);

PORTA_BIT6 = 0;PORTA_BIT7 = 0;PTT_PTT1 = 0;

break;

case 35000: TC1 = 38000;

PORTA_BIT6 = 1;PORTA_BIT7 = 1;PTT_PTT1 = 0;

break;

case 38000: TC1 = 39000;

Sen_Data = Sen_Data + (uint)(PORTAB & 0x84); Sen_Data5 = Sen_Data5 + (uchar)(PORTAD0 & 0x20);

PORTA_BIT6 = 0;PORTA_BIT7 = 0;PTT_PTT1 = 0;

break;

case 39000: TC1 = 42000;

PORTA_BIT6 = 0;PORTA_BIT7 = 0;PTT_PTT1 = 1; case 42000: TC1 = 44000;

Sen_Data = Sen_Data + (uint)(PORTAB & 0x42);

- X -

break;

PORTA_BIT2 = 0;PORTA_BIT3 = 0;PORTA_BIT4 = 0;

PORTA_BIT2 = 1;PORTA_BIT3 = 1;PORTA_BIT4 = 0;

PORTA_BIT2 = 0;PORTA_BIT3 = 0;PORTA_BIT4 = 0;

PORTA_BIT2 = 0;PORTA_BIT3 = 0;PORTA_BIT4 = 1;

Sen_Data5 = Sen_Data5 + (uchar)(PORTAD0 & 0x10); PORTA_BIT6 = 0;PORTA_BIT7 = 0;PTT_PTT1 = 0; case 44000: TC1 = 46000;

PORTA_BIT6 = 1;PORTA_BIT7 = 0;PTT_PTT1 = 1;

break;

case 46000: TC1 = 50000;

Sen_Data = Sen_Data + (uint)(PORTAB & 0x21); Sen_Data5 = Sen_Data5 + (uchar)(PORTAD0 & 0x08); Sen_Data5 = Sen_Data5 >> 3; //test = Sen_Data;

StartSenData = Sen_Data5;

PORTA_BIT6 = 0;PORTA_BIT7 = 0;PTT_PTT1 = 0; if(FinalJudge == 1) { JudgementCollect ++;

if((JudgementCollect == 3)&&(Mileage < StartPos - 20000)){ JudgementCollect = 2; FinalJudge = 0; test = Mileage; }

if(JudgementCollect == 1) { Mileage = 0; }

if(JudgementCollect == 2){ test = Mileage;

TrailInfoSave[SerNumber].TrailType = 1; StartPos = Mileage; Mileage = 0; AmendPoint(); StrInfoPick(); }

if(FinalJudge != 0) { Memory_init(); FinalJudge = 0;

- XI -

TrailInfoSave[SerNumber].Location = 0x11111111;

break;

PORTA_BIT2 = 0;PORTA_BIT3 = 0;PORTA_BIT4 = 0;

PORTA_BIT2 = 1;PORTA_BIT3 = 0;PORTA_BIT4 = 1;

PORTA_BIT2 = 0;PORTA_BIT3 = 0;PORTA_BIT4 = 0;

第二届全国大学生智能汽车竞赛技术报告 {

crossCollect = 0; QD_Dis = 20000; } }

if(Sen_Data == 0) { SensorState = 1;

if(ModulateSensor_Data_Pre < 3) { ModulateSensor_Data = 1; OutFlag = 2; }

else if(ModulateSensor_Data_Pre > 19) { ModulateSensor_Data = 21; OutFlag = 3; }

if((ModulateSensor_Data != 1)&&(ModulateSensor_Data != 21))

if(ModulateSensor_Data_Pre < 11) ModulateSensor_Data = 1; else

ModulateSensor_Data = 21; }

ModulateSensor_Data_Pre = ModulateSensor_Data; } else{

ModulateSensor_Data = Sensor_Exchange(); if(OutFlag != 1)

ModulateSensor_Data = ModulateSensor_Data_Pre; }

if(Sen_Data5 == 0) { switch(OutFlag5){

case 1:ModulateSensor_Data5 = 1; break;

case 3:ModulateSensor_Data5 = 11; break; } }

- XII -

else

ModulateSensor_Data5 = SensorBack_Exchange(); ModulateSensor_Data_Pre = ModulateSensor_Data; ModulateSensor_Data5_Pre = ModulateSensor_Data5; SensorData_Record();

//SenDataTransfor(ModulateSensor_Data5 * 5); break; case 50000: TC1 = 1000;

if(JudgementCollect == 1) {

test = Mileage;

MainRemember(ModulateSensor_Data5,&Mileage,&QD_Dis);

if(Flash > 128) PTT_PTT6 = 1; else

PTT_PTT6 = 0; Flash = Flash + 2;

//SenDataTransfor(ModulateSensor_Data5 * 5); if(FinalJudge == 2){ test4 = 0; crossCollect ++;

CrossSign[SignSN] = Mileage; SignSN ++; FinalJudge = 0; } }

else if(JudgementCollect == 2) { //test = Mileage;

SecLapRegulate(ModulateSensor_Data5,&Mileage,&QD_Dis); StrSpeedUp(ModulateSensor_Data5,&StrDistance,&Mileage); PTT_PTT6 = 1; //Monitor(); }

StraightJudge();

- XIII -

第二届全国大学生智能汽车竞赛技术报告 ; }

#pragma CODE_SEG DEFAULT void main(void) {

/* put your own code here */ //uchar x; EnableInterrupts; device_init(); for(;;) {

dis_data (3,7,SpeedUpLength);//StrFlag); //dis_data (4,5,test6);

//dis_data (6,7,ModulateSensor_Data5); //dis_data (4,5,ModulateSensor_Data); //dis_data (3,3,SensorState); //////////////////////////// if(JudgementCollect > 2){ uint Ch; uint i;

DisableInterrupts; PWMDTY45 = 0; i = 0;

Ch = get_data(5,7); dis_data (2,7,0); for(i=0;i<400;i++){

if((Ch < 560)&&(Ch > 550))

dis_data (2,7,AmendPointSave1[Ch-555].Location); else if((Ch < 570)&&(Ch > 560))

dis_data (2,7,AmendPointSave1[Ch-560].Location); else if((Ch < 580)&&(Ch > 570))

dis_data (2,7,AmendPointSave1[Ch-565].Location);

- XIV -

break; default : TC1 = 1000;

break; }

Rudder_Control(1,SensorState,ModulateSensor_Data,ModulateSensor_Data5,StrFlag)

else if((Ch < 660)&&(Ch > 650)) dis_data (2,7,mileagetest[Ch-655]); else if((Ch < 670)&&(Ch > 660)) dis_data (2,7,mileagetest[Ch-660]); else if((Ch < 760)&&(Ch > 750)) dis_data (2,7,mileageSee[Ch-755]); else if((Ch < 770)&&(Ch > 760)) dis_data (2,7,mileageSee[Ch-760]); else if((Ch < 780)&&(Ch > 770)) dis_data (2,7,mileageSee[Ch-765]); else if((Ch < 860)&&(Ch > 850)) dis_data (2,7,CrossSign[Ch-855]); else if((Ch < 960)&&(Ch > 950)) dis_data (2,7,Crosstest[Ch-955]); else

dis_data (2,7,1); 7279.h

#define FREQUENCY 24 #define clk PTT_PTT4 #define dat PTT_PTT3 #define key PTT_PTT2

#define DDRcs DDRT_DDRT5 #define DDRclk DDRT_DDRT4 #define DDRdat DDRT_DDRT3 #define DDRkey DDRT_DDRT2

- XV -

#define CMD_RESET 0xa4 #define CMD_TEST 0xbf #define DECODE0 0x80 #define DECODE1 0xc8 #define CMD_READ 0x15 #define UNDECODE 0x90

#define cs PTT_PTT5

#define RTL_CYCLE 0xa3 #define RTR_CYCLE 0xa2

本文来源:https://www.bwwdw.com/article/emkr.html

Top