智能小车-东北大学二队技术报告 - 图文
更新时间:2023-10-12 13:46:01 阅读量: 综合文库 文档下载
- 东北大学智能制造工程推荐度:
- 相关推荐
“飞思卡尔”杯大学生智能车邀请赛
学 校:东北大学队伍名称:东北大学二队参赛队员:沈谋全带队教师:王明顺技术报告
张健 程功
关于技术报告和研究论文使用授权的说明
本人完全了解第一届“飞思卡尔”杯全国大学生智能汽车邀请赛关保留、
使用技术报告和研究论文的规定,即:参赛作品著作权归参赛者本人,比赛组委会和飞思卡尔半导体公司可以在相关主页上收录并公开参赛作品的设计方案、技术报告以及参赛模型车的视频、图像资料,并将相关内容编纂收录在组委会出版论文集中。
参赛队员签名: 带队教师签名:
日 期:
I
摘 要
本智能车控制系统以单片机MC9S12DG128为核心元件,采用CCD视觉传感器进行路况信息采集,可进行路径识别和引导线形识别。通过视频亮度阈值的自适应调整、图像信息二次去噪算法、有效的图像分割和虚拟的光电传感器图像识别算法确保了智能车路径识别传感信号的准确、稳定与快速。自制转速反馈模块以其轻盈小巧的机械特性、简洁的电气特性和相应的环形队列算法,精确实现了快速的车速检测并且不增加任何机械运动部件和机械负荷。直流电动机采用MC33886模块驱动稳定、有力。系统控制策略采用以PID控制为基础的切换控制方案,努力实现系统对快速行驶和稳定运行之间的最佳平衡,在不同的线形的行驶条件下,智能车基本上能按最优控制参数行驶,体现出了良好的动、静态特性。所选用的低压差电源管理芯片TPS7350和滤波、消噪方案,可使在7.2伏电池供电的条件下为系统的各功能模块提供了稳定、可靠的工作电源,为智能车的稳定工作提供了有力的保证。
采用CCD视觉传感器进行路况信息采集、自制的稳定、可靠的工作电源和以PID控制为基础的切换控制策略等是东北大学二队智能车能快速与稳定运行的基石。
关键词:智能车,CCD,路径识别,PID控制,切换控制
III
目录
摘 要 ............................................................................................................................................III 第一章 引言 ................................................................................................................................... 1 第二章 智能车制作思想、技术概要与机械设计 ........................................................................ 2
2.1智能车系统的制作主要思想与技术概要 ................................... 2 2.2机械设计 ............................................................. 2
2.2.1 摄像头的安装 .................................................. 2 2.2.2 摄像头的架设 .................................................. 3 2.2.3 速度反馈传感器 ................................................ 4 2.2.4 主板的安装 .................................................... 4
第三章 智能车路径识别与控制 ................................................................................................... 6
3.1 智能车路径识别方案设计论证与概要 ..................................... 6 3.2 CCD图像采集原理 ..................................................... 7 3.3 智能车路径识别原理 .................................................. 9
3.3.1 视频数据的二值化处理与去噪处理 ................................. 9 3.3.2 路径识别 ..................................................... 10 3.4切换控制 ............................................................ 12
3.4.1切换系统的基本概念 ............................................ 12 3.4.2切换控制在本系统中的应用 ...................................... 13
第四章 系统硬件电路分析 ......................................................................................................... 15
4.1视频同步分离电路 .................................................... 15 4.2 电机驱动电路 ....................................................... 16 4.3 电源管理电路 ....................................................... 17 4.4 加速度传感器电路 ................................................... 19 4.5 转速测量电路 ....................................................... 19 第五章 软件设计 ......................................................................................................................... 21 第六章 开发工具及调试 ............................................................................................................. 26
6.1 开发工具 ........................................................... 26 6.2 调试过程 ........................................................... 26 6.3 测试结果 ........................................................... 26 6.4 单片机资源使用小结 ................................................. 27 第七章 模型车主要技术参数 ..................................................................................................... 29 第八章 结论 ................................................................................................................................. 30 参考文献 .......................................................................................................................................... I 附件一:程序源代码 ....................................................................................................................III
V
第一章 引言
车辆与我们的社会生活息息相关,然而当今车辆的智能化发展还不是很迅速,特别是在安全性、智能化、车与路之间交互信息等方面。今天的车辆技术与未来的智能车辆技术还存在着巨大的差距。今天的汽车工程师正面临着巨大的挑战,需要在新旧技术之间建立一座桥梁,通过应用先进的电子技术、信息技术、电子通讯技术推动车辆技术的进步。[1]
第一届“飞思卡尔”杯大学生智能车邀请赛就是在这种背景下产生的。大赛组委会为每支参赛队伍提供了MC9S12DG128开发板、可充电电池、电机驱动芯片MC33886与舵机。制作智能车,需要参赛队伍学习和应用嵌入式软件开发工具Codewarrior和在线开发手段,自行设计和制作可以自动识别路径的方案、电机的驱动电路、模型车的车速传感电路、模型车转向伺服电机的驱动以及微控制器MC9S12DG128控制软件的编程等等。其专业知识涉及控制、模式识别、传感技术、汽车电子、电气、计算机、机械等多个学科,对学生的知识融合和实践动手能力的培养,对高等学校控制及汽车电子学科学术水平的提高,具有良好和长期的推动作用。[2]
我们队伍以单片机MC9S12DG128为核心,使用Codewarrior软件开发工具,充分利用单片机各功能模块设计制作了本智能车控制系统。在保证系统稳定的前提下,以行驶时间最短为最终目标,设计了新颖的路径识别模块,该模块在视频阈值的处理上使用了自适应方法,它能够自动对环境光线进行实时检测并进行动态调整,提高了视频阈值调整的灵活性,保证了视频数据的准确性,从而为系统的稳定、可靠运行创造了条件。测速模块摒弃了传统的光电码盘测速方式,在基本不增加系统负荷的基础上,使用反射式红外传感器进行测速,在保证速度测量正确性的前提下,提高了速度测量的精度。直流电机控制使用PID控制算法,实现了电机速度控制的快速响应。各功能模块的密切配合,实现了路径的准确识别、电机的快速响应和舵机的精确控制。
1
第二章 智能车制作思想、技术概要与机械设计
2.1智能车系统的制作主要思想与技术概要
智能车系统是以单片机MC689S12DG128为核心,利用组委会提供的统一模型车、电机、舵机、电池、开发系统等资源,设计并制作能够自主识别路径的、以行驶速度快慢为主要评判标准的智能车。在保证整个系统可靠运行的前提下,机械设计尽量简单,电路设计简洁紧凑但功能齐全,减轻系统负载,提高智能车的灵活性;在保证稳定性的前提下,追求时间最短,出色的完成自动行驶任务。
以单片机MC9S12DG128为唯一核心微处理,使用组委会提供的统一模型车、电机、舵机、电池、开发系统等资源,设计制作了本智能车控制系统。主要包括路径识别、直流电机驱动、舵机转向控制、电源管理和转速反馈等模块。在设计与制作的过程中,严格遵守规则但充分发挥创新的原则,以简洁但功能完美为出发点,以稳定性为首要前提,实现智能车行驶时间最短。
2.2机械设计
2.2.1 摄像头的安装
摄像头的安装有以下几个部分组成:安装高度、摄像机镜头水平视场角与摄像机镜头焦距、摄像机镜头俯仰角。 ? 安装高度h
摄像头的视野范围与摄像头的安装高度有关,在相同的俯仰角情况下摄像头安装高度增大,摄像机的视野范围也随之增大,小车的预瞄距离也会相应的增加。所以为了扩大摄像头的视野范围,在安装时可以适当增加摄像头的安装高度。
? 摄像机镜头水平视场角?0与摄像机镜头焦距 f
镜头的焦距与视场角是一一对应的,而且是矛盾的。即镜头焦距小,则视场角大,视野范围大,但距离远的物体分辨不很清楚;反之,焦距大,则视场角小,视野范围小,但距离远的物体分辨更清楚。CCD视野应在车辆预瞄点处覆盖整个道路区域,在图2.1中w为道路宽度,则估算摄像机镜头的水平视场角的
2
第二章 智能车制作思想、技术概要与机械设计
图2.1 几何计算
依据是在道路预瞄点处摄像机的视野范围的宽度大小至少为道路宽度w=14㎝,由几何关系有l?h2?d2,则由:
w ?0?2arctan 公式 1
222?h?d 得 h?17.19cm ? 摄像机镜头俯仰角?0
摄像头俯仰角?0为摄像头中心光轴与道路水平面的夹角,摄像头的预瞄距离d为摄像头中心光轴与地面交点到摄像头在地面上的垂直投影点之间的水平距离(见图2.1所示)。小车行驶时的预瞄距离d可由经验公式估算:
d?v?kt?250?0.06?15cm 公式 2
其中,v是小车行驶速度,kt是预瞄时间,一般取60ms。则摄像头的俯仰角?0为:
h17.19?arctan?48.89? 公式 3 d15以上均为理论计算,根据我们实际情况,最后将摄像头的位置定在h=14.5
?0?arctan㎝、d=25㎝、?0约为55°,可得最佳路径信息。 2.2.2 摄像头的架设
摄像头支架在原模型车保险杠的正中间,支架顶端距地面17㎝,支架直径2㎝,如图2.2所示。
支架为全铝专用摄像头支架。顶部是360°全方位转向头,可将摄像头转向任何位置。底部使用万能胶固定,背后使用透明胶带固定在塑料支架上。由于塑料
3
第一届全国大学生智能汽车邀请赛技术报告
支架具有一定的弹性,所以也对摄像头具有一定的缓冲作用。在受到撞击时可以一定程度地保护摄像头。
图2.2 模型车侧视图
2.2.3 速度反馈传感器
测速传感器由反射式红外传感器(RG149B)、施密特反相器 CD40106为核心的电路制作而成,安装在一块长4.4㎝,宽1.5㎝的矩形电路板上。如图2.3所示。电路板下面安装的传感器距离塑料圈约2㎜。
图2.3 测速传感器安装示意图
2.2.4主板的安装
主板安装简单且稳定,采用三脚支架结构,前脚为原车配带的塑料杆被螺丝
4
第二章 智能车制作思想、技术概要与机械设计
和万能胶固定在小车底盘中心位置,两个后脚为小车后部两个的支柱,如图2.4所示。
图2.4 主板安装示意图
5
第三章 智能车路径识别与控制
本智能车系统在路径识别上采用CCD视觉传感器,为处理器MC9S12DG128提供准确的路径信息。处理器根据路径识别的结果,在控制方法上,使用了的切换控制,使直流电机的速度、舵机转向控制能够与路径信息完美配合,使整个系统稳定可靠运行。
3.1 智能车路径识别方案设计论证与概要
鉴于路径识别在整个智能车控制系统中的重要地位,这里给出路径识别部分的设计方案,并对所采用的方案进行详细介绍。
方案一:基于数字式光电传感器阵列的智能控制
基于反射式红外传感器的数字光电传感器阵列的路径检测方法具有较高的可靠性与稳定性,且单片机易于处理。虽然本次大赛限制的传感器为16个,但是不足以解决精度问题,而且光电传感器本身存在着检测距离近的问题,不能对远方的路径进行识别。降低了对环境的适应能力,影响了智能车的速度和稳定性。
方案二:基于模拟式光电传感器阵列的智能控制
基于反射式红外传感器的模拟光电传感器阵列的路径检测方法同样具有较高的可靠性与稳定性。它利用传感器对白色和黑色的反射率大小,把最大、最小值之间分为n个index区间,通过对各个传感器index值的组合基本能够确定智能车的位置,从而对位置和行驶方向都能较精确的控制。但这种方法对识别道路的计算量大,计算时间较长,且检测距离也不是很远。
方案三:基于CCD传感器与光电传感器的智能融合控制
基于CCD传感器的路径检测方法具有探测距离远的优势,能够尽可能早的感知前方的路径信息进行预判断,再现路径的真实信息。与光电传感器阵列配合使用具有远近结合的优势,且具有较高的稳定性和可靠性。但是本次大赛所要求的控制核心单片机MC9S12DG128,总线时钟最高25M,无法实现高级的图像算法和控制算法,且硬件电路复杂。
方案四:基于CCD传感器的智能控制
6
[3]
第三章 智能车路径识别与控制
基于CCD传感器的路径检测方法具有探测距离远的优势,能够尽可能早的感知前方的路径信息进行预判断,再现路径的真实信息。在本方案中我们还利用CCD传感器的特点在小车前方虚拟出24个光电传感器,能够精确地感知智能车的位置。有效的图像分割;50Hz的控制频率;视频阈值的自适应调整;专门开发的图像信息二次去噪算法和图像识别算法确保了智能车运行的稳定性和快速性。并且硬件安装简单,调试方便。
本次大赛我们选择方案四。
3.2 CCD图像采集原理
这里我们使用专用视频处理芯片LM1881提取行同步与奇偶场同步信息,作为控制单片机对视频信号进行AD采样的控制信号。
视频信号中除了包含图像信号之外,还包括了行同步信号、行消隐信号、场同步信号、场消隐信号以及槽脉冲信号、前均衡脉冲、后均衡脉冲等,因此,若要对视频信号进行采集,就必须准确地把握各种信号间的逻辑关系。LM1881 就是针对视频信号的同步分离而生产的,它为视频信号的处理提供了极大的方便。LM1881 可以从0. 5~2 V 的标准负极性NTSC制、PAL 制、SECAM制视频信号中提取复合同步、场同步、奇偶场识别等信号,这些信号都是图像数字采集所需要的同步信号,有了它们,便可确定采集点在哪一场,哪一行。[4]
通过将CCD视觉传感器输出的视频信号接至视频同步分离芯片LM1881的视频输入端,就可以得到行同步、场同步、奇/偶场同步信号等,这里只使用行同步、奇/偶场同步信号作为单片机进行视频AD采集的控制信号。
由电视原理可知,CCD传感器数据采集的速率是25帧/秒,一帧分奇偶两场,即50场/秒,场扫描时间20ms,每场312.5行,行扫描时间64us,行同步时间是12us,场同步时间2.024ms。为了真实再现数据,要求单片机对视频信号采集速率不小于25场/秒。在我们的系统中,为了保持数据的连续性与可靠性,提高系统的检测精度,采取奇偶场均进行采集的策略。
根据处理器MC9S12DG128进行AD采样与转换的时间要求,这里我们使用24MHz的总线速度,这样每采集一个点的时间大约是2us,每行的扫描时间是64us,去掉行消隐与行同步时间12us,每行有效信息时间为52us。从数据可靠性与稳定性的角度考虑,我们选择每行采集24个点,每场采集170行,但在实际上
7
第一届全国大学生智能汽车邀请赛技术报告
每场采取每10行采集一次的策略,就能够满足系统精度的要求。这样,CCD每场的数据变换成一个17行24列的一个二维数组。图3.1为直线情况下的采集到的原始数据,由于AD采集的参考电压为+1.5V,而视频输入信号的电平在0.5V~1.2V,所以AD采集结果应该是在85~204之间。具体结果如下:
图3.1 CCD采集直线部分的原始数据
下面简单介绍在视频采集部分单片机资源的使用情况:
根据路径上黑线的宽度为25mm,为了提高黑线的识别精度,我们将单片机MC9S12DG128进行超频处理,以满足智能车进行路径识别的精度。如果单片机按照正常的最大AD时钟2MHz进行采样,那么每行视频信号被单片机采集的点数是7点,这样将丢失黑色引导线的大部分信息。正因为MC9S12DG128单片机集成锁相环PLL,通过超频处理,在保证锁相环锁相稳定的前提下,我们将系统总线时钟超到24MHz,AD时钟为6MHz,这样AD采集的点数变成原来的3倍,提高了智能车对黑线的识别精度。
8
第三章 智能车路径识别与控制
MC9S12DG128单片机的模数向下计数器(MDC)功能强大,具有单次与连续运行两种模式。单次运行是指定时时间结束,就停止运行,等待下次定时操作。连续运行模式就是自动重装载模式。由于视频控制信号遵守严格的时间先后顺序,我们复用该定时器,并选用单次运行模式,能够产生行同步12us与场同步2.048ms的准确定时。
单片机MC9S12DG128进行AD采集的控制信号是将LM1881输出行同步(HS)引入到IRQ中断口,奇/偶场信号引入到单片机的PORTH口的0脚。由于在AD采集过程中,采取奇偶场均采集的方式,从充分使用单片机资源的角度出发,我们复用了PORTH0的中断功能。
3.3 智能车路径识别原理
智能车在进行路径识别时,需要单片机将CCD传感器采集到的原始数据进行二值化与去噪处理,保证路径数据的准确性。单片机对处理后数据进行分析,得到路径的识别结果,控制直流电机进行速度调节与舵机的转向。 3.3.1 视频数据的二值化处理与去噪处理
在对CCD视频传感器采集的视频数据进行二值化处理时,涉及到视频阈值的选择。视频阈值选择是否合适直接影响整个系统能否正常运行。
本系统在视频阈值的选择上采取自适应动态调整方式,这是因为考虑到CCD传感器易受环境光线的影响。该方式能够依据环境光线进行自动调整,为系统的提供可靠的二值化数据,也为系统能够稳定运行奠定基础。
视频阈值的具体实现方法为:在系统初始化时,采集一场数据,取这场数据的第一行与最后一行,将这两行数据的最大值与最小值进行加权,即可以得到系统初始时刻视频数据进行二值化的阈值。
图3.2是图3.1进行二值化处理后的数据:
去噪处理在保持视频数据的正确性方面有着不容忽视的作用,也正是由于CCD视觉传感器易受环境光线影响,增加了数据处理的复杂性。在本系统中,我们采取的去噪策略是取距离车体最近的数据,也就是第170行的数据作为参考数据。通过将该行中的0与1个数进行统计,然后存入一个二维数组。由于CCD
9
第一届全国大学生智能汽车邀请赛技术报告
图3.2 二值化与去噪处理后的数据
在本系统的最大视域宽为160mm,黑线宽为25mm,单片机进行对每行进行AD采集的点数为24个,那么代表黑线宽度点的个数为3个或4个或5个(自制赛道宽度不均匀)。具体算法见去噪算法流程图。通过此方法,最近一行的数据具有较高的可靠性,然后以此行为基础,根据数据的连续性,来进行整场数据的噪声处理,如下图所示。
图3.3 车前最近一行去噪前 图3.4 车前最近一行去噪后
图3.5 一帧数据去噪前 图3.6 一帧数据去噪后
3.3.2 路径识别
将视频数据二值化与去噪处理后的结果作为单片机进行直流电机调速与舵
10
第三章 智能车路径识别与控制
机转向控制的数据源。将二值化与去噪处理后的每行数据的0与1的个数进行统计,并存入一个二维数组。具体的方法为:每行设两个计数器,一个为白点的计数器,另一个为黑点的计数器。当第一个点为白点时,白点计数器的值加一,当遇到黑点时,白点计数器停止加1操作,此时黑点计时器开始进行加1操作,当再次遇到白点时,黑点计数器停止计数操作,白点计数器也停止计数操作,然后将白点与黑点的个数存入到二维数组。每行数据按照此方法进行操作,就可得到每行的白点与黑点的个数,然后将白点的个数加上黑点个数的一半,就能得到黑色引导线的中心线位置。
图3.7是视频采集直线与S形曲线模拟图:
图3.7 直线上黑线的中心线和S形上黑线的中心线
图中的黑线上的白点是经过处理后黑线中心线的位置。
路径识别的结果应用在舵机转向控制与直流电机速度调节两个方面。 舵机控制信号的产生是根据智能车车体前端300mm处的数据产生的。利用车体前端300mm的数据信息作为控制信号是因为将单片机每行采集24个点的信息模拟为24个光电传感器识别的结果,此时虚拟的光电传感器的探测位置在车体前方300mm处。由于光电传感器的可靠性,利用智能车车体前端30cm处的数据产生控制信号是可行的。
控制信号的具体产生方法为:将视频数据第170行的0与1的个数统计出来,由1与0的统计方法可知,很容易得到黑线左边的白点的个数与黑点的个数,又
11
第一届全国大学生智能汽车邀请赛技术报告
由于视频采集每行的总点数24点是固定的,因此很容易得到黑线另一边白点的个数,然后将黑线两边白点的个数进行差值处理,该差值为车中轴线与引导线间的偏差值,它可作为舵机进行转向控制的控制依据。
舵机的转向操作是通过单片机的PWM功能来实现的。为了提高单片机MC9S12DG128对舵机的控制精度,在该PWM的产生上,通过将PWM4与PWM5采取级联的方式形成PWM45,进行舵机的转向控制。
直流电机进行速度调节是路径线形来确定的。黑线中心线的位置是智能车进行路径线形判断的条件。过程如下:
将黑线中心线最远点与最近点的X轴向坐标作差。当该差值在常数域[a,b]时,认为是直线,当差值不在该常数域[a,b]时,认为是曲线。曲线又分为半圆曲线与S形曲线,采用类似的方法可以进行区分,同时在半圆模式中可以利用弯道变化的快慢判断普通大圆和特大圆。为了得到准确的直线或曲线信息,采取直线与曲线之间的多次确认与交互确认的方式。直线的确认过程为:设定直线进行N次确认,如果在(N-1)次或更少时确认失败,就作为曲线进行处理,也就是通过记忆的方式将当前状态与历时状态进行比较,以保直线识别的准确性。曲线的确认过程与直线类似。
根据不同路径种类的识别结果,建立了智能车在不同线形的控制策略,同时也为智能车进行切换控制创造了条件。
3.4切换控制
3.4.1切换系统的基本概念
切换系统是指由一族连续时间子系统以及安排在这些子系统之间的切换控制律所构成的系统。切换系统是混杂系统中的一种,形式上较为简单,而在实际中又颇具代表性的一类系统。
从数学上看,切换系统可以用一个微分方程来描述:
x?f?(x), (1) 其中{fp:p?P}是一族从Rn?Rn的充分规则的函数,它的参数是由指数集合P决定。?:?0,???P是一个分段连续的时间函数,称之为切换信号。在特殊的情况下,某一个给定的时间t上?的值,或取决于t、或取决于x(t)、或取决
?12
#endif // VIDEO_SAMPLE_EN #if SCI0_EN SCI0Init();
#endif // SCI0_EN #if REALTIME_EN RealTimeInit();
#endif // REALTIME_EN #if ECT_EN IC_Init(); #endif // ECT_EN #if ECLK_EN
PEAR_NECLK = 0x0; #endif // ECLK_EN
CLKSEL_PLLSEL = 0x0; // Select the PLL as the lock REFDV = REFDV_VALUE; // Set the PLL divide SYNR = SYNR_VALUE; while(!CRGFLG_LOCK); // Wait lock CLKSEL_PLLSEL = 0x1; // Select the PLL as the lock CLKSEL_PLLSEL = 0x1; // Select the PLL as the lock #if PWM_EN PWMInit(); #endif // PWM_EN DG128PortInit(); EnableInterrupts; }
//==================================================================== // PORT INITIALIZATION
//------------------------------------------------------------------------------ void DG128PortInit(void) { DDRA = DDRA_VALUE; DDRB = DDRB_VALUE; PORTA = PORTA_VALUE; PORTB = 0xff; }
//==================================================================== // SCI0 FUNCTION
//------------------------------------------------------------------------------ #if SCI0_EN
void SCI0Init(void) {
VIII
// SCI0BDL = (unsigned char)((16000000UL / 2) / 9600 / 16); SCI0BDH = (BUS_CLOCK / 16 / SCI0_BAUD) >> 8; SCI0BDL = (unsigned char)((BUS_CLOCK / 16 / SCI0_BAUD) & 0xff);
SCI0CR2 = 0xc; // TIE, TCIE, RIE, ILIE, TE, RE, RU, SBK
#if SCI0_RECEINT_EN SCI0CR2 |= 0x20; /* Receiver Full Interrupt Enable Bit */ g_ucSCI0ReceHead = g_ucSCI0ReceTail = 0x0; #endif // SCI0_RECEINT_EN }
//------------------------------------------------------------------------------ #if SCI0_RECEINT_EN
#pragma CODE_SEG __NEAR_SEG NON_BANKED interrupt void SCI0_ISR(void) { unsigned char ucChar;
ucChar = SCI0SR1; // dummy read to clear flags ucChar = SCI0DRL; // Read the data g_ucSCI0ReceBuffer[g_ucSCI0ReceTail ++] = ucChar;
if(g_ucSCI0ReceTail >= SCI0_RECE_BUFFER) g_ucSCI0ReceTail = 0x0; if(g_ucSCI0ReceTail == g_ucSCI0ReceHead) { g_ucSCI0ReceHead ++;
if(g_ucSCI0ReceHead >= SCI0_RECE_BUFFER) g_ucSCI0ReceHead = 0x0; } }
#endif // SCI0_RECEINT_EN
//------------------------------------------------------------------------------ #pragma CODE_SEG DEFAULT
void SendChar0(unsigned char ucChar) { unsigned int i;
for(i = 0; i < SEND_RECE_LOOP; i ++)
if(SCI0SR1 & 0x80) break; //checking empty.
if(!(SCI0SR1 & 0x80)) return; //have some mistakes with SCI0.
SCI0DRL = ucChar; //send successful }
//------------------------------------------------------------------------------ unsigned char ReceChar0(unsigned char *pucChar) { unsigned int i;
#if SCI0_RECEINT_EN
for(i = 0; i < SEND_RECE_LOOP; i ++)
IX
if(CAN_RECE0) break; if(!CAN_RECE0) return 1;
*(pucChar) = g_ucSCI0ReceBuffer[g_ucSCI0ReceHead ++];
if(g_ucSCI0ReceHead >= SCI0_RECE_BUFFER) g_ucSCI0ReceHead = 0x0; return 0x0; #else
for(i = 0; i < SEND_RECE_LOOP; i ++) if(CAN_RECE0) break; if(!CAN_RECE0) return 1; *(pucChar) = SCI0DRL; return 0x0;
#endif // SCI0_RECEINT_EN }
#endif // SCI0_EN
//==================================================================== // VIDEO_SAMPLE FUNCTION
//------------------------------------------------------------------------------ #if VIDEO_SAMPLE_EN
//-------------------------------------------------------------------------- //变量初始化
//-------------------------------------------------------------------------- void SAMPLE_VARIABLE_Init(void) { VVRC = 0;
g_ucVideoDisplay = 0; g_ucVideoOddFlag = 0; g_ucVideoEvenFlag = 0; g_ucSpotProcessFlag = 0; g_ucVideoProcessFlag = 0; }
//-------------------------------------------------------------------------- //PORTH端口初始化
//-------------------------------------------------------------------------- void PORTH_Init(void) {
DDRH = 0X00; //PORTH输入,置一为出
PERH = PERH_PERH0_MASK; //作为输入,使能上拉或下拉 PPSH = PPSH_PPSH0_MASK; //设置为上升沿触发 PIEH = PIEH_PIEH0_MASK; //中断使能 }
interrupt void PORTH_ISR(void) {
PIFH |= PIFH_PIFH0_MASK; //清中断标志位
X
VD = VD_VERTICAL;
MCCTL = (MCCTL_MCZI_MASK|MCCTL_MCEN_MASK); //开定时器,中断使能 MCCNT = 38401; //定时25行 PPSH_PPSH0 = ~PPSH_PPSH0; //上升延,下降延监测变换 }
//-------------------------------------------------------------------------- //IRQ初始化
//-------------------------------------------------------------------------- void IRQ_Init(void) {
INTCR_IRQE = 1; //开行同步监测 falling level; write once, read anytime INTCR_IRQEN = 0; //因默认已连接上中断,故先关掉以免干扰 }
//行场消隐期后,关闭行同步检测信号,其开启完全由奇场上升沿控制 //-------------------------------------------------------------------------- //IRQ中断服务程序
//-------------------------------------------------------------------------- interrupt void IRQ_ISR (void) {
if(Video_Sample_START) {
MCCTL=(MCCTL_MCZI_MASK | MCCTL_MCEN_MASK); MCCNT = 160; //定时12us VD = VD_ROW; VSRC = 0; }
else VSRC++; }
//-------------------------------------------------------------------------- //MDC模下计数器中断服务程序
//-------------------------------------------------------------------------- interrupt void MDC_ISR(void) {
MCFLG_MCZF = 1; //清标志位 MCCTL = 0x00; //关闭模下计数器
//-------------------------------------------------------------------------- if(VD_VERTICAL_FINISH) { //场消隐延时结束标志 VSRC = 0; //行间隔计数器 INTCR_IRQEN = 1; // IRQ连接上中断 }
//--------------------------------------------------------------------------
else if(VD_ROW_FINISH) { //行消隐延时结束标志 ATD0CTL2 |= ATD0CTL2_ASCIE_MASK;
ATD0CTL5 = (ATD0CTL5_DJM_MASK|ATD0CTL5_SCAN_MASK);
XI
VD_CANCEL; } }
//-------------------------------------------------------------------------- //AD初始化
//-------------------------------------------------------------------------- void AD_Init(void) {
ATD0CTL2 = (ATD0CTL2_ADPU_MASK | ATD0CTL2_AFFC_MASK); // g_ucVideoImage上电,快速清零, 无等待模式, 禁止外部触发, 禁止中断 ATD0CTL3 = ATD0CTL3_S1C_MASK;
// 每个序列5次转换, No FIFO, Freeze模式下继续转换 ATD0CTL4 = (ATD0CTL4_SRES8_MASK);
// 8位精度, 2个时钟+4 A/D时钟周期, ATDClock=[BusClock*0.5]/[PRS+1] divider=4
// AD时钟12M
ATD0DIEN = 0x00; // 禁止数字输入 }
//-------------------------------------------------------------------------- //AD中断服务程序
//-------------------------------------------------------------------------- interrupt void ATD0_ISR(void) { static uchar ucImageCounter = 0; static uint ucRowCounter = 0;
g_ucVideo[ucRowCounter][ucImageCounter++] = ATD0DR0; if(ucImageCounter >= VIDEO_ROW_NUMBER) { ATD0CTL2 &= ~ATD0CTL2_ASCIE_MASK; ucRowCounter ++; ucImageCounter = 0;
if(ucRowCounter == VIDEO_VERTICAL_NUMBER) { VVRC ++; //场刷新标志计数 ucRowCounter = 0; INTCR_IRQEN = 0;
if(Video_Sample_FINISH) { //停止检测视频 VVRC = 0; g_ucVideoProcessFlag = 1; } } } }
#endif // VIDEO_SAMPLE_EN
XII
; PRS=1,
第一届全国大学生智能汽车邀请赛技术报告
然使用低压差电源芯片TPS7350。由于TPS7350的输出电压是+5V,为了得到+6V的工作电压,通过提高芯片地电位的方式,将芯片的地通过两个IN4148接至供电电源的地,这样我们就可为舵机提供可靠的+6V工作电压,如图4.6所示。
图4.5 TPS7350 工作电路原理图
图4.6 舵机电压电路图
考虑到CCD摄像头工作的稳定性,我们使用max734[7]进行升压,将摄像头的工作电压提高到+12V,从而为CCD的可靠工作提供保证。该芯片的特点如下:
● 稳定的+12±5%V输出; ● 可靠的120mA电流输出; ● 逻辑可控,70uA关闭; ● 可用效率达85% 。
该芯片只需5个外围器件就可以满足应用要求,具体应用原理图如图4.7所示:
图 4.7 升压电路
18
第四章 系统硬件电路分析
4.4 加速度传感器电路
图 4.8 加速度传感器原理图
考虑到模型车在行驶过程中由于速度过快可能会出现侧滑现象,再加上我们使用的是CCD视觉传感器,如果模型车行驶过程中调速不稳而出现抖动可能会导致CCD采集到虚假数据,从而会影响模型车的控制效果。因此我们选用了Freescale 公司加速度传感器MMA6260[8],感知前进方向和侧向的加速度变化。该加速度传感器可以感知二维加速信息,转换成与加速度大小成线性关系的电压,供后级MCU采样。在这里我们将MMA6260Q水平放置,与CCD的方向保持一致,X轴方向用来检测前进方向是否有突变,Y轴方向检测转弯时是否会有侧滑现象。
4.5 转速测量电路
图 4.8 转速测量电路原理图
车轮转速测量电路如图4.8所示。本系统测速原理是通过将车轮上的黑色塑料圈涂成黑白相间且比例为1:1,利用反射式光电传感器对白与黑两种介质的反射率不同,将光电传感器的输出经过施密特反相器进行整形,就可以得到占空
19
第一届全国大学生智能汽车邀请赛技术报告
比为1:1的脉冲方波,使用单片机MC9S12DG128的输入捕捉功能,对该速转速脉冲进行沿捕捉,就可以得到直流电机的转速值。
为了提高转速的测量精度,我们将单片机MC9S12DG128的输入捕捉设定为上升沿触发方式。在我们的系统中,通过使用上升沿触发的方式与软件上的环形队列算法,可提高速度的测量精度。在本智能车控制系统中,系统时钟24MHz,经过128分频作为单片机输入捕捉的时钟源,利用单片机输入捕捉沿的功能捕捉系统时钟脉冲的个数与车速的对应关系如下表所示:
表 4.1 脉冲与速度关系
速度设定值(cm/s) 转速频率(Hz) 捕捉的时钟脉冲(个) 转速实际值(cm/s) 100 110 120 130 140 150 160 170 180 39 42 46 50 55 57 61 65 68 4808 4464 4076 3750 3409 3289 3074 2885 2757 104 112 122 133 144 152 162 173 178 由表4.1可以看出,采取脉冲-速度模式能够提高测速精度,该方法在本系统的实际应用中也体现了其优点。
20
第五章 软件设计
系统的软件设计部分由视频采集,视频数据一次去噪,视频数据二次去噪,路径识别组成。程序流程图如下:
? 智能车的主函数是系统运行的基础,在系统的初始化阶段,对系统的各功能模块进行初始化,然后按照设定的各子模块运行。智能车系统的总体框图如图5.1所示:
开始SFR初始化自动设置阈值?Y根据环境光设置阈值初始化默认阈值NCCD采集结束?YCCD数据处理NPID调节?YPID速度调节N
图 5.1 系统总体框图
21
第一届全国大学生智能汽车邀请赛技术报告
? 视频采集的数据是单片机进行数据处理的数据源。通过将LM1881的同步信号引入到单片机的中断口IRQ与PORTH0,同时使用单片机的16位模数递减计数器(MDC),进行场同步、行同步的延时,以确保单片机所接收的视频信号的准确性。单片机将AD采集的视频数据存于一个二维数组,然后单片机进行数据处理。视频采集的流程图如图5.2所示:
开始
N要采集的行?Y开启ADN延时时间到?YN行同步?Y行消隐延时场同步信号到?Y场消隐延时N
N采集结束?Y图5.2 视频采集流程图
22
附件一:程序源代码
/*
**==================================================================== ** DG128.H ** Description:
**==================================================================== */
#ifndef __DG128__
#define __DG128__ 1
//------------------------------------------------------------------------------ #define DG128_EXT extern
//==================================================================== // MODULE DEFINE
//------------------------------------------------------------------------------
#define SCI0_EN 1 // Enable SCI0
#define SCI0_RECEINT_EN 1 // Enable SCI0 Receive buffer #define ECLK_EN 1 // Enable BUSCLK = ECLK output #define VIDEO_SAMPLE_EN 1 // Enable VIDEO_SAMPLE #define PWM_EN 1 // Enable PWM
#define REALTIME_EN 1 // Enable time base function #define ECT_EN 1 // Enable ECT //------------------------------------------------------------------------------ // OSC CLOCK
//------------------------------------------------------------------------------ #define OSC_CLOCK 16000000L #define REF_CLOCK 8000000L #define BUS_CLOCK 24000000L #define REFDV_VALUE (OSC_CLOCK / REF_CLOCK) - 1 #define SYNR_VALUE (BUS_CLOCK / REF_CLOCK) - 1
//==================================================================== // PORT INITIALIZATION
//------------------------------------------------------------------------------ #define DDRA_VALUE 0xff //output 1, input 0 #define PORTA_VALUE 0x02 #define DDRB_VALUE 0xff #define PORTB_VALUE 0xBF #define DDRT_VALUE 0xFF //output 1, input 0
//====================================================================
III
// INTERFACE OF FUNCTION
//------------------------------------------------------------------------------ void DG128Init(void);
//------------------------------------------------------------------------------
//==================================================================== // PORT INITIALIZATION
//------------------------------------------------------------------------------ void DG128PortInit(void);
//------------------------------------------------------------------------------
//==================================================================== // VIDEO_SAMPLE FUNCTION
//------------------------------------------------------------------------------ #if VIDEO_SAMPLE_EN
#define VIDEOVERTICAL_ECHO 1 #define VIDEO_ROW_NUMBER 24
#define VIDEO_SAMPLE_ROW_INTERVAL 9
#define VIDEO_VERTICAL_NUMBER (150 / (VIDEO_SAMPLE_ROW_INTERVAL + 1)) //全局变量
DG128_EXT uchar
g_ucVideoImage[VIDEO_VERTICAL_NUMBER][VIDEO_ROW_NUMBER];
DG128_EXT uchar g_ucVideo[VIDEO_VERTICAL_NUMBER][VIDEO_ROW_NUMBER]; DG128_EXT uchar g_ucVideoDisplay; DG128_EXT uchar g_ucVideoOddFlag; DG128_EXT uchar g_ucVideoEvenFlag;
DG128_EXT uchar g_ucSmartcarSpot[VIDEO_ROW_NUMBER]; DG128_EXT uchar g_ucSpotProcessFlag; DG128_EXT uchar g_ucVideoProcessFlag; DG128_EXT uchar g_ucVideoDivideValue;
//-------------------------------------------------------------------------- DG128_EXT uchar g_ucVideoDelay; #define VD g_ucVideoDelay #define VD_VERTICAL 0x1 #define VD_ROW 0x2
#define VD_VERTICAL_FINISH VD==VD_VERTICAL #define VD_ROW_FINISH VD==VD_ROW #define VD_CANCEL VD=0x0
//-------------------------------------------------------------------------- DG128_EXT uchar g_ucVideoVerticalRefreshCounter; //场刷新计数 #define VVRC g_ucVideoVerticalRefreshCounter #define Video_Sample_FINISH VVRC==VIDEOVERTICAL_ECHO
IV
//-------------------------------------------------------------------------- DG128_EXT int g_ucVideoSample_RowCounter; #define VSRC g_ucVideoSample_RowCounter #define Video_Sample_START VSRC==VIDEO_SAMPLE_ROW_INTERVAL //-------------------------------------------------------------------------- //函数声明
void SAMPLE_VARIABLE_Init(void); void PORTH_Init(void); void IRQ_Init(void); void AD_Init(void);
#endif // VIDEO_SAMPLE_EN
//==================================================================== // SCI0 FUNCTION
//------------------------------------------------------------------------------ #if SCI0_EN
#define SCI0_BAUD 115200 void SCI0Init(void);
//------------------------------------------------------------------------------ #if SCI0_RECEINT_EN
#define SCI0_RECE_BUFFER 32
DG128_EXT unsigned char g_ucSCI0ReceBuffer[SCI0_RECE_BUFFER]; DG128_EXT unsigned char g_ucSCI0ReceHead, g_ucSCI0ReceTail; #endif // SCI0_RECEINT_EN
//------------------------------------------------------------------------------ #define SEND_RECE_LOOP 0xfff0 void SendChar0(unsigned char ucChar);
unsigned char ReceChar0(unsigned char * pucChar); #if SCI0_RECEINT_EN
#define CAN_RECE0 (g_ucSCI0ReceHead != g_ucSCI0ReceTail) #else
#define CAN_RECE0 (SCI0SR1 & 0x20) #endif // SCI0_RECEINT_EN
//------------------------------------------------------------------------------ #endif // SCI0_EN
//==================================================================== // PWM SECTION
//------------------------------------------------------------------------------ #if PWM_EN
//------------------------------------------------------------------------------ #define PWM0_EN 1
V
#define PWM1_EN 1 #define PWM2_EN 0 #define PWM3_EN 0 #define PWM4_EN 1 #define PWM5_EN 1 #define PWMPER0_VALUE 0x17 #define PWMPER1_VALUE 0x70 // 1770 = 6000 for output 500Hz #define PWMPER2_VALUE 0xff #define PWMPER3_VALUE 0xff #define PWMPER4_VALUE 0x75 #define PWMPER5_VALUE 0x30 // ea60 = 30000 for output 100Hz #define PWMDTY0_VALUE 0 #define PWMDTY1_VALUE 0 #define PWMDTY2_VALUE 0
#define PWMDTY3_VALUE 0 //(PWMPER3_VALUE / 2) #define PWMDTY4_VALUE 0x11 #define PWMDTY5_VALUE 0x94 //1194 = 4500, 1.5ms高电平 void PWMInit(void); #endif // PWM_EN
//==================================================================== // REALTIME ENABLE
//------------------------------------------------------------------------------ #if REALTIME_EN void RealTimeInit(void);
DG128_EXT unsigned int g_nRealTimeCount; #endif // REALTIME_EN
//==================================================================== // ECT FUNCTION
//------------------------------------------------------------------------------ #if ECT_EN
#define MOTOR_STOP PORTB_BIT6 = 1 #define MOTOR_START PORTB_BIT6 = 0 DG128_EXT int g_ucSampleSpeed; #define SS g_ucSampleSpeed DG128_EXT uint g_uiMotor_Fre; DG128_EXT int g_ucPreSpeed; DG128_EXT float PID_P; DG128_EXT float PID_I; DG128_EXT float PID_D;
DG128_EXT uchar g_ucSpeedStart;
VI
DG128_EXT uchar g_ucPidFlag; //函数声明
void IC_Init(void);
#define SPEED_SUBTRACT (g_ucPreSpeed-g_ucSampleSpeed) #define SAMPLE_SUBTRACT (g_ucSampleSpeed-g_ucSampleSpeed_last) #define PID_CONDITION ((SPEED_SUBTRACT>6) || (SPEED_SUBTRACT<-6))&&(g_ucPidFlag == 1) //函数声明
void PID(void); #endif // ECT_EN // END OF THE FILE :DG128.H #endif // __DG128__ /*
**==================================================================== ** DG128.C **
** Description: **
**==================================================================== */
#include
#include
//==================================================================== // INTERFACE OF FUNCTION
//------------------------------------------------------------------------------ void DG128Init(void) { DisableInterrupts; #if VIDEO_SAMPLE_EN
PORTH_Init(); //奇场试别 AD_Init(); //AD采集 IRQ_Init(); // Disable IRQ falling level; SAMPLE_VARIABLE_Init(); //Initialize the VARIABLE
VII
正在阅读:
智能小车-东北大学二队技术报告 - 图文10-12
0-12月婴儿生长发育过程05-29
2014学年高二语文同步练习:《滕王阁序》(新人教版必修5) Word版含答案]06-08
顺口溜解电学综合题的示例07-28
仁爱英语八年级上册语言知识点汇编10-13
初中生操行评语(经典3篇)03-22
一般现在时讲解与练习(初中英语)08-26
中国农业发展银行彬县支行与咸阳鸿达运输公司、张立路、保财险秦05-08
社保缴费等计提基数和比率07-25
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 东北大学
- 小车
- 图文
- 智能
- 报告
- 技术
- 驾照理论考试口诀
- 外语教学流派中文翻译(打印版)
- 英语完形填空记叙类文章答题技巧
- 哲学讲义
- 宁波港
- 机务 整机放行737NG-ME
- 背包问题类型各题总结-acm
- 幼儿文学教案
- 编辑出版学专业课外阅读书目
- 合作框架协议
- 基于51单片机的电子定时器论文 - 图文
- “一诺三平三公开”工作方案
- ARS TCS 牵引力控制新技术及发展前沿 - 图文
- PMC主管的求职简历模板
- 附录1:数据文件命名规则和格式 - 图文
- windows Server 2003和LINUX双系统安装 - 图文
- 湖南省浏阳二中2018-2019学年高一雅礼班选拔考试英语试卷 Word版含答案
- 在县委办公室全体干部职工会议上的讲话
- 单片机控制左右来回循环的流水灯
- 低压电机防爆改造改造技术方案 - 图文