您好,欢迎来到华佗小知识。
搜索
您的当前位置:首页杭州电子科技大学_钱江一号队(光电组)_技术报告2009

杭州电子科技大学_钱江一号队(光电组)_技术报告2009

来源:华佗小知识
第四届“飞思卡尔”杯全国大学生

智能汽车竞赛

技 术 报 告

学 校:杭州电子科技大学 队伍名称:钱江1号队

参赛队员:吕焱飞 张劲 陆昊旸

带队教师:陈龙 黄继业

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

本人完全了解第四届“飞思卡尔”杯全国大学生智能汽车邀请赛关保留、使用技术报告和研究论文的规定,即:参赛作品著作权归参赛者本人,比赛组委会和飞思卡尔半导体公司可以在相关主页上收录并公开参赛作品的设计方案、技术报告以及参赛模型车的视频、图像资料,并将相关内容编纂收录在组委会出版论文集中。

参赛队员签名:吕焱飞

张劲 陆昊旸

带队教师签名:陈龙

黄继业

日 期:2009-08-10

- 2 -

摘 要

本文介绍了杭州电子科技大学钱江1号队队员们在准备第四届飞思卡尔智能车大赛中的工作成果。智能车的硬件平台采用带MC9S12DG128 处理器的S12 环境,软件平台为CodeWarrior IDE 开发环境,车模采用大赛组委会统一提供的1:10 的仿真车模。

文中介绍少了智能小车控制系统的软硬件结构及设计开发过程。整个系统涉及车模机械结构调整、传感器电路设计及信号处理、控制算法和策略优化等多个方面。车模以MC9S12DG128单片机为控制核心,以安装在随动舵机之上的激光管作为循迹传感器,采用红外传感器检测起跑线,以光电编码器检测速度信息。车模系统的简单工作原理是MC9S12DG128单片机收集激光管传感器和红外传感器返回来的赛道信息,通过软件判断其有效性,以激光管传感器返回的赛道信息,结合控制算法控制随动舵机及前轮舵机打角,单片机再综合赛道信息以当前速度信息,利用PD算法控制速度变化。

经实际场地测试,本车模系统可以很好的适应大“S”弯,蛇形弯,“十”字交叉大回环等不同的赛道类型以及不同类型赛道的不同组合。在我们的39米练习赛道上,我们的车模单圈最短时间为13.5s,速度达到达到3m/s!

关键词:智能车,MC9S12DG128单片机,激光传感器,编码器,舵机摆头,PD

算法

I

目 录

第一章 引言.........................................................................................................- 1 -

1.1概述............................................................................................................- 1 - 1.2 系统整体构想...........................................................................................- 1 - 第二章 系统硬件电路设计....................................................................................- 3 -

2.1 硬件电路整体架构设计...........................................................................- 3 - 2.2 单片机最小系统板电路设计...................................................................- 3 - 2.3 激光发射与接收电路设计.......................................................................- 4 - 2.4 信号放大电路设计...................................................................................- 5 - 2.5 红外对管电路设计...................................................................................- 6 - 2.6 电机驱动电路设计...................................................................................- 6 - 2.7 舵机驱动电路设计...................................................................................- 7 - 2.8 液晶显示电路设计...................................................................................- 8 - 2.9 系统电源电路设计...................................................................................- 8 - 2.10 系统主板电路设计...............................................................................- 10 - 2.11 硬件电路部分总结...............................................................................- 11 - 第三章 传感器布局架构与机械结构调整..........................................................- 12 -

3.1 机械部分总体概述.................................................................................- 12 - 3.2 传感器布局与安装.................................................................................- 12 -

3.2.1 红外对管布局与安装..................................................................- 12 - 3.2.2 激光管布局与安装......................................................................- 13 - 3.3 电路板及其他硬件部分的固定.............................................................- 15 -

3.3.1 前轮舵机的安装..........................................................................- 15 - 3.3.2 光电编码器的安装......................................................................- 15 - 3.3.3 液晶显示电路板的安装..............................................................- 16 - 3.3.4 系统主板的布局与安装..............................................................- 16 - 3.4 机械部分调整.........................................................................................- 17 -

3.4.1 前轮倾角调整..............................................................................- 17 - 3.4.2 差速机构调整..............................................................................- 18 - 3.5 模型车外形.............................................................................................- 19 - 第四章 软件系统设计..........................................................................................- 21 -

4.1 软件控制的总体思路.............................................................................- 21 - 4.2主程序设计..............................................................................................- 21 -

4.2.1 主程序结构..................................................................................- 21 - 4.2.2 程序的运行..................................................................................- 22 - 4.3 循迹子程序设计.....................................................................................- 22 -

II

4.4 舵机摆头与打角子程序设计.................................................................- 23 -

4.4.1 随动舵机控制程序设计..............................................................- 23 - 4.4.2 前轮舵机打角控制程序设计......................................................- 24 - 4.5 速度控制子程序设计.............................................................................- 24 -

4.5.1 速度的标定..................................................................................- 24 - 4.5.2 加减速控制..................................................................................- 24 - 4.6 软件部分总结.........................................................................................- 25 - 第五章 开发工具、制作、安装、调试过程说明..............................................- 26 -

5.1 Codewarrior IDE的安装与使用..............................................................- 26 -

5.1.1 工程的创建..................................................................................- 27 - 5.1.2 程序源代码的编辑、编译与链接..............................................- 28 - 5.1.3 BDM调试......................................................................................- 29 - 5.2 现场调试.................................................................................................- 30 - 5.3 调试中遇到的问题及解决过程.............................................................- 32 -

5.3.1 高速舵机问题..............................................................................- 32 - 5.3.2 光点宽度问题..............................................................................- 33 -

第六章 车模技术参数说明..................................................................................- 34 -

6.1 车模主要技术参数.................................................................................- 34 - 6.2 机械部分其它参数.................................................................................- 34 - 6.3 电路中芯片的种类及数量.....................................................................- 35 - 6.4 其它技术参数.........................................................................................- 35 - 6.5 设计过程中用到的主要软件工具.........................................................- 35 - 第七章 总结..........................................................................................................- 36 - 致 谢..............................................................................................................- 38 - 参考文献................................................................................................................- 39 - 附录A 车模系统C语言源程序...................................................................................II

III

第一章 引言

1.1概述

全国大学生飞思卡尔智能汽车竞赛时由教育部高等自动化专业教学指导分委员会主办的,以“立足培养,重在参与,鼓励探索,追求卓越”为指导思想,是以智能汽车为竞赛平台的多学科专业交叉的创意性科技竞赛。该竞赛以飞思卡尔半导体公司为协办方,已成功举办三届。

为准备第四届飞思卡尔智能车大赛,我们从08年12月开始组队,历时8个月。在上一届比赛经验的基础上,在硬件、机械与软件都有很大的改造与提高。

在确定以激光管作为传感器之后,我们花了大量的时间寻找合适的激光发射管与接收管,在激光管布局上,我们拟过不同的方案,对每种方案都编写过大量的测试代码在实际场地测试,最后确定了将激光管架设在随动舵机之上这一方案。硬件电路同样测试对比过不同的方案才最终确定下来。在后来的调试中不断在机械上有调整和改进。为使小车能适应各种不同路况的赛道,我们也花了大量的时间,精力与金钱设计赛道并切割制作出来。

本报告将以我们测试过的最优的传感器布局架构方案为主体,从硬件电路芯片选型与设计,传感器的布局架构,机械部分调整,单片机控制软件的主要理论、控制策略及实现方法等方面阐述智能车的设计工作。

1.2 系统整体构想

模型车以激光作为道路信息传感器,用架在舵机上的激光在赛道上打出

一排整齐的光点,以12ms为一周期处理路况信息,并控制传感器舵机摆头,以使一排光点之中心恰好在赛道黑线之上,从而时刻跟紧黑线,从不出现丢线的情况。

单片机综合考虑上方传感器摆头舵机PWM值与光点检测到的黑线位置,决定下方前轮的舵机打角。单片机综合考虑前轮舵机的PWM值,光点检测到的

- 1 -

第四届全国大学生智能车大赛技术报告

黑线位置,以及当前编码器反馈回来的值等因素,作出速度控制具体策略。最终通过两路PWM控制电机的运作。同时,通过红外管辅助检测赛道信息,如坡道,起跑线等,并作出相应处理。

在单片机软件的编写上,说的简单一点,就是让单片机的相关引脚在特定的时候输出高电平或低电平。但这个难度在于什么时刻出现高电平或低电平,以及保持多长时间。控制系统采用PID算法。对前轮舵机值简单取了一个P项,而对于前轮舵机及速度控制,我们采用PD算法进行控制。

- 2 -

第二章 系统硬件电路设计

这一章将说明我们车模的每一部分硬件电路的原理及设计的实现方法。

2.1 硬件电路整体架构设计

图2-1 系统电路总体构架图

系统整体结构如图2-1所示,我们将电路分成几个模块——单片机最小系统,电源电路,传感器电路,运放电路,电机驱动电路,调试用的液晶显示电路以及把它们连接在一起的系统主板电路。

2.2 单片机最小系统板电路设计

为尽量减小模型车总重量,我们自己设计了单片机最小系统板,最小系统板中包括单片机时钟与复位电路,串口及MAX232电路,并将所有I/O口引出。图2-2 为单片机最小系统板PCB图及实物图,最终的PCB图的尺寸为54.4mm×47.0mm。

- 3 -

第四届全国大学生智能车大赛技术报告

图2-2 单片机最小系统板PCB图及实物图

2.3 激光发射与接收电路设计

我们决定采用激光作为传感器之后,采用什么样是激光发射与接收管一直困扰着我们。所以,在真正开始做小车之前,我们花了大量的时间在寻找,测试合适的激光发射与接收管。在经过3个月的不懈努力,最终确定了合适的发射管与接收管。

用激光与用红外,对道路信息的采集的基本原理相似,这里将不再介绍。但激光发射管不能像红外一样一直在发射。这样很容易会造成激光管的损坏,而且这样对于接收管来说,它会同时接收到两个或多个赛道上的激光点,从而不能识别出赛道信息。

针对此情况,我们决定对于激光发射管,采用分时发射模式,这种发射模式的特点是,每一时刻只有一个激光管在工作,这个特点就让我们没有必要每个发射管都对应一个接收管,接收管在合适的角度上可以同时接收到两个甚至三个发射管打出去的光电所返回来的信号。

考虑到传感器要架在随动舵机之上,能跟随黑线左右摆头,所以整个电路板不宜做的过重,也就是不能集成很多其他的电路,如驱动电路等。所以,对于这部分电路设计,我们只放了激光发射管与接收管。PCB布线上,我们将发射管与接收管的连线分放两层,以减小干扰,电路板PCB如图2-3所示。

- 4 -

第二章 系统硬件电路设计

图2-3 激光发射与接收电路板PCB图

激光管还有其它部分电路如驱动电路,信号后级处理电路。对于像激光管这样的多路驱动,我们采用达林顿驱动芯片ULN2803。信号的后级处理,我们是将接收管收到的信号通过运算放大器放大。这部分电路都集成在其它电路部分。

2.4 信号放大电路设计

对于所选接收管,可以说是像一个“带宽滤波器”,对特定波长范围的光波很敏感,而对于其它波长的光波则反应很小。接收管接收激光通过赛道返回回来的信号,当激光管光点照在赛道黑线与白板上时,接收管接收到的返回回来的信号强弱有明显的差别,白板可以有200 mV左右,而黑线只有10mV左右,但这对于单片机的AD来说,还是不容易分辨出来,所以,我们在接收管之后增加了一个TI公司的轨到轨运算放大器TLC2202。TLC2202的应用电路如图2-4所示。经过运放出来的信号在黑线与白板上的差距相当明显,光点在合适距离上,信号强度差距可达4V以上。这部分电路设计中,我们用了4个这样的运放,总共可以放大8路信号。

图2-4 TLC2202应用电路原理图

- 5 -

第四届全国大学生智能车大赛技术报告

2.5 红外对管电路设计

这部分电路很是简单,采用ST188 红外对管作为传感器。5V电源为红外发射管供电,接收管不经过运放直接接到单片机AD输入端口。电路较简单,我们直接画出PCB图。

2.6 电机驱动电路设计

对于电机驱动电路,可有多种选择,像专用电机驱动芯片MC33886,电调,MOS管H桥。MC33886使用方便,但内阻较大,电调驱动能力最好,但价格太高,最好用的还是MOS管H桥。

参赛队伍中,也有很多都是用H桥作为电机驱动电路。我们考虑用全桥驱动电路作为电机的驱动电路主要是看好它控制简单,并且驱动能力也不错。用全桥可以让车模在高速入弯时顺利刹车减速入弯。其实用两片英飞凌公司的PN型半桥芯片BTS7970联立就可以组成全桥。BTS7970封装及管脚分配如图2-5所示。这种方案较之其他常规的MOS管H桥有多方优势。只两片芯片,硬件电路简单,并且减轻车模重量。我们就是采用两个半桥联立成的全桥作为电机驱动电路。实际应用中我们采用4片半桥芯片,两两并联组成全桥,做出来的电路板尺寸只有:37.2mm×32.7mm,如图2-6所示。同样用两路PWM,控制方便;驱动电流可达68A;内阻只有7—9mΩ。

图2-5 BTS7970封装及管脚分配

- 6 -

第二章 系统硬件电路设计

图2-6 驱动模块电路原理图及PCB图

2.7 舵机驱动电路设计

舵机一般工作在6V,由于我们的路径识别方案上,传感器是架在舵机上的,

也就是车上有两个舵机,不同的是传感器下面的舵机是属于高速舵机,但同样工作在6V。舵机驱动电路就是为舵机供电以及给舵机转角信号。舵机工作电流一般在1A左右,我们就设想用一片开关电源芯片同时为两个舵机供电。选用LM2576-ADJ 3A开关型降压稳压器,2576最大可提供3A驱动电流,同时驱动两个舵机还有近1A的裕量,理论上是可行的,我们也通过实验验证这个设想是可行的。

舵机的控制只要一路PWM波,以20ms为周期,不同的占空比会使舵机稳定在不同的角度上,具体如图2-7所示。

图2-7 不同的PWM对应的舵机打角

- 7 -

第四届全国大学生智能车大赛技术报告

系统中用到两个舵机,分别用作传感器摆头及前轮打角。采用MS9S12DG128的两路16位PWM,PWM45和PWM67,作为控制信号源。电源部分将在下面说明。

2.8 液晶显示电路设计

图2-8 按键与液晶模块PCB图

为使软件上参数调节的方便,我们特意制作的这个液晶加键盘模块。调试中,这个模块给我们对参数的确定带来了极大的方便,不用为改一个参数而重新为单片机烧一下程序。模块采用4×4矩阵键盘 + Nokia5110(84*48)液晶。电路板尺寸为:78.5mm×45.0mm,PCB图如图2-8所示。单独做成一个模块,方便插拔,可以在跑车时卸下模块。

2.9 系统电源电路设计

系统要稳定工作,首先电源要稳定,系统中有多路电源,7.2V,6V,5V,

3.3V等。7.2V电池电压直接接到电机启动模块,6V为两个舵机供电,5V为单片机,激光管驱动电路,信号放大电路以及速度传感器供电,3.3V 电源共有两路,一路是通过5V电源稳压得到的3.3V,为液晶供电,另一路是直接由电池稳压到3.3V为激光发射管供电。整个电源部分电路如图2-9所示。

- 8 -

第二章 系统硬件电路设计

图2-9 电源管理部分整体框图

这种供电模式也是我们多次经过试验得到的。对于激光管发射管,提供的电压高一点,发射功率就大一点,这样光点就可以打的远一点,前瞻距离就更远,但是,电压高,激光管就容易烧坏,对于这个电压的确定,我们也牺牲了好几个激光管,最终确定3.3V刚好可以,而3.3V刚好可由一片1117稳压得到。 整个电源模块都集成在接口电路板上,总共用了四片电源芯片,分别是LM2940×1,LM2576-ADJ×1,ASM1117-3.3×2,ASM1117及LM2576的应用电路如图2-10 所示。

- 9 -

第四届全国大学生智能车大赛技术报告

图2-10 ASM1117应用电路原理图

2.10 系统主板电路设计

由于硬件是分模块设计的,最终要接在一起才能相互通信。主板电路主要有电源接口、单片机最小系统板插座、信号放大电路板插座、接红外管的AD端口、舵机及电机驱动接口,光点编码器接口等。同时,接口电路中号集成电源电路及激光管驱动电路。

接口电路板的PCB设计是要充分考虑与车模机械的配合,我们设计的PCB图如图2-11所示。

图2-11 接口电路板PCB图

- 10 -

第二章 系统硬件电路设计

2.11 硬件电路部分总结

对于硬件电路部分,一定要做的足够稳定,这对于整个系统的稳定性占着至关重要的位置。而整个电路中,电源电路更加重要,特别是为单片机供电,一定要稳定。不让,当电机启动的瞬间,或者舵机打角的时候,电机和舵机拉去很大的电流,这样会使电池电压瞬时拉到一个低电压状态,很可能会造成单片机供电不稳,而使单片机复位。对于提高电源稳定性,并上几个电容当然是好的,但是电容的最大电容量有。

在整个主板上,既有数字部分,又有模拟部分,所以,系统的稳定性与主板的电路布局布线也有很大关系。为提高整板的稳定性,我们是自己设计电路,绘制PCB版图,然后到工厂投板。在整个电路板的制作过程中,我们是先从总体上考虑电路布局,电路实现的功能,电路总体性能,然后再分模块绘图制作,最后通过排针排母,排线或者杜邦线连接在一起,整体构架稳定。

- 11 -

第三章 传感器布局架构与机械结构调整

3.1 机械部分总体概述

机械部分调校的好,对软件的编写有很大的促进。有时软件上为达到某个目的,不得不编写大量的代码,而同样的问题,可能在硬件后机械上的稍加修改就能完美的解决问题。

从整个系统上考虑:软件驾驭硬件,而硬件却依赖于机械架构。要想提高小车速度,软件要调的好,而硬件与机械上的一些优化,在很大程度上可以简化软件的编写。我们在确定硬件方案之后就开始做机械部分,以适合硬件的安装。我们对小车机械的一切调校都是为使小车重量轻,重心低,结构稳定牢固。我们简化硬件电路,简化车模构架,能省的都省掉,就这样一点一点降低模型车总重量。

下面,我们将从传感器和车模两个部分叙述机械结构调整过程。

3.2 传感器布局与安装

传感器的布局与安装决定于系统方案,反过来又会影响系统的稳定性与可靠

性以及软件的编写。 3.2.1 红外对管布局与安装

因为红外管只是作为辅助传感器,主要负责检测起跑线以及在坡道中辅助循

迹,就没必要放很多红外管,我们只用了7个红外管,中间一个红外管离两边距离为3cm,其它的两两间距为2.5cm。电路板总长为17.3cm。多余的PCB板镂空以减轻重量,实物如图3-1所示。。

图3-1 红外管电路板实物图

- 12 -

第三章 传感器布局架构与机械结构调整

安装时也没必要提高前瞻,我们将红外管的电路板固定于车身之前,离地面

大概2cm。如图2-2所示。

图3-2 红外管安装图

3.2.2 激光管布局与安装

由于选用激光作为传感器来识别路径,就可以不用像红外一样,传感器只能离地面很近。它可以架的很高,把光点打的很远,返回来的信号同样可以识别路径。我们试验过多种传感器布局架构方案:板子上用一排或两排激光管、赛道上打出一排或两排激光、传感器架在舵机摆头或直接架在车模上不摆头。经过试验论证,还是把传感器架在舵机上更有优势。它能根据黑线位置来调整自己的角度以保证时刻看到黑线,这样就可以把光点聚的很窄,电路板也就可以做窄,从而简化了硬件按电路。

至于电路板上排一排还是两排激光,这是各有利弊,排成一排更容易让光点打成一条直线,更容易确定接收管的角度来对上光点,排两排可以把板子做的更窄。再考虑电路板上用的发射管个数,我们也进行过多种试验。一般八个光点加摆头就能顺利完成路径识别的任务。但是,八个光点对于越来越复杂的路况还是不够的,一般10个以上激光发射管加摆头就很好了。由于激光管不能同时发射,只能是单个循环发射,这样就需要选通电路,考虑要把这个电路板做小做轻,我们把这部分电路放在了主板上,同时也把信号放大电路出去,最后只剩下激光发射与接收管。前文已经提过,我们不必要为每个发射管装一个接收管,我们使用一个接收管对应两个发射管。

综合考虑,我们的车模最终选择如图3-3所示的电路板作为我们的激光传感器布局方案。

- 13 -

第四届全国大学生智能车大赛技术报告

图3-3 我们所采用的激光管布局电路板实物图

下面是我们的传感器布局的更进一步说明:

单排传感器(激光接收管)对应单排激光发射管,共6个接收管12个发射管。发射管均匀分布,两两之间距离为1.3cm,接收管也是均有分布,间距为两个发射管间距。板子总长度15.5cm,下面留下1.5cm长用作固定。整体排列紧凑,多余的PCB板打孔减轻重量。对应方式为1个接收管对两个发射管,即A接收1和2,B接收3和4,C接收5和6……

对于激光管的安装,我们需要将激光电路板固定连接在随动舵机轮盘上,并保证连杆的竖直与激光电路板的水平且左右对称。连杆连接激光电路板与舵机轮盘,机械结构纯手工制作。选用质地轻,韧性小的材质,用钢锯,锉刀,钻床共同打造出来的。激光电路版的俯角可以任意调节。同时激光管上有聚焦透镜可以旋转拉远或拉近。对于舵机的固定,我们用固定在车模底盘上的三根同长的铜柱,加上相应的辅助机械结构,牢牢的固定住舵机。安装好之后的激光管如图3-4所示。

图3-4 激光管及摆头舵机安装详图

- 14 -

第三章 传感器布局与机械结构调整

在安装过程中,舵机的高度,激光管的高度,激光管的俯角,整体的重量、重心及其在车模上的位置等都是需要仔细考虑的因素。

3.3 电路板及其他硬件部分的固定

3.3.1 前轮舵机的安装

前轮舵机可是立放或者横放。立着放,舵机转动的力臂长,这样,舵机只要以小角度的转动就可以带给前轮较大的角度,但同时力臂长,舵机转动的力矩就大,舵机的转动的灵活性就受到阻碍。而横着放的主要缺点是它占据的车模底板大片面积,使得我们的主板无处安身,更别说传感器上随动舵机。

所以,我们的舵机就这样立放在车身前面,如图,我们用立于车模底盘两根铜柱夹住舵机,并且在舵机的上方及下方都有相应固定装置,安装好后如图3-5所示。

图3-5 前轮舵机的安装

3.3.2 光电编码器的安装

为使整个控制形成闭环,当前速度反馈是必须的。为了测出当前速度,我们用了一个罗特利科技有限公司的编码器。

该编码器为200P/R,供电电压可从5V 到 24V,共引出4跟线,应用时,只用到棕色、蓝色、白色,将棕色与蓝色分别接到电源的正极与负极,而白色接到单片机的一路输入捕捉的输入管脚PT7。编码器的固定只用了一片PCB板,足能稳定固定。安装好的编码器如图3-6所示。

- 15 -

第四届全国大学生智能车大赛技术报告

图3-6 编码器的安装

3.3.3 液晶显示电路板的安装

考虑到这部分要能够方便插拔,我们将从主板引出去的排线引到固定在电机座之上的排母上,而在按键与液晶电路板上焊接上排针,电路板一接上,按键与液晶便处在工作状态。

图3-8 按键与液晶模块的安装

3.3.4 系统主板的布局与安装

我们在绘制主板PCB板的时候,就充分考虑空间问题,以及安装的方便性问题。系统主板要紧贴车模底板以降低重心,要留足空间,为传感器舵机的架构着想,电路板与车模底盘之间有两点连接,在一条对角线上用螺丝螺母拧紧。由于我们硬件是分模块做好的,而每块都要连到接口电路板上以便相互通信,其中单片机最小系统板和运放的子板是直接通过排针排母插放在接口电路板上,按键与显示模块,以及激光管模块通过轻质的排线连接过去,红外管直接用十线的杜邦线与接口电路板连接,对于驱动部分,我们用了较粗的电源线连

- 16 -

第三章 传感器布局与机械结构调整

接。主板上放了不少指示灯,指示各部分是否工作正常以及各部分硬件连接是否有问题。

图3-7 主板的左右两部分

3.4 机械部分调整

对车模机械部分主要做了以下调整:1)前轮倾角调整;2)后轮差速机构调整。对前轮的调整,目的只是想让车模在行进中轮子总是只有滚动而没有横向的滑动。这样就减小摩擦调高灵活性,对差速机构的调整是为了调高车模过弯性能。

3.4.1 前轮倾角调整

为了保证车模转向轻便,行驶稳定,车模的前轮安装要有一定的角度位置要求。也就是通常说的前轮定位。包括转向节主销后倾、转向节主销内倾、前轮外倾和前轮前束。

1) 主销后倾

主销后倾可以增加小车直线行驶的稳定性,也就是前轮在偏转以后有自动恢复中立位置的趋势。这点可在日常生活中观察到,我们房间的门如果门销后倾,开门后没有外力会自动回复。

2) 主销内倾

主销内倾后缩短了主销轴线与地面交点到车轮着地点间的距离,这样就减小了使车轮偏转时所受到的摩擦反力矩。也就是转向省力。

- 17 -

第四届全国大学生智能车大赛技术报告

3) 前轮外倾

前轮外倾和主销内倾合作可进一步缩短车轮着地点与主销轴线和地面交点间的距离,更减小以前轮转向时需克服的摩擦力矩。

4) 前轮前束

汽车的两个前轮在中立位置时,后端的距离与前端的距离之差叫做前轮前束。由于前轮外倾,使车轮产生向外滚动的倾向,车轮向外滚动的同时将与地面产生横向滑动,这将引起轮胎的磨损,并增加行驶阻力,有了前束后,左右前轮的前方略向内靠拢,这样就抵消了车轮由于外倾而产生的车轮向外滚动的趋势。

前轮定位角度允许有一定的偏差,但数值要在一定的范围内。否则起不到应有的效果,并会带来一系列的弊病。

图3-9 前轮结构调整位置

调节如图3-9所示两处,调节的最适当位置会因车而异。 3.4.2 差速机构调整

差速作用就是在向两边半轴传递动力的同时,允许两边半轴以不同的转速旋转,满足两边车轮尽可能以纯滚动的形式作不等距行驶,减少轮胎与地面的摩擦。差速机构如图3-10所示。车模在过弯时车轮的轨线是圆弧,如果向左转弯,在相同的时间里,右侧轮子走的弧线比左侧轮子长,为了平衡这个差异,就要左边轮子慢一点,右边轮子快一点,用不同的转速来弥补距离的差异。

- 18 -

第三章 传感器布局与机械结构调整

图3-10 后轮差速机构

我们希望是车模在减速的时候,后轮没有差速,而在过大弯道时有很大的差速。这样,即加速快又过弯灵活。但是,实际的差速机构不可能达到这效果,我们调节差速只是平衡两项,在转弯较灵活地方情况下尽量不影响加速性能。

3.5 模型车外形

图3-11 车模外形(侧面)

- 19 -

第四届全国大学生智能车大赛技术报告

车模结构总体均衡,构架轻巧,结构牢固。每一小块机械结构都是经过自己亲手打造,但车身前方摆放两个舵机,使得车模整个中心靠前。为这次比赛,我们不知换过多少方案,架构过多少次车模,机械结构是改过又改过,车模在我们手上是架了拆,拆了又架。经过这次大赛的训练,我们对车模结构可算是了如指掌,为下一届比赛积累不少宝贵经验。到比赛后期,我们改车架车的速度是一次比一次快。

- 20 -

第四章 软件系统设计

4.1 软件控制的总体思路

软件的控制,就是让控制车模在符合大赛规则前提下,以最快的速度跑完整个赛道。不论上哪种方案,软件的总体框架总是相似的,即,路径识别->舵机打角->速度控制。

以我们的方案,软件上就是以激光做路径识别,并根据路径让上面的随动舵机摆头,下面的舵机打角,再作出速度控制。想法很简单,但是,实现起来会遇到很多很多事先想不到的问题。

4.2主程序设计

4.2.1 主程序结构

主程序是一个大循环体,循环中对车模各部分硬件进行控制,系统主程序流程图如图4-1所示。

图4-1 主程序结构示意图

- 21 -

第四届全国大学生智能车大赛技术报告

4.2.2 程序的运行

开机后,对所有硬件进行初始化,完成之后,MDC定时中断,对激光管扫描发射,并对接收信号进行采样保存。

在扫描完12个点以后,开始处理采样数据,并计算出当前黑线与车身的相对位置。单片机根据当前位置决定上舵机打什么样的角度以保证紧跟黑线。单片机再根据上舵机PWM值与光点所得到的位置综合给出下舵机的PWM值。

单片机根据上方舵机的打角,经过复杂运算与处理得到速度期望值,并结合当前速度值对电机控制,是加速还是加速,还是使电机倒转,反向刹车制动。 我们在软件编写上,以比例加偏差的方法控制前轮舵机的打角,以PD控制算法对车模速度上形成闭环控制。

4.3 循迹子程序设计

路径识别包括对传感器的控制以及接受信号的处理。对传感器的控制就是对激光发射管的扫描发射,对接受信号的处理包括激光接收管的信号采样,对采样结果的分析与判断。

我们利用MDC模数递减器定时中断,中断处理中主要是对当前通道进行AD采样并保存采样结果,然后选定下一个通道。选通方式是间隔选通以避免相互干扰。当12个激光管全部扫描完成之后,扫描完成标志位便会置位。扫描完成标志位置一后便会有激光数据处理与位置判断函数的运行。函数根据检测到黑线点数不同的情况作出不同的处理,并以上次的位置作为参考判断本次数据是否有效。

具体来说,每个光点对应一个位置。将采样回来的12个数据分别与阈值比较,小于阈值,便认为是黑线,记下检测到黑线的光点个数。我们对每个光点所对应的位置也编号为1—12。当没检测到黑线时就保持上一次的位置。当只有一个光点看到黑线时,将这个位置与前一次的比较,如果前后两次,位置相差3个,就认为这次的位置是个突变不可信,继续保持上一次的位置。但是当该突变连续发生多次的时候,我们就承认这个突变的位置是正确的。当有两个光点看到黑线时,我们就在限定范围内判断这两个点,哪个与上一次的比较接近,就以这个点作为当前位置。当出现3个或4个光点看到黑线的情况时,我们对其直接忽略掉。因为赛道上一般不会有这种情况,只有在黑三角的地方可能会

- 22 -

第四章 软件系统设计

出现,但出现这种情况之前和之后肯定会出现1,2个点,或者5个点以上。当出现5个点或以上时,这种情况也是很特殊,一般我们判断这上黑三角,这时,我们就对其算个平均值作为当前的位置信息。

对上文提到的阈值,由于我们的激光管反射回来的信号经过运放后输入到单片机AD口。我们使用的运放特性是在信号小于5mV,运放对信号不放大,而对大于5mV的信号放大几百倍。同时,运放放大的是差模信号,激光管对光线的适应能力很强。所以,对我们来说,阈值的设定可以相当简单,只要开机后为每个激光管设定一次阈值后,以后的道路基本都能适应。由于本次大赛,赛道首次采用蓝色底案,对于红外来说,蓝色就相当于黑线,但对于我们所选用的激光管来说,蓝色底案与赛道白板基本没区别,打在蓝色底案上返回回来的信号同样很强而被认为是白板。

4.4 舵机摆头与打角子程序设计

4.4.1 随动舵机控制程序设计

在车模整个行驶过程中,舵机都在不停的摆头,使得一排激光的中心照在黑线上。舵机的转动是以步进的形式累加上去的,程序上只要确定每个点照到黑线上时对应的步进值。当然,最靠近中点的光点的步进值就越小,而据中心最远的光点的步进值就最大。这种算法可以说是一种比例算法。

舵机摆头的实际工作过程是:当车一入弯时,光点中心便会偏离黑线,黑线马上就会被编号小于6的点或者大于7的点检测到。设想是在外面的1点检测到黑线,这时舵机就会以很大的步进值加过来使得光点中心与黑线在同一位置。由于舵机的延时特性,在主函数一个执行周期之后,舵机只打了一小角度而远没有打到稳定位置,此时可能是第二个光点照在黑线上了,这样,舵机就会在原来的基础上加上第二个光点所对应的步进值。主函数一直循环,在看到弯道后,经过若干个执行周期舵机打到稳定位置。

我们对每个管子的步进值都是通过实验测量的,对中间的两个光点,舵机不予反应,即所谓的模糊点。在实际编程的时候,摆头的步进值根据速度区分为两档,高速时,摆头步进值稍微大一点。每个步进值对摆头性能都有很大影响,选大了,舵机稳定不下来,他会一直左右摇晃,选小了,快速入弯时,舵机又会反应不过来而造成丢线。

- 23 -

第四届全国大学生智能车大赛技术报告

4.4.2 前轮舵机打角控制程序设计

对于打角,我们的整体思路是这样的:当上面随动舵机的PWM占空比值超过一定范围后,我们就认为是一个应该打角的弯道。先算出上面舵机值与中心值的偏差,将这个偏差量再乘以一个系数得到的值作为打角的参考量,同时,我们根据当前黑线的相对激光光点位置,为每个位置都赋予一个偏量。就是说,就算上面舵机不打角,当不同的光点照到黑线,前轮舵机也能正确打角,只是幅度小一点,将上面的参考量与偏量之和直接加到前轮舵机PWM上,使舵机打角。

这种打角方式其实就是一个比例加上一个偏差,可以说是简单的PD算法。对于这种打角方式,如果参考量的系数与每个光点的偏量选择合理,那么,前轮舵机就会在连续的小弯道上走近似直线,而在单侧大弯道上提前打角,切着内道走。这不正是舵机打角的理想情况吗!对于这这些参数的设定,我们也是设了高速档与低速档,两档的参数不一样,以适应入弯情况。或者说,我们在这两个参数的基础上,又加了一个速度相关的参数。

4.5 速度控制子程序设计

软件中最复杂的还是这部分速度控制。其实说简单点,就是根据路况标定当前需要达到的速度,再以此速度与当前实际速度作比较,作出是该加速还是该减速,该猛加速还是全速反刹的判断。 4.5.1 速度的标定

我们希望车模能以较高的速度过直道和连续的弯道,以较低的速度入弯道。为此,我们根据上面舵机的PWM值判断是直道还是弯道,用if()…else…语句,这是很容易判断的,当舵机PWM值偏离中心位置附近时便认为是弯道,不是这样那就是直道。根据不同的舵机PWM值将标定速度细分为几档。 4.5.2 加减速控制

加减速控制就是让车模以最快的反应速度达到标定的速度,反应越快越好。

- 24 -

第四章 软件系统设计

程序每进入一次速度控制函数,首先读出于编码器连接的脉冲累加器计数寄存器PACN32的值,计算出当前速度,再与标定的速度比较,如果当前速度大于标定的速度,再根据两速度的差值决定减速的力度;如果当前速度小于标定的速度,就根据两速度差值决定加速的急缓。减速就是递减电机正转的PWM值,如果速度差很大,便要启动电机反转刹车以迅速达到减速的目的。加速的过程是对电机正转PWM累加的过程,但是,要对PWM限定范围,加速的急缓只是每次累加的量大小不同。

4.6 软件部分总结

软件部分是整个控制系统的核心。软件上主要有以下几个难点: 1) 怎样判断采样回来的赛道信息的有效性; 2) 怎样控制好两个舵机;

3) 怎样使速度控制配合好舵机打角。

对于本车模的软件系统,我们充分发挥激光摆头的优势,激光的大前瞻和高速舵机的灵活性带给我们不少创作灵感。

对于车模来说,软件控制是核心,而对于软件来说,舵机打角和速度控制都不算是核心,真正的核心应该是舵机打角和速度控制的相互配合!

本车模软件系统对两个舵机及速度的控制均以PID控制技术为原理,适当发挥再加以利用。

- 25 -

第五章 开发工具、制作、安装、调试过程说明

前面几章一直是在为系统制定方案以及方案的细化。但整个系统的完善主要还是在系统的现场调试。在细分的每个模块中,大部分都涉及有众多参数,对这些参数的确定就需要软硬件联合调试。而这过程就需要一整套开发调试环境已工具。包括程序源代码的编辑以编译环境,参数调节与设定工具。

我们主要的开发环境是Metrowerks公司专门为飞思卡尔S12系列芯片设计的Codewarrior IDE,可从飞思卡尔半导体公司相关网页上下载到CW_S12_v5.0_Special.exe。

5.1 Codewarrior IDE的安装与使用

从网站上下载到的其实是一个压缩包,双击安装时它会先解压安装文件到C:\\Documents and Settings\\Administrator\\Local Settings\\Temp\\CodeWarrior for S12(X) V5.0文件夹中,再运行其中的setup.exe文件。

我们的思想全靠C语言代码来实现,Codewarrior IDE集成代码编辑工具,工程编译工具以及目标芯片下载与调试工具。

与开发其它单片机一样,使用Codewarrior IDE开发MC9S12DG128先要创建工程,下面是我们使用Codewarrior IDE的一个实例:

- 26 -

第五章 开发工具、制作、安装调试过程说明

5.1.1 工程的创建

打开Codewarrior IDE,创建一个新工程,界面如图5-1所示。

图5-1 利用Codewarrior IDE创建一个工程

选择目标芯片型号以及芯片与电脑的连接方式,这里选择MC9S12DG128B以及“TBDML”项,如图5-2所示。

图5-2 选择目标芯片及连接方式

选择程序编写所用语言,以及填写创建的工程名和保存路径,如图5-3所示。

- 27 -

第四届全国大学生智能车大赛技术报告

图5-3 选择工程编写所用语言及工程保存路径

接下来的以默认设置直道完成。完成之后,会出现工程文件管理窗口,如图5-4所示。

图5-4 成功创建一个工程

5.1.2 程序源代码的编辑、编译与链接

在main.c中提示“/* put your own code here */”的地方输入源代码。完成之按钮,完成编译与链接。编译好后,会出现“Errors & Warnings”后,点击(make)窗口,其中会显示程序中错误和警告信息,表示错误,表示警告。在排除所有错误之后,工程就能顺利编译。编译完成以后,在用户所建立工程的bin文件夹下自动生成“*.abs.s19”文件,这个文件就是将被下载到单片机中的文件。

- 28 -

第五章 开发工具、制作、安装、调试过程说明

5.1.3 BDM调试

在成功编译之后,选择Debug按钮,进入调试环境,即启动了Hiwave.exe。 出现如下窗口,点击“确定”按钮,如图5-5所示。

图5-5 下载新程序

之后BDM会自动擦出芯片Flash,如图5-6所示。

图5-6 擦出芯片Flash

再下载新程序如图5-7所示。

图5-7 下载新程序

下载完成之后就会出现BDM调试界面,如图5-8所示:

- 29 -

第四届全国大学生智能车大赛技术报告

图5-8 BDM调试界面

在调试的数据窗口中可以看到单片机内部一些被用到的寄存器以及程序中定义的全局变量。

5.2 现场调试

在完成基本程序之后,做的最多的工作就是调试,调试是一持续性的工作。之前说过,我们为调试的方便,特别制作了按键加液晶模块。

写程序的时候,自己想好的一些参数在静态测试的时候可能很好,但是当车在赛道上跑的时候,情况就不一样了。所以,车模必须在赛道上多跑以发现问题进而解决问题。

图5-9 现场调试时的液晶界面

- 30 -

第五章 开发工具、制作、安装、调试过程说明

我们使用按键与液晶主要调节一下参数: 1)每个光点对应上面舵机的步进值; 2)两个舵机的中心值; 3)两个舵机最大打角值。

此外,我们还用液晶显示激光接收管接收到每个光点经过AD后的值。由于我们的激光管所发出的激光是不可见的,所以,要是哪个管子坏了,光点变暗了,一般也看不出来,但是,通过液晶的显示,很容易确定激光管有没有坏。在调试过程中,要观察单片机内某些寄存器或是某些变量,只要在程序上将其放到液晶上显示既可。这个模块在调试中十分好用。这个模块还是我们车模启动的钥匙,在开机后,只有用按键将一些参数设定好,并且用按键启动后,车才能跑。设定是参数主要数对各种不同的赛道上的最大速度。

在平时练习的时候,我们自己用mega16单片机做了一个计时器,让自己知道自己的速度,知道自己和别人还有多少差距!

图5-10 自己制作的计时器

为了配合车模调试,我们花了不少功夫在制作赛道上,让车模在各种不同复杂程度的赛道上都练习过,我们的练习赛道如图5-11所示。

- 31 -

第四届全国大学生智能车大赛技术报告

图5-11 调试用的赛道

我们的这些努力可算是没有白费,在报告写道这里时,我们的车在39米长的赛道上最快已经可以跑进13.5秒,速度基本上达到3m/s !

5.3 调试中遇到的问题及解决过程

5.3.1 高速舵机问题

对于激光管的摆头,我们希望它反应越快越好,为此我们使用了高速舵机。高速舵机在不加电的时候,用手也是很容易转动它。在使用中我们发现,高速舵机确实反应灵活,但是,当把激光管摆到中心之后,舵机稳不下来,一直在中心位置附近左右颤动,这样会使得激光光点在赛道上颤动而影响采样结果。在舵机颤动过程中,我们注意到给它的PWM波的周期和占空比都是恒定不变的。那它为什么会颤动呢?我们也不好说找到真正的原因,但我们想普通舵机为什么不会颤,因为它内部阻力大,能促使舵机达到稳态后很快的稳定下来。而且在舵机颤动的过程中,只要少用手扶一下,舵机就能稳定下来。所以我们就在舵机外部增加一些障碍以增大它的外部阻力。

实践证明,增大高速舵机的外部阻力以使舵机快速稳定下来的做法是可行

- 32 -

第五章 开发工具、制作、安装、调试过程说明

的,虽然稍增大了一点阻力,但舵机的转动依然很灵活。 5.3.2 光点宽度问题

对于不转头的方案,光点宽一点当然好点,这样就不容易丢线,但是,当换上摆头方案是,宽度太宽肯能很危险。

我们来分析一下:你已经使用了有很大前瞻的激光并且配合随动舵机摆头,所以你想把车跑快,当车快速入弯时,你就让舵机以最快的速度把光点中心摆到黑线位置,但是,光点宽度太宽,在你还没摆过来之前,弯道外侧的光点就可能已经照到赛道外面了,对于复杂多变的赛道外信息,我们不知如何判断,这样车模就可能冲出赛道了。

我们可以把光点宽度改窄一点,密一点,一般30公分左右为宜,充分发挥了摆头的优势。

- 33 -

第六章 车模技术参数说明

6.1 车模主要技术参数

表6-1车模主要技术参数

名称 参数

车模总质量 1.2Kg 车模长度 34.0 cm 车模宽度 17.5 cm 车模高度 16.5 cm 电路总功耗 8.65W 电路电容器总容量 1166 uF 传感器之类 激光 传感器个数 激光接收管×6+红外接收管×8+编码器×1 外加伺服电机个数 1个

赛道信息检测精度 2.5cm 赛道信息检测频度 83.3(次/秒)

6.2 机械部分其它参数

表6-2 机械部分其它参数

名称 参数

前轮距 13.5cm 后轮距 14.0cm 前后轮距 20.0cm 电机轴齿轮齿数 18 后轮轴传动轮齿数 76 编码器齿轮数 13 编码器精度 200P/R 激光管俯角 72.6°

- 34 -

第六章 车模技术参数说明

6.3 电路中芯片的种类及数量

表6-3 电路中芯片的种类及数量

芯片名称 使用数量 MC9S12DG128 1 MAX232 1 LM2940CT 1 LM2576S –ADJ 1

ASM1117-3.3 2 ULN2803A 2 TLC2202A 4 BTS7970B 2

功能简述 微控制器

用于串口上电平转换 5V稳压芯片

开关型稳压电源芯片 3.3V稳压电源芯片 达林顿驱动管 轨到轨运算放大器 大电流PN半桥

6.4 其它技术参数

表6-4 其它技术参数

名称 参数

激光最大前瞻距离(离前轮) 51.0cm 激光光点宽度 26.3cm 激光光点间距 2.5cm 红外最大前瞻距离(离前轮) 7.2cm 红外采样范围宽度 16cm

6.5 设计过程中用到的主要软件工具

表6-5 设计过程中用到的主要软件工具

名称

Codewarrior IDE Altium Designer 6 IAR Workbench

版本 v4.7 ,v5.0 v6.7,v6.8, Summer 08 V5.2 功能简述

飞思卡尔HCS12系列单片机集成开发环境

电子电路原理图,PCB图设计环境

Atmel mega16 开发工具

- 35 -

第七章 总结

本报告详细介绍了我们为第四届全国大学生智能汽车大赛而准备的智能车

系统方案。涉及激光传感器循迹方法,传感器随动舵机转向控制策略,前轮舵机打角控制策略以及速度控制算法集实现。

分析整个车模系统,我们在车模硬件及软件上都有许多改进与创新。系统上主要有以下特色:

1)采用激光管作为循迹传感器。相比红外而言,大大提高了前瞻距离,由于大赛对车模长度的,使用红外循迹,最大前瞻也只有15cm,而我们的激光前瞻已经提高到50多厘米,大的前瞻有利于速度的提高。

2)采用红外对管作为辅助传感器。以红外作为赛道辅助传感器,检测起跑线以及在坡道上辅助循迹。双重传感器方案,赛道信息检测更加准确、可靠。系统整体系能得以提高。

3)使用传感器随动舵机加前轮舵机双舵机方案。相比其它激光方案,使用了随动舵机,激光管可以左右兼顾,激光光点时刻跟踪黑线。双舵机打角保证不丢线。配合激光的大前瞻,更加有利于速度的提升。

4)采用自己制作的单片机最小系统板。自己制作的单片机最小系统板,尺寸小,重量轻。即减轻了车模总重量,有方便了其它硬件布局。使得整个硬件系统布局更简洁,性能更稳定。

5)增加了按键与液晶辅助调试电路。增加了这一部分电路,使得我们调试效率大大调高,并且,程序中的相关参数可以用按键加以修改,相关变量可以用液晶实时显示。这样的参数设置相当于对车模系统的二次编程。提高了系统对不同赛道的适应能力。

6)以激光光点在赛道上的返回信息和随动舵机的角度综合作为路况信息。这种赛道信息获取方式有很大的灵活性,使我们对打角和速度控制都有很多灵感可以发挥。

7)软件编写上,让单片机内部只开一个中断,作为系统的参考时钟。避免中断太多,程序指针的来回跳变,提高程序的稳定性。同时,采用PD算法控制前轮舵机打角,对路径进行了很好的优化,缩短了车模在赛道上的运行时间。

- 36 -

第七章 总结

但是横观我们车模的整个设计,我们觉得系统几个方面还有可以改进的地方:

1)单片机最小系统板电路。我们所用的单片机最小系统板是将所有的I/O口都引出来,但是实际应用中并没有都用到。我们可以将最小系统板做的更小,只引出有用引脚,并且可以把BDM接口和串口接口做在板子上;

2)测速传感器。在车模上,我们采用光电编码器作为速度反馈,也可以做其它的尝试,像是对射式光栅。编码器虽然好用,但是价格高,重量也不轻。而对射式光栅虽然没有编码器精度高,但是用它测速完全够用了,最重要的是它可以减轻整个车模重量;

3)路径识别系统。虽然转头激光路径识别有大前瞻,跟线好等优点,但是单排的激光点在识别中稳定性不高,信息量过少。两排或者三排的激光探测更能够提高小车的稳定性,增大激光路径识别的最远距离能够提高速度、优化行车路线。

4)无线传输和上位机调试。对于以后的调试,我们觉得一个上位机是必要的,用无线传输激光检测到的路况。结合上位机分析软件,调试起来应该是更加方便有效。

总结整个车模设计过程,我们可算是当过木匠,当过机械工,当过硬件工程师也做过软件工程师……在比赛后期,我们基本上不分黑夜白天的一直在赛道上调试车模。我们相信,我们付出了那么多努力一定会有回报的!通过这次比赛,我们不仅得到了软硬件结合的锻炼机会,更多的是培养了我们的创新能力。对我们以后的工作带来了很大的帮助!

- 37 -

第四届全国大学生智能车大赛技术报告

致 谢

在为本次大赛制作智能车期间,我们遇到过很多问题,从最初的传感器选型

与方案确定,到后来的软硬件联合调试。在解决一个个问题之后,我们发现,我们技术上在不断成长,思想上不断成熟。而在这过程中,离不开学校,老师和同学的支持。

首先,我们要感谢学校对这次比赛的重视,感谢学校教务处对我们比赛的大力支持。没有他们的支持,我们的车模绝对上不了赛场。

指导和整体的规划安排,我们很难有今天的成果。

最后,我们要感谢同实验室的其他同学,感谢我们同时工作在这么和谐的实验室。感谢他们在赛道制作和其它方面的帮助。

其次,我们要感谢陈龙老师和黄继业老师的悉心教导。没有他们在思想上的

- 38 -

参考文献

参考文献

[1] 孙同景,陈桂友 Freescale 9S12 十六位单片机原理及嵌入式开发技术,北京-机械工业出版社,2008

[2] 邵贝贝. 单片机嵌入式应用的在线开发方法. 北京-清华大学出版社 2004 年10 月第1 版

[3] 卓晴,黄开胜,邵贝贝 学做智能车 北京-北京航空航天大学出版社 2007 [4] 王威 HCS12微控制器原理及应用 北京-北京航空航天大学出版社 2007 [5] 李宁,刘启新 电机自动控制系统 北京-机械工业出版社,2003 [6] 谭浩强 C++程序设计 北京-清华大学出版社 2004

[7] 潘松,黄继业 现代数字电路基础教程 北京-科学出版社 2008 [8] 魏彪,盛新志 激光原理及应用 重庆-重庆大学出版社 2007 [9] 王水平 开关稳压电源原理及设计 北京-人民邮电出版社 2008 [10] 仇慎谦 PID调节规律和过程控制 南京-江苏科学技术出版社

[11] TI公司 Use of Rail-to-Rail Operational Amplifiers / Application Report 1999 [12] infineon公司 BTS7970 Rev2.0/ Datasheet 2006

[13] 赵先奎 汽车前轮定位 黑龙江 黑龙江出入境检验检疫局 2008

[14] CyberSmart队 第二届“飞思卡尔”杯全国大学生智能汽车邀请赛技术报告,上海:上海交通大学 2007

[15] 超越者队 第四届“飞思卡尔”杯全国大学生智能车大赛技术报告 杭州 杭州电子科技大学信息工程学院 2009

- 39 -

第四届全国大学生智能车大赛技术报告

附录A 车模系统C语言源程序

//***************文件名main.c********************// #include /* common defines and macros */ #include /* derivative information */ #pragma LINK_INFO DERIVATIVE \"mc9s12dg128b\" /******宏定义*******************/ #define daja PWMDTY67 #define bait PWMDTY45

/******************************/ /*************头文件**************/ #include \"init.h\"

#include \"laser_interrupt.h\" #include \"laser_process.h\" #include \"5110.h\" #include \"key.h\" #include \"interpt.h\" #include \"sp_col.h\" #include \"yuzhiget.h\"

/********************************/ void set_canshu(void); uchar key; uchar jc;

uint sp_zhi=330; uint sp_wan=280; uint sp_zai=250; uchar quan=10; uchar sha=0; uchar shua;

uchar yan_shi=0; void main(void) {

/* put your own code here */ EnableInterrupts;

/********初始化***************/ all_init();

II

附录A车模系统C语言源程序

key_port_init(); LCD_init();

/****************************/ DDRM=0XFF; PTM=0XFF; set_canshu();

while(yan_shi==1); for(;;) {

process_laser(); if(sflag==1) {

PTM=0X00; } else {

PTM=0Xff; }

baitou(); dajiao();

//PWMDTY1=190; speed_col(); } /* wait forever */

/* please make sure that you never leave this function */ }

void set_canshu(void) {

jc=0;

LCD_write_char(2,2,'F'); LCD_write_char(4,2,'L'); LCD_write_char(6,2,'Y'); LCD_write_char(8,2,'A'); LCD_write_char(10,2,'N');

while(jc<7) {

key=keyscan();

II

第四届全国大学生智能车大赛技术报告

switch(key) {

case 1: case 2:

jc++; if(jc>6) jc=6; case 3: case 4: case 9: case 10: if(sp_zhi>500) sp_zhi=500; if(sp_wan>500) sp_wan=500; if(sp_zai>500) sp_zai=500; break; if(jc<1) jc=0; else jc--; break; switch(jc) {

case 1:

case 2:

case 3:

case 4:

case 5:

yuzhi(); break; sp_zhi+=10; break; sp_wan+=10; break; sp_zai+=10; break; quan+=1; if(quan>30)

III

附录A车模系统C语言源程序

quan=30; break; case 6:

sha+=1; if(sha>20) sha=20; break; case 11: case 12: // hong_yu(); if(sp_zhi<100) sp_zhi=100; if(sp_wan<100) sp_wan=100; if(sp_zai<100) sp_zai=100;

}

break; switch(jc) {

case 1:

case 2:

case 3:

case 4:

case 5:

case 6:

break; sp_zhi-=10; break; sp_wan-=10; break; sp_zai-=10; break; quan-=1; if(quan<1) quan=0; break; if(sha==0) sha=0; else

IV

第四届全国大学生智能车大赛技术报告

sha-=1;

break; }

break; case 13: case 14:

jc=8;

yan_shi=1; break; case 15: case 16:

break; }

if(key!=0) {

LCD_clear();

LCD_write_char(0,0,'J'); //第一行显示JC: LCD_write_char(1,0,'C'); LCD_write_char(2,0,':'); write_num(0,7,jc); if(jc==8) {

LCD_clear();

LCD_write_char(3,2,'R'); LCD_write_char(5,2,'U'); LCD_write_char(7,2,'N'); }

else if(jc==0) {

LCD_write_char(2,2,'F'); LCD_write_char(4,2,'L'); LCD_write_char(6,2,'Y'); LCD_write_char(8,2,'A'); LCD_write_char(10,2,'N'); }

else if(jc==1) {

if(key==9||key==10) {

write_num(1,0,yz[0]);

V

附录A车模系统C语言源程序

write_num(1,5,yz[1]); write_num(1,10,yz[2]); write_num(2,0,yz[3]); write_num(2,5,yz[4]); write_num(2,10,yz[5]); write_num(3,0,yz[6]); write_num(3,5,yz[7]); write_num(3,10,yz[8]); write_num(4,0,yz[9]); write_num(4,5,yz[10]); write_num(4,10,yz[11]); LCD_write_char(0,5,'J'); LCD_write_char(1,5,':'); write_num(5,2,bad_g); }

else if(key==11||key==12) { } }

else if(jc>1) {

LCD_write_char(6,jc-1,'^');

LCD_write_char(0,1,'S'); //第二行显示直道速度: LCD_write_char(1,1,'P'); LCD_write_char(2,1,'Z'); LCD_write_char(3,1,'H'); LCD_write_char(4,1,'I'); LCD_write_char(5,1,':'); write_num(1,7,sp_zhi);

LCD_write_char(0,2,'S'); //第三行显示弯道速度: LCD_write_char(1,2,'P'); LCD_write_char(2,2,'W'); LCD_write_char(3,2,'A'); LCD_write_char(4,2,'N'); LCD_write_char(5,2,':'); write_num(2,7,sp_wan);

LCD_write_char(0,3,'S'); //第四行显示窄道速度: LCD_write_char(1,3,'P'); LCD_write_char(2,3,'Z');

VI

第四届全国大学生智能车大赛技术报告

LCD_write_char(3,3,'A'); LCD_write_char(4,3,'I'); LCD_write_char(5,3,':'); write_num(3,7,sp_zai);

LCD_write_char(0,4,'Q'); //第四行显示窄道速度: LCD_write_char(1,4,'U'); LCD_write_char(2,4,'A'); LCD_write_char(3,4,'N'); LCD_write_char(4,4,' '); LCD_write_char(5,4,':'); write_num(4,7,quan);

LCD_write_char(0,5,'B'); //第四行显示窄道速度: LCD_write_char(1,5,'R'); LCD_write_char(2,5,'A'); LCD_write_char(3,5,'K'); LCD_write_char(4,5,'E'); LCD_write_char(5,5,':'); write_num(5,7,sha); } } } }

//*****************文件名 laser_interrupt.h********************///

/********************激光原始信号采集****************************/ uchar n_channel; uchar i_channel; uchar laser[12]; uchar Laser[12]; uchar la_ok_flag=0;

#pragma CODE_SEG __NEAR_SEG NON_BANKED interrupt 26 void MDC_ISR(void) {

DisableInterrupts; MCFLG_MCZF = 1; switch(n_channel) {

VII

附录A车模系统C语言源程序

case 0:

ATD1CTL5=0X80;

while(!ATD1STAT0_SCF); laser[0]=ATD1DR0L; break; case 1:

ATD1CTL5=0X80;

while(!ATD1STAT0_SCF); laser[1]=ATD1DR0L; break; case 2:

ATD1CTL5=0X81;

while(!ATD1STAT0_SCF); laser[2]=ATD1DR0L; break; case 3:

ATD1CTL5=0X81;

while(!ATD1STAT0_SCF); laser[3]=ATD1DR0L; break; case 4:

ATD1CTL5=0X82;

while(!ATD1STAT0_SCF); laser[4]=ATD1DR0L; break; case 5:

ATD1CTL5=0X82;

while(!ATD1STAT0_SCF); laser[5]=ATD1DR0L; break; case 6:

ATD1CTL5=0X83;

while(!ATD1STAT0_SCF); laser[6]=ATD1DR0L; break; case 7:

ATD1CTL5=0X83;

while(!ATD1STAT0_SCF); laser[7]=ATD1DR0L; break;

VIII

第四届全国大学生智能车大赛技术报告

case 8:

ATD1CTL5=0X84;

while(!ATD1STAT0_SCF); laser[8]=ATD1DR0L; break; case 9:

ATD1CTL5=0X84;

while(!ATD1STAT0_SCF); laser[9]=ATD1DR0L; break; case 10:

ATD1CTL5=0X85;

while(!ATD1STAT0_SCF); laser[10]=ATD1DR0L; break; case 11:

ATD1CTL5=0X85;

while(!ATD1STAT0_SCF); laser[11]=ATD1DR0L;

Laser[0] = laser[0]; Laser[1] = laser[1]; Laser[2] = laser[2]; Laser[3] = laser[3]; Laser[4] = laser[4]; Laser[5] = laser[5]; Laser[6] = laser[6]; Laser[7] = laser[7]; Laser[8] = laser[8]; Laser[9] = laser[9]; Laser[10] = laser[10]; Laser[11] = laser[11]; la_ok_flag=1; //标志位置1 break; }

i_channel++;

if(i_channel>11) i_channel=0; switch(i_channel) {

IX

附录A车模系统C语言源程序

case 0: PORTA=0x80; n_channel=0; break; case 1: PORTA=0xe0; n_channel=6; break; case 2: PORTA=0x40; n_channel=1; break; case 3: PORTA=0x10; n_channel=7; break; case 4: PORTA=0xc0; n_channel=2; break; case 5: PORTA=0x90; n_channel=8; break; case 6: PORTA=0x20; n_channel=3; break; case 7: PORTA=0x50; n_channel=9; break; case 8: PORTA=0xa0; n_channel=4; break; case 9: PORTA=0xd0; n_channel=10; break; case 10: PORTA=0x60; n_channel=5; break; case 11: PORTA=0x30; n_channel=11; break; } asm cli; }

#pragma CODE_SEG DEFAULT

////*****************文件名laser_process.h************************///// #define go PWMDTY1 #define back PWMDTY0 extern uchar Laser[12];

extern uchar la_ok_flag; //采样处理完成标志位 extern uint speed;

extern uchar s_bgn_flag; extern uint speed; extern uint sp_zai;

uchar posit=5; uchar last_posit=5;

uchar P_T[12]; //位置存放 uchar hei_cot=0;//黑线个数 uchar pis_ok=0;//位置判断完成 uchar tbz_i,tby_i; uint cha1,cha2; uchar p_c1,p_c2; uchar bai_cot=0; uchar d_p;

uchar sanjiao,hi; uchar san_yan,sflag;

X

第四届全国大学生智能车大赛技术报告

void process_laser(void) {

uchar i; //辅助计数 uchar i_h;//黑点个数 uint sum;//辅助总数 i_h=0;

if(la_ok_flag==1) {

la_ok_flag=0;

P_T[0]=0; P_T[1]=0; P_T[2]=0; P_T[3]=0; P_T[6]=0; P_T[7]=0; P_T[8]=0; P_T[9]=0; P_T[10]=0; for(i=0;i<12;i++) {

if(Laser[i]<130) {

P_T[i_h]=i; i_h++; } }

hei_cot=i_h;

if(san_yan==0) {

if(hei_cot>4) {

hi++; if(hi>15) {

sflag=1; san_yan=1; if(speed>sp_zai) {

if(speed-sp_zai>60) {

go=0;

back=100; }

else if(speed-sp_zai>30) {

go=0; back=80;

XI

P_T[4]=0; P_T[5]=0; P_T[11]=0; 附录A车模系统C语言源程序

} } hi=0; } } else {

hi=0; } }

//判断位置 switch(hei_cot) {

case 0:

posit=last_posit; break; case 1:

if(P_T[0]>=last_posit) {

if(P_T[0]-last_posit>2) {

tbz_i++; //辅助计数 if(tbz_i>25) {

tbz_i=0; //跳变允许 posit=P_T[0]; } else {

posit=last_posit; //跳变不允许 } } else {

tbz_i=0;

posit=P_T[0]; }

tby_i=0; } else

XII

第四届全国大学生智能车大赛技术报告

{

if(last_posit-P_T[0]>2) {

tby_i++; if(tby_i>25) {

tby_i=0; posit=P_T[0]; } else {

posit=last_posit; } } else {

tby_i=0; posit=P_T[0]; }

tbz_i=0; }

break; case 2:

if(P_T[0]>last_posit) {

p_c1=P_T[0]-last_posit; } else {

p_c1=last_posit-P_T[0]; }

if(P_T[1]>last_posit) {

p_c2=P_T[1]-last_posit; } else {

p_c2=last_posit-P_T[1]; }

XIII

附录A车模系统C语言源程序

if(p_c1posit=P_T[0]; }

else if(p_c1>p_c2) {

posit=last_posit; if(posit>last_posit) if(posit-last_posit>3) posit=last_posit; posit=last_posit; case 3: case 4:

posit=last_posit; case 5: default:

posit=P_T[1]; } else {

}

{

{

} } else {

if(last_posit-posit>3) {

} }

break; break; sum=0;

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

sum+=P_T[i]; }

XIV

第四届全国大学生智能车大赛技术报告

posit=sum/hei_cot; if(posit>last_posit) {

if(posit-last_posit>3) {

posit=last_posit; } } else {

if(last_posit-posit>3) {

posit=last_posit; } }

break; }

last_posit=posit; pis_ok=1; } }

void baitou (void) {

if(pis_ok==1) {

pis_ok=0;

if(s_bgn_flag==1) {

bai_cot++;

if(bai_cot==17) {

d_p+=posit; }

if(bai_cot>17) {

bai_cot=0;

XV

附录A车模系统C语言源程序

s_bgn_flag=0; d_p+=posit;

if(speed<250) {

switch(d_p/2) {

case 0: bait+=165; break; case 1: bait+=125; break; case 2: bait+=105; break; case 3: bait+=90; break; case 4: bait+=45; break; case 5: break; case 6: break;

case 7: bait-=45; break; case 8: bait-=90; break; case 9: bait-=105; break; case 10:bait-=125; break; case 11:bait-=165; break; } } else {

switch(d_p/2) {

case 0: bait+=180; break; case 1: bait+=135; break; case 2: bait+=125; break; case 3: bait+=95; break; case 4: bait+=50; break; case 5: break; case 6: break;

case 7: bait-=50; break; case 8: bait-=95; break; case 9: bait-=125; break; case 10:bait-=135; break; case 11:bait-=180; break; } }

XVI

第四届全国大学生智能车大赛技术报告

d_p=0; }

if(bait>4900) {

bait=4900; } else if(bait<1900) {

bait=1900; } } } }

void dajiao(void) {

if(sflag==1) {

if(bait>3450) {

cha1=(((bait-3450)/50)*100)/3; cha2=0;

} else if(bait<3350) {

cha2=(((3350-bait)/50)*100)/3; cha1=0; } else {

cha1=cha2=0; } } else {

XVII

附录A车模系统C语言源程序

if(bait>3550) {

if(speed<250) {

cha1=(((bait-3550)/50)*50)/3; } else {

cha1=(((bait-3550)/50)*100)/3; }

cha2=0;

} else if(bait<3250) {

if(speed<250) {

cha2=(((3250-bait)/50)*50)/3; } else {

cha2=(((3250-bait)/50)*100)/3; }

cha1=0; } else {

cha1=cha2=0; } }

switch(posit) {

case 0: daja=4200+cha1-cha2; break; case 1: daja=4100+cha1-cha2; break; case 2: daja=4000+cha1-cha2; break; case 3: daja=3900+cha1-cha2; break; case 4: daja=3850+cha1-cha2; break; case 5: daja=3800+cha1-cha2; break; case 6: daja=3800+cha1-cha2; break;

XVIII

第四届全国大学生智能车大赛技术报告

case 7: daja=3750+cha1-cha2; break; case 8: daja=3700+cha1-cha2; break; case 9: daja=3600+cha1-cha2; break; case 10: daja=3500+cha1-cha2; break; case 11: daja=3400+cha1-cha2; break;

}

if(daja>4300) {

daja=4300; } else if(daja<3350) {

daja=3350; } }

/////*************文件名5510.h*****************************///////// #define sclk PTH_PTH7 #define sdin PTH_PTH6 #define dc PTH_PTH5 #define res PTH_PTH4 #define sce PORTE_BIT4

byte shuzi[]={

0x00,0x3E,0x51,0x49,0x45,0x3E,// 0 0x00,0x00,0x42,0x7F,0x40,0x00,// 1 0x00,0x42,0x61,0x51,0x49,0x46,// 2 0x00,0x21,0x41,0x45,0x4B,0x31,// 3 0x00,0x18,0x14,0x12,0x7F,0x10,// 4 0x00,0x27,0x45,0x45,0x45,0x39,// 5 0x00,0x3C,0x4A,0x49,0x49,0x30,// 6 0x00,0x01,0x71,0x09,0x05,0x03,// 7 0x00,0x36,0x49,0x49,0x49,0x36,// 8 0x00,0x06,0x49,0x49,0x29,0x1E,// 9 0x00,0x7C,0x12,0x11,0x12,0x7C,//A 10 0x00,0x7F,0x49,0x49,0x49,0x36,//B 0x00,0x3E,0x41,0x41,0x41,0x22,//C 0x00,0x7F,0x41,0x41,0x22,0x1C,//D

XIX

附录A车模系统C语言源程序

0x00,0x7F,0x49,0x49,0x49,0x41,//E 0x00,0x7F,0x09,0x09,0x09,0x01,//F 0x00,0x3E,0x41,0x49,0x49,0x7A,//G 0x00,0x7F,0x08,0x08,0x08,0x7F,//H 0x00,0x00,0x41,0x7F,0x41,0x00,//I 0x00,0x20,0x40,0x41,0x3F,0x01,//J 0x00,0x7F,0x08,0x14,0x22,0x41,//K 0x00,0x7F,0x40,0x40,0x40,0x40,//L 0x00,0x7F,0x02,0x0C,0x02,0x7F,//M 0x00,0x7F,0x04,0x08,0x10,0x7F,//N 0x00,0x3E,0x41,0x41,0x41,0x3E,//O 0x00,0x7F,0x09,0x09,0x09,0x06,//P 0x00,0x3E,0x41,0x51,0x21,0x5E,//Q 0x00,0x7F,0x09,0x19,0x29,0x46,//R 0x00,0x46,0x49,0x49,0x49,0x31,//S 0x00,0x01,0x01,0x7F,0x01,0x01,//T 0x00,0x3F,0x40,0x40,0x40,0x3F,//U 0x00,0x1F,0x20,0x40,0x20,0x1F,//V 0x00,0x3F,0x40,0x38,0x40,0x3F,//W 0x00,0x63,0x14,0x08,0x14,0x63,//X 0x00,0x07,0x08,0x70,0x08,0x07,//Y 0x00,0x61,0x51,0x49,0x45,0x43,//Z 35

0x00,0x00,0x00,0x00,0x00,0x00,// -36 空格 0x00,0x00,0x36,0x36,0x00,0x00,// :-37 0x00,0x08,0x08,0x08,0x08,0x08,// --38 0x00,0x20,0x10,0x08,0x04,0x02,// /-39 0x00,0x00,0x60,0x60,0x00,0x00,// .-40 0x00,0x00,0x00,0xA0,0x60,0x00,// ,-41 0x00,0x04,0x02,0x01,0x02,0x04,// ^-42 };

void delay(void)//延时函数 { unsigned int i; for (i=0;i<5;i++) ; ; }

/*--------------------------------------------

LCD_write_byte: 使用SPI接口写数据到LCD 输入参数:dt:写入的数据;

XX

第四届全国大学生智能车大赛技术报告

command :写数据/命令选择;

----------------------------------------------*/

void LCD_write_byte(unsigned char dt, unsigned char command) { unsigned char i; sce=0;

dc=command; for(i=0;i<8;i++) {

if(dt&0x80) sdin=1; else

sdin=0; dt=dt<<1; sclk=0; sclk=1; } dc=1; sce=1; sdin=1; }

/*--------------------------------------- LCD_init: 3310LCD初始化

----------------------------------------- */ void LCD_init(void) { DDRH=0xff; // 液晶IO口定义为输出 DDRE_BIT4 =1; res=0; delay(); res=1;

LCD_write_byte(0x21,0);//初始化Lcd,功能设定使用扩充指令 LCD_write_byte(0xd0,0);//设定液晶偏置电压 LCD_write_byte(0x20,0);//使用基本指令

LCD_write_byte(0x0C,0);//设定显示模式,正常显示 }

/*------------------------------------------- LCD_set_XY: 设置LCD坐标函数 输入参数:X:0-83 Y:0-5 ---------------------------------------------*/

XXI

附录A车模系统C语言源程序

void LCD_set_XY(unsigned char X, unsigned char Y) { LCD_write_byte(0x40 | Y, 0);// column LCD_write_byte(0x80 | X, 0);// row }

/*------------------------------------------ LCD_clear: LCD清屏函数

--------------------------------------------*/ void LCD_clear(void) { unsigned char t; unsigned char k;

LCD_set_XY(0,0); for(t=0;t<6;t++) {

for(k=0;k<84;k++) {

LCD_write_byte(0x00,1); } } }

/*---------------------------------------------

LCD_write_shu: 显示8(宽)*16(高)点阵列数字字母符号等半角类 输入参数:c:显示的字符;

-----------------------------------------------*/

void LCD_write_shu(unsigned char row, unsigned char page,unsigned char c) //row:列 page:页 dd:字符 { unsigned char i;

LCD_set_XY(row*8, page);// 列,页 for(i=0; i<8;i++) {

LCD_write_byte(0x00,1); }

LCD_set_XY(row*8, page+1);// 列,页 for(i=8; i<16;i++) {

LCD_write_byte(0x00,1);

XXII

第四届全国大学生智能车大赛技术报告

}

LCD_set_XY(row*8, page);// 列,页 for(i=0; i<8;i++) {

LCD_write_byte(shuzi[c*16+i],1); }

LCD_set_XY(row*8, page+1);// 列,页 for(i=8; i<16;i++) {

LCD_write_byte(shuzi[c*16+i],1); } }

void LCD_write_char(byte row, byte page,byte c) //row:列 page:页 dd:字符 {

byte i;

if(c>='A'&& c<='Z') c = c - 'A'+ 10; else if(c==' ') c = 36; else if(c==':') c = 37; else if(c=='-') c = 38; else if(c=='/') c = 39; else if(c=='.') c = 40; else if(c==',') c = 41; else if(c=='^') c = 42;

LCD_set_XY(row*6, page);// 列,页 for(i=0; i<6;i++) {

LCD_write_byte(shuzi[c*6+i],1); } }

XXIII

附录A车模系统C语言源程序

void write_num(uchar hang,uchar lie, uint num) {

uchar bai,shi,ge; bai=num/100;

shi=num/10-bai*10; ge=num%10;

LCD_write_char(lie,hang,bai); // 列 行 数据 LCD_write_char(lie+1,hang,shi); LCD_write_char(lie+2,hang,ge); }

////********************文件名key.h**************************///////////// void delay_ms(uint time) {

uint x,y;

for(x=400;x>0;x--) { for(y=time;y>0;y--); } }

void key_port_init(void) {

PUCR_PUPBE = 1; //内部上拉 }

byte keyscan() {

byte key = 0;

byte temp = 0,temp1 = 0,temp2 = 0; DDRB = 0XF0; PORTB = 0X0F;

if((PORTB&0X0F)==0X0F); else {

delay_ms(30);

if((PORTB&0X0F)!=0X0F) //按下去抖 {

temp1=PORTB&0X0F; DDRB = 0X0F;

XXIV

第四届全国大学生智能车大赛技术报告

PORTB = 0XF0; delay_ms(30);

temp2=PORTB&0XF0;

while((PORTB&0XF0)!=0XF0); //等待键释放 delay_ms(30);

if((PORTB&0XF0) == 0XF0) //释放去抖 {

temp = temp1|temp2; switch(temp) {

case 0b01110111:key=0x01;break; case 0b01111011:key=0x02;break; case 0b01111101:key=0x03;break; case 0b01111110:key=0x04;break; case 0b10110111:key=0x05;break; case 0b10111011:key=0x06;break; case 0b10111101:key=0x07;break; case 0b10111110:key=0x08;break; case 0b11010111:key=0x09; break; case 0b11011011:key=0x0a;break; case 0b11011101:key=0x0b;break; case 0b11011110:key=0x0c;break; case 0b11100111:key=0x0d;break; case 0b11101011:key=0x0e;break; case 0b11101101:key=0x0f;break; case 0b11101110:key=0x10;break; default :break; } } } }

return key; }

/////////////////**************文件名interpt.h***********************/////////////

XXV

附录A车模系统C语言源程序

extern uchar yan_shi; extern uchar sflag; extern uchar san_yan; uchar s_bgn_flag=0; uchar sp_flag=0; uint speed;

uchar y_cot; uchar si; uchar syi;

/******************检测摆头PWM***********************************/ #pragma CODE_SEG __NEAR_SEG NON_BANKED interrupt 12 void Speed_check(void) {

TFLG1_C4F=1; //中断标志位清零 s_bgn_flag=1; sp_flag=1;

speed=(PACN32*16)/25; PACN32=0; if(yan_shi==1) {

y_cot++; if(y_cot>99) {

y_cot=0; yan_shi=0; } }

if(sflag==1) {

si++; if(si>4) {

si=0; sflag=0; } }

XXVI

第四届全国大学生智能车大赛技术报告

}

#pragma CODE_SEG DEFAULT

/************************************************************/

/****************实时中断用来各种的时间控制************************/ //************* 定时为9.22MS*************************************/

#pragma CODE_SEG __NEAR_SEG NON_BANKED interrupt 7 void RTI_ISR(void) { CRGFLG_RTIF=1;

if(san_yan==1) {

syi++; if(syi>9) {

syi=0;

san_yan=0; } } asm cli; }

#pragma CODE_SEG DEFAULT

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

//////////***************文件名sp_col.h**********************////////////// #define go PWMDTY1 #define back PWMDTY0 extern uint speed; extern uchar sp_flag; extern uint sp_zhi; extern uint sp_wan; extern uint sp_zai; uchar sp_dang; uchar sp_d; uchar sp_d1; uchar sp_cha; uchar s_i; uint sp_want; uchar sd[3];

XXVII

附录A车模系统C语言源程序

void speed_col(void) {

if(sp_flag==1) {

if(speed<60) {

s_i++; if(s_i>30) {

PWME_PWME0=0; //使能 PWME_PWME1=0; //使能 } } } else {

s_i=0; } sp_flag=0; if(bait>3400) {

sp_dang=(bait-3400)/50; //在3500 与 3800 之间为一档

}

else //在3300-3500为一档 {

sp_dang=(3400-bait)/50; //在2600-3300为一档 }

//剩下为一档

/***********************************/ if(sp_dang<5) sp_d=0; else if(sp_dang<10) sp_d=1; else if(sp_dang<21) sp_d=2; else

sp_d=3;

/************************************/ sd[2]=sd[1]; sd[1]=sd[0];

XXVIII

第四届全国大学生智能车大赛技术报告

sd[0]=sp_d; sp_d1=0;

sp_d1=sd[0]+sd[1]+sd[2];

if(sp_d1>7) sp_d=4; if(sflag==1) sp_d=5; switch(sp_d) {

case 0:

sp_want=sp_zhi; back=0;

if(speed>sp_want) {

sp_cha=(speed-sp_want)/10; switch(sp_cha) {

case 0: break;

case 1:go-=2;break; case 2:

case 3:go-=5;break; case 4:

case 5:go-=10;break; case 6: case 7:

case 8:go-=10;break; case 9: case 10:

default:go-=25;break; }

if(go<80) go=80; } else {

sp_cha=(sp_want-speed)/10; switch(sp_cha) {

case 0: break;

XXIX

附录A车模系统C语言源程序

case 1:go+=2;break; case 2:

case 3:go+=10;break; case 4:

case 5:go+=10;break; case 6: case 7:

case 8:go+=15;break; case 9: case 10:

default:go+=20;break; }

if(go>220) go=220; }

break; case 1:

sp_want=sp_wan; back=0;

if(speed>sp_want) {

sp_cha=(speed-sp_want)/10; switch(sp_cha) {

case 0: break;

case 1:go-=2;break; case 2:

case 3:go-=5;break; case 4:

case 5:go-=10;break; case 6: case 7:

case 8:go-=15;break; case 9: case 10:

default:go-=20;break; }

if(go<80) go=80; }

XXX

第四届全国大学生智能车大赛技术报告

else {

sp_cha=(sp_want-speed)/10; switch(sp_cha) {

case 0:break;

case 1:go+=2;break; case 2:

case 3:go+=5;break; case 4:

case 5:go+=10;break; case 6: case 7:

case 8:go+=15;break; case 9: case 10:

default:go+=20;break; }

if(go>220) go=220; }

break; case 2:

sp_want=sp_wan-10; if(speed>sp_want) {

sp_cha=(speed-sp_want)/10; switch(sp_cha) {

case 0: break; case 1:go-=4;

if(go<60) go=60; break; case 2:

case 3:go-=10; if(go<40) go=40; break; case 4:

XXXI

附录A车模系统C语言源程序

case 5:go=0;back=0;break; case 6:

case 7:go=0;back=30;break; case 8:

case 9:go=0;back=40;break; case 10:

default:go=0;back=60;break; } } else {

sp_cha=(sp_want-speed)/10; switch(sp_cha) {

case 0: break; case 1:go+=2;break; case 2:

case 3:go+=5;break; case 4:

case 5:go+=10;break; case 6: case 7:

case 8:go+=15;break; case 9: case 10:

default:go+=20;break; }

if(go>220) go=220; }

break; case 3:

sp_want=sp_wan-20; if(speed>sp_want) {

sp_cha=(speed-sp_want)/10; switch(sp_cha) {

case 0:break; case 1:go-=5;

XXXII

第四届全国大学生智能车大赛技术报告

if(go<60) go=60; break; case 2: case 3:

go-=10; if(go<40) go=40; break; case 4:

case 5:go=0;back=0;break; case 6:

case 7:go=0;back=10;break; case 8:

case 9:go=0;back=30;break; case 10:

default:go=0;back=40;break; } } else {

sp_cha=(sp_want-speed)/10; switch(sp_cha) {

case 0: break; case 1:go+=2;break; case 2:

case 3:go+=5;break; case 4:

case 5:go+=10;break; case 6: case 7:

case 8:go+=15;break; case 9: case 10:

default:go+=25;break; }

if(go>220) go=220; }

XXXIII

附录A车模系统C语言源程序

break; case 4:

sp_want=sp_wan-30; if(speed>sp_want) {

sp_cha=(speed-sp_want)/10; switch(sp_cha) {

case 0: break; case 1:

go-=1; if(go<60) go=60; break; case 2: case 3:

go-=6; if(go<40) go=40; break; case 4: case 5:

go-=10; if(go<40) go=40; break; case 6:

case 7:go=0;back=0;break; case 8:

case 9:go=0;back=10;break; case 10:

default:go=0;back=40;break; } } else {

sp_cha=(sp_want-speed)/10; switch(sp_cha) {

case 0: break;

XXXIV

第四届全国大学生智能车大赛技术报告

case 1:go+=5;break; case 2:

case 3:go+=10;break; case 4:

case 5:go+=15;break; case 6: case 7:

case 8:go+=20;break; case 9: case 10:

default:go+=20;break; }

if(go>220) go=220; }

break; case 5:

sp_want=sp_zai; if(speed>sp_want) {

sp_cha=(speed-sp_want)/10; switch(sp_cha) {

case 0: break;

case 1:go=0;back=0;break; case 2:go=0;back=10;break; case 3: case 4:

case 5:go=0;back=50;break; case 6:

case 7:go=0;back=90;break; case 8: case 9:go=0;back=100;break; case 10:

default:go=0;back=150;break; } } else {

sp_cha=(sp_want-speed)/10;

XXXV

附录A车模系统C语言源程序

switch(sp_cha) {

case 0:break;

case 1:go+=4;break; case 2:

case 3:go+=10;break; case 4:

case 5:go+=15;break; case 6: case 7:

case 8:go+=20;break; case 9: case 10:

default:go+=25;break; }

if(go>220) go=220; }

break; } } }

////**************yuzhiget.h***********************//////////// extern uchar Laser[12]; extern uchar la_ok_flag; uint y_zhi[12]; uchar yz[12];

uchar bad_flag[12]; uchar bad_g=0; void yuzhi(void) {

uchar y_i=0; uchar y_j; y_zhi[0]=0; y_zhi[1]=0; y_zhi[2]=0; y_zhi[3]=0; y_zhi[4]=0;

XXXVI

第四届全国大学生智能车大赛技术报告

y_zhi[5]=0; y_zhi[6]=0; y_zhi[7]=0; y_zhi[8]=0; y_zhi[9]=0; y_zhi[10]=0; y_zhi[11]=0; while(y_i<4) {

if(la_ok_flag==1) {

la_ok_flag=0;

y_zhi[0] += Laser[0]; y_zhi[1] += Laser[1]; y_zhi[2] += Laser[2]; y_zhi[3] += Laser[3]; y_zhi[4] += Laser[4]; y_zhi[5] += Laser[5]; y_zhi[6] += Laser[6]; y_zhi[7] += Laser[7]; y_zhi[8] += Laser[8]; y_zhi[9] += Laser[9]; y_zhi[10] += Laser[10]; y_zhi[11] += Laser[11]; y_i++; } }

bad_g=0;

for(y_j=0;y_j<12;y_j++) {

yz[y_j]=y_zhi[y_j]/8; if(yz[y_j]<80) {

bad_flag[y_j]=1; bad_g++; yz[y_j]=0; } } }

XXXVII

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo0.cn 版权所有 湘ICP备2023017654号-2

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务