第十届“飞思卡尔”杯全国大学生智能汽车竞赛技术报告(摄像头组)重庆大学 摄摄摄像头头8888队

上传人:小** 文档编号:57141733 上传时间:2018-10-19 格式:DOCX 页数:73 大小:1.61MB
返回 下载 相关 举报
第十届“飞思卡尔”杯全国大学生智能汽车竞赛技术报告(摄像头组)重庆大学  摄摄摄像头头8888队_第1页
第1页 / 共73页
第十届“飞思卡尔”杯全国大学生智能汽车竞赛技术报告(摄像头组)重庆大学  摄摄摄像头头8888队_第2页
第2页 / 共73页
第十届“飞思卡尔”杯全国大学生智能汽车竞赛技术报告(摄像头组)重庆大学  摄摄摄像头头8888队_第3页
第3页 / 共73页
第十届“飞思卡尔”杯全国大学生智能汽车竞赛技术报告(摄像头组)重庆大学  摄摄摄像头头8888队_第4页
第4页 / 共73页
第十届“飞思卡尔”杯全国大学生智能汽车竞赛技术报告(摄像头组)重庆大学  摄摄摄像头头8888队_第5页
第5页 / 共73页
点击查看更多>>
资源描述

《第十届“飞思卡尔”杯全国大学生智能汽车竞赛技术报告(摄像头组)重庆大学 摄摄摄像头头8888队》由会员分享,可在线阅读,更多相关《第十届“飞思卡尔”杯全国大学生智能汽车竞赛技术报告(摄像头组)重庆大学 摄摄摄像头头8888队(73页珍藏版)》请在金锄头文库上搜索。

1、第十届“飞思卡尔”杯全国大学生智能汽车竞赛技 术 报 告学 校: 重庆大学队伍名称: 摄摄摄像头头8888参赛队员: 鄢 雨 陈铁力 谭帮成带队教师: 李敏 陈小强 1关于技术报告和研究论文使用授权的说明 本人完全了解第十届“飞思卡尔”杯全国大学生智能汽车竞赛关保留、使用技术报告和研究论文的规定,即:参赛作品著作权归参赛者本人,比赛组委会和飞思卡尔半导体公司可以在相关主页上收录并公开参赛作品的设计方案、技术报告以及参赛模型车的视频、图像资料,并将相关内容编纂收录在组委会出版论文集中。参赛队员签名: 鄢雨 陈铁力 谭帮成 带队教师签名: 李 敏 陈小强 日 期: 2015.08.10 摘 要本文

2、设计的智能车系统以MK40DN512VLQ10微控制器为核心控制单元,通过CMOS摄像头检测赛道信息,提取赛道两边黑色引导线,用于赛道识别;通过光电编码器检测模型车的实时速度,使用PID控制算法调节驱动电机的转速和转向舵机的角度,实现了对模型车运动速度和运动方向的闭环控制。为了提高模型车的速度和稳定性,在算法和小车的机械结构上都作了许多的工作,也积累了一系列宝贵的经验。 并且,小车在2015年的赛区赛中通过了实战的检验。关键字:MK40N512VLQ10,OV7725,PID,飞思卡尔智能车目录摘 要III第一章 引言1第二章 系统总体方案设计2第三章 机械结构设计63.3 舵机的安装73.4

3、.1 摄像头支撑杆的选择83.4.2 摄像头标定和矫正8第四章 硬件系统设计及实现114.2.1 摄像头124.2.2编码器134.3.1单片机最小系统板154.3.2电源稳压电路及检测电路164.3.3图像处理电路174.3.4电机驱动电路174.3.5舵机接口电路194.3.6键盘拨码电路19第五章 软件系统设计及实现205.1.1原始图像的特点205.1.2 原始图像的矫正225.1.3赛道搜线算法235.1.4赛道中心的计算245.1.5起跑线的检测245.2.1位置式PID265.2.2增量式PID275.2.3 PID参数整定28第六章 软件调试29第七章 结论31参考文献35附录

4、XXXVI15 第一章 引言1.1 智能车大赛简介教育部为了加强大学生实践、创新能力和团队精神的培养,在已经举办全国大学生数学建模、电子设计、机械设计、结构设计等四大竞赛的基础上,委托教育部高等学校自动化专业教学指导委员会举办每年一度的全国大学生智能汽车竞赛。该赛事与教育部已经举办的四大竞赛一样,都是为了提高大学生的动手能力和创新能力而举办的,具有重大的现实意义。与其他大赛不同的是,这个大赛的综合性很强,是以迅猛发展的汽车电子为背景,涵盖了控制、模式识别、传感、电子、电气、计算机和机械等多个学科交叉的科技创意性比赛,这对进一步培养本科生获取知识、应用知识的能力及创新意识,培养硕士生从事科学、技

5、术研究能力,培养博士生知识、技术创新能力具有重要意义。1.2 智能汽车制作情况概述 根据竞赛规则及功能要求,本智能车以飞思卡尔公司的32位单片机MK40N512VLQ10为核心控制器,以CMOS视频传感器OV7725为核心传感器,在组委会提供统一车模平台上,构建完整智能小车系统。小车通过摄像头采集道路图像信息送入单片机,在单片机中对输入的原始图像信息进行处理,提取出赛道的特征信息,据此选择最优行进路线并进行速度的控制。整个系统设计包括车体机械结构设计和软/硬件系统设计。车体机械结构设计主要包括前后轮的调节、PCB板的布局、车身底盘的改装、图像传感器、舵机以及编码器的安装等;硬件电路设计部分主要

6、包括:1) 用TPS7350和TPS7333作为核心芯片的稳压电路,可为系统的各功能模块提供了稳定、可靠的工作电源,为智能车的稳定工作提供了有力的保证;2) 采用数字摄像头OV7725对赛道进行检测,通过边缘搜线算法获得黑线位置。3) 速度传感器采用的是光电编码器,构成的测速部分,用以完成对速度的实时测量和反馈控制;4) 用MOS搭建的电机驱动电路,驱动电机稳定快速的运行;软件系统设计完成了各功能模块的算法及程序设计,包括图像采集及滤波算法设计、搜索黑线算法及赛道中心求解算法设计以及舵机和电机的PID算法设计。本系统利用开发工具IAR Embedded Workbench进行编程开发,用J-L

7、INK进行程序下载。这些工具的使用,使得软件的设计编程和调试工作得到了保证。所设计的系统经过测试,赛车能够快速安全的行驶。1.3 文献综述 在智能车制作过程中,我们参考了大量的相关资料文献。从Freescale公司官方网站,下载得到K40系列单片机开发技术手册,了解所有寄存器功能。参考学做智能车-挑战“飞思卡尔”杯了解做智能车的相关知识,同时也参照学习了历年的技术报告的算法思想,结合去年的双线赛道设计和今年前轮驱动、后轮转向的规则,通过边缘提取算法获得黑线位置,利用计算偏差的思想设计出适合本车的算法。任何科研项目的启动都需要从查找文献开始,站在前人的肩膀上能让自己少走很多弯路,也才能使相同方向

8、的研究更快的取得进步。1.4 本文主要结构本文针对第十届飞思卡尔杯智能车准备阶段的各个方面做了一个详细的总结。采用先总后分的结构,先对系统总体设计进行介绍,然后分别对各部分进行介绍,突出强调了系统机械设计、硬件电路和软件编程。 本文分为七个章节,第一章为引言部分,简单介绍了本校智能车制作的一些情况;第二到六章为主体部分,对机械结构系统、硬件和软件设计系统进行了详细介绍,并对调试方法和调试过程进行了说明;第七章为总结,主要阐述了在设计过程中遇到的问题和解决办法,以及还存在的问题。 第二章 系统总体方案设计 第二章 系统总体方案设计根据大赛的统一要求,须在组委会统一提供的车模平台上,自主选择传感器

9、类型,设计系统硬件电路,开发软件算法。本系统主要包括三个大部分,分别为车模的机械结构、硬件电路系统、软件算法。每一个部分又由各个小模块构成。所以要构建一个完整的小车系统,必须先对各个模块进行论证和设计,在将整个系统组合成一个完整系统,进行系统整体的调试。2.1系统总体结构智能车主要由三个部分组成:检测系统,控制决策系统,动力系统。其中检测系统采用CMOS数字摄像头,控制决策系统用MK40N512VLQ10作为主控芯片,动力系统主要控制舵机的转角和直流电机的转速。整体的流程为,通过视觉传感器来检测前方的赛道信息,并将赛道信息发送给单片机。同时,通过光电编码器构成的反馈渠道将车体的行驶速度信息传送

10、给主控单片机。根据所取得的赛道信息和车体当前的速度信息,由主控单片机做出决策,并通过PWM信号控制直流电机和舵机进行相应动作,从而实现车体的转向控制和速度控制。传感系统摄像头光电编码器赛带信息速度信息控制决策系统PWM波动力系统智能车系统总体结构框图如下:图 2.1 智能车系统总体结构框图赛车的硬件电路主要有七个部分组成:MK40N512VLQ10芯片及其外围电路,电源管理模块,图像采样处理模块,速度检测电路,电机驱动电路,舵机驱动模块,WIFI等辅助调试模块。(1)、MK40N512VLQ10芯片及其外围电路是系统的核心部分,负责接收赛道图像数据,赛车速度等反馈信息,并对这些信息进行恰当的处

11、理,形成合适的控制量来对舵机与驱动电机模块进行控制。 (2)、电源管理模块给整个系统供电,保障系统安全稳定运行。(3)、图像采样处理模块采用数字摄像头OV7725,用于获得前方道路情况以供单片机处理,是智能小车的“视觉系统”。(4)、速度检测电路采用欧姆龙公司的500线光电编码器。(5)、电机驱动电路采用MOS全桥驱动并联搭建全桥,可以实现电机的正反转。(6)、舵机驱动模块控制舵机的转向。(7)、辅助调试模块WIFI模块、键盘模块、拨码开关、LED指示及串口通讯等。图 2.2 硬件系统总体框图电源模块路径识别模块OV7725车速采集模块编码器飞思卡尔16位单片机MK40N512VLQ10电机驱

12、动模块 直流电机舵机转向模块硬件系统总体框图如图2.2所示。2.2 整车效果图(1)车模底盘降低,主板降低,以降低重心。(2)舵机竖直放置,方便控制。(3)用轻便坚固的碳纤杆作为摄像头杆的材料。(4)摄像头安于电池的后方,有利于重心分布和盲区与前瞻的匹配。图 1.3 整车效果图2.4 本章小结本章主要介绍了智能小车控制系统的工作原理和赛车整体结构设计框图。硬件、软件和机械部分的有效融合是赛车能否跑出好成绩的关键因素。根据系统的需求简要给出了系统的总体设计方案,并具体将整个系统划分成传感系统、控制决策系统和动力系统,并对系统的总体框架作了一个简单的介绍。只有在把握整体之后,才能进行细节的处理。

13、第三章 机械结构设计 第三章 机械结构设计根据组委会的相关规定,今年摄像头组比赛车模更换为C型车模。针对不同的车模,必然会有不同的机械调整方式。在比赛备战之初,我们就对该B车模进行了详细的系统分析。按规则要求,转向轮在后面,因此我们在规则允许范围内尽量改造车模,如改进转向轴和舵机,以及底盘的固定,以提高车模的整体精度。本章将主要介绍我们的智能汽车车模的机械结构及调整方案。要使小车能够稳定、高速地运行,正是在于机械结构与软硬件系统地融洽结合,通过不断地实验和测试,我们发现以下三个方面的机械结构对小车的运行影响很大:转向机构,传感器的固定,重心的调整。高速运行下舵机的转动速度对车转向的灵活程度起到

14、了根本性的作用。摄像头是采集最原始赛道信息的最前端的传感器,良好的固定方案才能使其最大限度地采集到良好的赛道信息。而整车的重心越低,自然才能在控制时更加灵活稳定。3.1车模机械模型本次比赛采用东莞市博思电子数码科技有限公司1:10仿真车模,有极好的调零装置,可以自由组装,在严格遵守比赛规则对车模要求的前提下,我们对车模进行重装和改装。3.2转向轮的调节现代汽车在正常行驶的过程中,为了使汽车直线行驶稳定,转向稳定、轻便,转向后能及时回正,并减少轮胎和转向系零件的磨损等,转向轮定位的作用很重要。我们通过不断试验对3.3 舵机的安装舵机是具有较大延迟特性的器件,其延迟与其转角大小成正比,但如果能使舵

15、机转过一个越小的角度而使车轮转过一个越大的角度,则会大大提高舵机过弯的响应速度。这不仅与舵机的安装方式有关,而且也与舵机输出臂的长度有关。输出臂越长,舵机转向越灵敏,输出臂越短,舵机给转向轮的施力越大。在经过实际的实验和尝试后,我们尽可能的使转向舵机垂直于水平,保持原臂长度不便的情况下,让输出臂长度最大。具体安装如图3.1所示。图 2.1 舵机实际安装图3.4 摄像头的安装摄像头安装主要考虑三个方面,一是图像的失真要小,而是整车重心要低,三是前瞻要比较大。由于今年同样采用双引导线的路径,对摄像头的安装要求更高,必须保证视野要广,同时车的重心又不能太高。图 3.2 摄像头安装图及转接板3.4.1

16、 摄像头支撑杆的选择在摄像头支架杆上的选择也有两种,前一种是碳素杆非常轻,但很容易破碎,后一种采用轻质铝材,牢固耐用,但比起碳素杆还是重了许多。对比两种材质的支撑杆,结合本届车模的具体情况,决定采用碳素杆材料,从而减轻车模重量。我们的第一辆车,就是因为没有掌握好摄像头杆对重心的影响,为了使摄像头固定得非常牢靠,而对杆进行配重,最后使得在高速转弯时非常容易侧翻。参加赛区赛的第二辆车更换了较轻的摄像头杆,同样的算法取得了非常显著的效果。可见重心对整个小车系统的影响。3.4.2 摄像头标定和矫正刚刚买来的摄像头,因为加工带来的误差,每一个产品的光学特性都有差异,因此我们首先要检测其图像是否调正,通常

17、我们将摄像头连接电脑观测视频卡采集的图像,再手动调正后,粘接好后再固定。3.5 编码器的安装编码器是测速用的核心模块,必须将其和电机牢牢咬合才能准确测量实际速度值,而且必须保证高速和低速情况都能咬合紧。我们选取的500线的欧姆龙编码器,其性能稳定且返回的速度值稳定。安装采用一个线切割的空白PCB板和车身固定在一起这样便使得编码器能非常牢的和电机齿轮咬合。具体安装图如图3.5所示。图 3.5 编码器的安装图3.8 整车效果图整车效果图如图3.8所示:图 3.8 整车效果图3.9 本章小结本章主要介绍了小车的安装制作和调试过程中机械方面的具体的问题。我们从开始比赛以来,一直坚持机械结构和算法是同样

18、重要的原则,在更新算法的同时也在提高相应的机械和硬件结构来适应。上面的介绍是我们最稳定的小车版本的经验。而在刚开始做小车到现在,对机械结构方面我们做了许许多多各种各样的尝试和实验,收获了一些效果,但是目前这版是能够适应算法并且最稳定的机械结构系统。 第四章 硬件系统设计及实现 第四章 硬件系统设计及实现4.1硬件设计方案从最初进行硬件电路设计时我们就既定了系统的设计目标:可靠、高效、简洁,在整个系统设计过程中严格按照规范进行。可靠性是系统设计的第一要求,我们对电路设计的所有环节都进行了电磁兼容性设计,做好各部分的接地、屏蔽、滤波等工作,将高速数字电路与模拟电路分开,使本系统工作的可靠性达到了设

19、计要求。高效是指本系统的性能要足够强劲,我们主要是从以下两个方面实现的:(1) 采用0.5mm FFC排线作为摄像头数据线,减小接头体积,减轻质量,做好屏蔽,提高信号传输的稳定性;(2) 使用了由分立元件制作的直流电动机可逆双极型桥式驱动器,该驱动器的额定工作电流可以轻易达到20A以上,保证了电动机的工作转矩和转速。简洁是指在满足了可靠、高效的要求后,为了尽量减轻整车重量,降低模型车的重心位置,应使电路设计尽量简洁,尽量减少元器件使用数量,缩小电路板面积,使电路部分重量轻,易于安装。我们在对电路进行了详细分析后,对电路进行了简化,合理设计元件排列、电路走线,使本系统硬件电路部分轻量化指标都达到

20、了设计要求。4.2传感器的选择4.2.1 摄像头COMS与CCDCCD摄像头具有对比度高、动态特性好的优点,但需要工作在12V电压下,对于整个系统来说过于耗电,而且CCD体积大,质量重,会抬高车体的重心,这对于高速情况下小车的行驶非常不利。与之相比,COMS摄像头具有体积小、质量轻、功耗低、图像动态特性好等优点,因为小车对图像的清晰度,分辨率要求并不高,所以选用COMS摄像头。对于摄像头的选择,主要考虑以下几个参数:1 、芯片大小2 、自动增益3 、分辨率4 、最小照度5 、信噪比6 、标准功率7 、扫描方式其中芯片大小主要会对视场的范围会有影响,扫描方式主要有追行扫描以及隔行扫描,像OV51

21、16就是隔行扫描。世面上的摄像头主要分为数字和模拟两种,数字摄像头主要有OV7620,OV6620,OV7670,OV7725。模拟摄像头主要有OV5116,BF3003,MT9V136。大多数摄像头都支持SCCB通信,可以很好的实现单片机与摄像头之间的交互。智能车的摄像头对图像的分辨率要求并不高,但是对动态特性要求非常高,特别是小车在高速行驶入弯或者出弯的时候,图像变化较大,这就对摄像头的自动增益有较高的要求。一般来说,在摄像头图像发生突变时,感光芯片本身会有一段适应时间,这段时间要求越小越好。OV7725,BF3003比较,OV7725具有成像稳定,技术成熟等优点,但是同时也有供货不稳定(

22、已停产),图像动态特性差等缺点。于是我们选用了新的摄像头OV7620。经试验证明,与OV7725相比,OV7620具有动态特性好,反应快,曝光时间短等优势,且可以进行SCCB通信,能够实现动态调节,但是OV7620功耗大,对电源芯片要求较高,复合信号纹波较大,稳定性不如OV7725。OV7725是Omni Vision公司生产的较为典型的CMOS图像传感器模块,芯片阵列大小为640 480,有效光敏面为312215像素,电源是3.3 V(可兼容5V),28个引脚的PLCC型封装。摄像头输出的黑白全电视信号为PAL制式模拟信号,每秒30帧,电视扫描线为625线,奇场在前,偶场在后。为方便使用26

23、P-0.5mm-FFC排线,我们特地制作了OV7725摄像头的转接板,并对电路部分做了充分的LC滤波,防止纹波对图像质量的干扰。转接板电路原理图如图4.1所示:图4.1 OV7725摄像头转接板原理图4.2.2编码器由于我们在赛区预赛中考虑到智能车在实际速度控制中对反应车速的控制信号波形要求不是太高,我们使用欧姆龙的500线编码器,型号为E6A2-CW3C。速度传感器实物图如图4.2所示:图 3.2 欧姆龙编码器这个编码器有两相信号反馈给单片机,其输入波形如图4.3所示: 图 4.3 方波编码器波形图4.3电路设计方案智能车控制系统电路由三部分组成:MK40N512VLQ10为核心的最小系统板

24、、主板、摄像头转接板、驱动模块。我们把单片机最小系统直接做在了主板上,组成了信号采集、信号处理、电机控制、舵机控制单元。为了减小电机驱动电路带来的电磁干扰,我们把电机驱动部分和控制单元部分分开来,做成一个模块接在主板上。主板上集成了本系统的主要电路,它包括如下部件:电源稳压电路、摄像头接口、舵机接口、编码器模块、拨码开关、键盘、指示灯等。4.3.1单片机最小系统板MK40N512VLQ10是K40系列MCU。Kinetis系列微控制器是Cortex-M4系列的内核芯片。K40内存空间可扩展,从32 KB闪存8 KB RAM 到 1 MB 闪存 128 KB RAM,可选的16 KB 缓存用于优

25、化总线带宽和闪存执行性能。图 4.4 K40最小系统原理图最小系统使用K40 144 PIN封装,用到的接口为: PWM 接口,外部中断接口,若干普通 I/O 接口。其他部分还包括电源滤波电路、时钟电路、复位电路、串行通讯接口、BDM 接口和 SPI接口。用到的接口如下:电机PWM波输出:PTC2舵机PWM波输出:PTA8编码器两相信号输入:PTC12、PTC5VSYNC场信号输入:PTB1摄像头图像信号输入:PTC0、PTC1、PTC2、PTC3、PTC4、PTC5、PTC6、PTC7陀螺仪信号输入:PTE25键盘输入信号:PTA24、PTA25、PTA26、PTA27、PTA28、PTA2

26、9拨码开关输入信号:PTA13、PTA14、PTA15、PTA16预留I/O口:PTC13、PTC14、PTC15、PTC16、PTC17、PTC18、PTC194.3.2电源稳压电路及检测电路本系统中电源稳压电路分别需要有+5V,+3.3V,+6V供电。+3.3V给单片机供电;+5V给摄像头、键盘拨码供电;+6V 给舵机和编码器供电。图 4.5 稳压电路由于整个系统中+5V 电路功耗较小,为了降低电源纹波,我们考虑使用线性稳压电路。另外,后轮驱动电机工作时,电池电压压降较大,为提高系统工作稳定性,必须使用低压降电源稳压芯片,我们选用了TPS7350。TPS7350 是微功耗低压差线性电源芯片

27、,具有完善的保护电路,包括过流、过压、电压反接保护。使用这个芯片只需要极少的外围元件就能构成高效稳压电路。TPS7333超是低噪,高电源电压抑制比,高速射频,线性调节的低压稳压芯片。由TPS7350输出为其供电,我们选用fixed versionTPS7333,输出+3.3V为单片机供电。图 4.6 TPS7333原理图4.3.3图像处理电路我们的智能模型车自动控制系统中使用黑白全电视信号格式 CMOS 摄像头采集赛道信息。摄像头视频信号中除了包含图像信号之外,还包括了行同步信号、行消隐信号、场同步信号、场消隐信号以及槽脉冲信号、前均衡脉冲、后均衡脉冲等。因此,若要对视频信号进行采集,就必须通

28、过视频同步分离电路准确地把握各种信号间的逻辑关系。我们使用了D触发器分频对黑白全电视信号进行视频同步分离,得到行同步、场同步信号。D触发器分频电路原理如图4.7所示:图4.7 D触发器构成的二分频电路原理图4.3.4电机驱动电路电机驱动采用比较方便使用的驱动芯片,美国Infineon公司的大功率H半桥集成芯片MOS,同时具有电流检测,以及过温、过压、欠压、过流和短路保护等诊断功能。供电压545 V,最大电流50 A,驱动信号PWM频率为利用芯片控制直流电机,不仅可以简化电路设计,而且使得控制更加简单。为了防止系统在工作过程中因为芯片保护而停止工作,在小车设计时,充分考虑到了散热、稳压、过流保护

29、等情况并采取一定措施。图 4.8 电机驱动模块原理图采用2片MOS组成一个完整的H桥驱动电路驱动小车电机,如图3.9所示。其中,Motor端分别接电机的两端;IS端接下拉电阻,用于配置IS端输出电压的范围;P1与P2,分别输出非零占空比的PWM和零占空比的PWM,保证左右半桥上下背各有一个导通,组成一个回路。SR引脚通过下拉电阻接地,用于调节MOSFET管开关频率,这里接3.3 k电阻,MOS的开/关时间分别为4.4/3.4s。另外,由于MOS内部没有光电隔离,故在与MCU接口时串接了一个高速光耦HCPL2630,防止驱动电路发生击穿等故障时损坏与其相连接的MCU等器件。4.3.5舵机接口电路

30、舵机接口电路包括,供电电路和PWM号输入接口。图 4.9 舵机接口原理图4.3.6键盘拨码电路主板上还包括拨码开关电路和键盘电路。图 4.10 拨码开关、键盘接口原理图 第五章 软件系统设计及实现 第五章 软件系统设计及实现高效的软件程序是智能车高速平稳自动寻线的基础。我们设计的智能车系统采用CMOS摄像头进行赛道识别,图像采集搜索赛道信息及校正处理就成了整个软件的核心内容。而在智能车的转向和速度控制方面,参考往届的经验,我们使用了鲁棒性很好的经典PID控制算法,配合使用理论计算和实际参数补偿的办法,使智能车能够稳定快速寻线。5.1赛道中心线提取及优化处理5.1.1原始图像的特点在单片机采集图

31、像信号后需要对其进行处理以提取主要的赛道信息,同时,由于交叉道、起点线的存在,光线、杂点、赛道远处图像不清楚的干扰,图像效果会大打折扣。因此,在软件上必须排除干扰因素,对赛道进行有效识别,并提供尽可能多的赛道信息供决策使用。在图像信号处理中我们提取的赛道信息主要包括:赛道两侧边沿点位置、通过校正计算的赛道中心位置,中心点规划面积,赛道变化幅度,赛道类型判别。由于摄像头自身的特性和远小近大的视觉原理,图像会产生梯形式变形,这使得摄像头看到的赛道信息和实际真实的赛道信息有所区别。因此我们利用赛道进行测量和标定,得到一系列的参数,将摄像头采到的原始图像还原出真实赛道信息。原始图像是一个将模拟图像经模

32、拟电路转换得到的二维数据矩阵,矩阵的每一个元素对应一个像素点,图像的第一行对应最远处,大约160cm,图像的最底部一行对应最近处,大约10cm。远处的图像小,近处的图像大,黑线为梯形状。摄像头返回的这个矩阵中,每一个像素点都有一个从0至255的灰度值,值越大表示该像素点越亮,相反,越暗的像素点值就越小。同色间的灰度差很小,而不同色间的灰度差很大,通过给两个像素值作差得到的结果,就能够判断出当前像素位置有无发生灰度跳变以及灰度跳变的方向(从高灰度进入低灰度或相反)。我们所使用的方法与二值化的方法比较的优点在于适应性更强,阈值选择更为方便且可靠性有所提高。相应的缺点是计算量相对二值化处理的方式会增

33、加。单片机对得到的原始数据的每个像素点的灰度进行分析,且进行两点之间作差的跳变点计算,确定出赛道的轮廓(即哪里是黑色,哪里是白色)。将该视场中的每一行的黑线位置等信息存入一个二维矩阵后,单片机就得到了最原始的“观察”到的赛道图像。摄像头采集到几种典型赛道的原始图像如图5.1所示。(用MATLAB显示)图 5.1 小S弯原始图像图 5.2 十字弯原始图像图 5.3 缓弯原始图像5.1.2 原始图像的矫正由于近端采用了选择性采集,图像产生了额外的畸变。这种畸变是由我们自己采集的原因造成的,因此可以很容易地矫正成原始样子。由于我们采用了120度的广角镜头,这对于赛道信息的判断会产生偏差,为了克服这种

34、误差,我们特地对摄像头进行了标定,这样对于赛道信息的判断,准确地选取前瞻量起到非常大的作用。由图5.3可以看出,原始图像反映了安装在小车上的摄像头直接看到的图像,包含了图像的畸变,因此图像上的信息不能够反应赛道的真实信息,图像上相邻两像素行间的实际距离会随着离摄像头的距离变化而变化。为了方便对摄像头采到的图像信息进行处理,我们建立了一个横向坐标变换矩阵,通过乘以这样一个矩阵中对应的元素,能够得到每一个像素列间的实际距离。图5.4-图5.6是经过矫正后的原始图像,可以看出它们都还原了真实赛道的信息。图 5.4 小S矫正后图像图 5.5 十字路矫正后图像图 5.6 缓弯校正后算法5.1.3赛道搜线

35、算法单片机在得到如上矫正后的赛道图像后,就会用搜线算法来对其进行处理,从而确定出赛道两边的黑线在哪儿,并计算出相对应的赛道中线,从而指导舵机转向和电机的加减速。搜线算法的基本思想如下:(1) 首先搜索左边线,左边线搜完之后再搜索右边线 ;(2) 由图像中心向左一定范围后开始逐点往左边搜索,具体的搜索方式是相邻点灰度值作差,当差值大于某一个阈值时,表明灰度发生了跳变,即是搜索到了黑线,将该行存入对应的存储矩阵,跳入下一行,重复步骤(2);(3) 如果连续几行都搜索到黑线后,将通过斜率预测的方法确定下一行黑线所在位置的范围,从而减少搜索的计算量。具体的方法即计算出前几行黑线所在点连成直线的斜率,从

36、而延长直线与下一行相交,得到预测到的黑线位置。该过程将一直重复,直到出现某行搜索不到黑线或者搜索到图像尽头。(4) 当某行搜索不到黑线时,将启动虚线搜索的算法,同样是通过斜率预测,但是是通过隔3行扫描一个黑线。当连续几行搜索黑线后,再次进入连续斜率预测的搜索算法(5) 十字路的处理同虚线算法一样。(6) 当左边线搜索图像底部之后,将跳入右边线的搜索。(7)搜线完毕后,再进行滤波处理,就得到了处理好的能够进行赛道分析的完整的矩阵。5.1.4赛道中心的计算得到完整的赛道信息矩阵后,即可通过一定的算法计算出赛道的中线,由PID控制算法的思想,我们正利用小车的图像中心与赛道的实际中心的偏移量来控制舵机

37、的转动和电机的驱动力度。5.1.5起跑线的检测对光管是一种检测起跑线的非常有效的设备。它的原理是,从装置的发射端发射一束红外光,再由接收端接受反射回来的光,根据返回回来的亮度高低,向单片机的I/O口输入一个对应幅值的模拟信号,通过调整对光管的安装高度,使在黑线处单片机读到高电平,反之,单片机读到低电平。因此,在算法中只需将这个高低电平检测放入中断函数中即可,检测的周期为2ms。5.2 PID 控制算法介绍在工程实际中,应用最为广泛的调节器控制规律为比例、积分、微分控制,简称PID控制,又称PID调节。PID控制器问世至今已有近70年历史,它以其结构简单、稳定性好、工作可靠、调整方便而成为工业控

38、制的主要技术之一。当被控对象的结构和参数不能完全掌握,或得不到精确的数学模型时,控制理论的其它技术难以采用时,系统控制器的结构和参数必须依靠经验和现场调试来确定,这时应用PID控制技术最为方便。即当我们不完全了解一个系统和被控对象,或不能通过有效的测量手段来获得系统参数时,最适合用PID控制技术。PID控制,实际中也有PI和PD控制。PID控制器是一种线性控制器,它根据给定值与实际输出值构成控制偏差。将偏差的比例(P)、积分(I)和微分(D)通过线性组合构成控制量,对被控对象进行控制,故称PID控制器,原理框图如图5.7所示。图 5.7 PID控制器原理框图在计算机控制系统中,使用的是数字PI

39、D控制器,控制规律为: (公式5.1) (公式5.2)式中:采样序号,k = 0,1,2; 第k次给定值;第k次实际输出值; 第k次输出控制量; 第k次偏差; 第k-1次偏差;比例系数; 积分时间常数;微分时间常数; 采样周期。简单说来,PID控制器各校正环节的作用如下:比例环节:及时成比例地反映控制系统的偏差信号,偏差一旦产生,控制器立即产生控制作用,以减少偏差。积分环节:主要用于消除静差,提高系统的无差度。积分作用的强弱取决于积分时间常数,越大,积分作用越弱,反之则越强。微分环节:能反映偏差信号的变化趋势(变化速率),并能在该偏差信号变得太大之前,在系统中引入一个有效的早期修正信号,从而加

40、快系统的动作速度,减小调节时间。数字PID控制算法通常分为位置式PID控制算法和增量式PID控制算法。5.2.1位置式PID位置式PID中,由于计算机输出的直接去控制执行机构(如阀门),的值和执行机构的位置(如阀门开度)是一一对应的,所以通常称公式(5.2)为位置式PID控制算法。位置式PID控制算法的缺点是:由于全量输出,所以每次输出均与过去的状态有关,计算时要对过去进行累加,计算机工作量大;而且因为计算机输出的对应的是执行机构的实际位置,如计算机出现故障,的大幅度变化,会引起执行机构位置的大幅度变化,这种情况往往是生产实践中不允许的,在某些场合,还可能造成严重的生产事故。因而产生了增量式P

41、ID 控制的控制算法,所谓增量式PID 是指数字控制器的输出只是控制量的增量。5.2.2增量式PID当执行机构需要的是控制量的增量(例如:驱动步进电机)时,可由式(5.2)推导出提供增量的PID控制算式。由式(5.2)可以推出式(5.3),式(5.2)减去式(5.3)可得式(5.4)。 (公式5.3) (公式5.4)式中;公式(5.4)称为增量式PID控制算法,可以看出由于一般计算机控制系统采用恒定的采样周期,一旦确定了、 、,只要使用前后三次测量值的偏差,即可由式(5.4)求出控制增量。增量式PID具有以下优点:(1) 由于计算机输出增量,所以误动作时影响小,必要时可用逻辑判断的方法关掉。(

42、2) 手动/自动切换时冲击小,便于实现无扰动切换。此外,当计算机发生故障时,由于输出通道或执行装置具有信号的锁存作用,故能保持原值。(3) 算式中不需要累加。控制增量的确定仅与最近k次的采样值有关,所以较容易通过加权处理而获得比较好的控制效果。但增量式PID也有其不足之处:积分截断效应大,有静态误差;溢出的影响大。使用时,常选择带死区、积分分离等改进PID控制算法。5.2.3 PID参数整定运用PID控制的关键是调整、三个参数,即参数整定。PID参数的整定方法有两大类:一是理论计算整定法。它主要是依据系统的数学模型,经过理论计算确定控制器参数;二是工程整定方法,它主要依赖工程经验,直接在控制系

43、统的试验中进行,且方法简单、易于掌握,在工程实际中被广泛采用。由于智能车系统本身是一个机电高度结合且相互依赖的系统,并且还需要考虑赛道具体环境带来的影响,要建立精确的智能车运动控制数学模型有一定难度,而且我们对小车的机械结构修改也会带来参数的频繁变化,故理论计算整定法的操作性不强,最终我们采用了工程整定方法。5.3转向舵机的PID控制算法对于舵机的闭环控制,我们采用了位置式PID控制算法。在参考了往届优秀技术报告中使用的舵机控制方法之后,我们在他们的基础上做出了自己改进以及完善。结合我们的路况提取算法,通过传统的PID算法对舵机进行控制,去得了令人满意的效果。5.4驱动电机的PID控制算法速度

44、控制对于小车的快速行进以及必要时候的减速起到了至关重要的作用,我们在尝试使用传统PID方法之后,发现并不能达到我们理想的速度控制需求,于是对其进行了自己的改进,加入了额外项进行修正,取得了不错的效果。 第六章 软件调试 第六章 软件调试调试工具的正确使用以及如何运用都能给整个系统的建立和优化带来好处,它是单片机和用户之间的桥梁。我们的软件程序编写任务主要在IAR Embedded Workbench IDE平台下进行的,该平台是一个非常有效的集成开发环境(IDE),它使用户充分有效地开发并管理嵌入式应用工程。作为一个开发平台,他具备较为完善的特性。嵌入式IAR Embedded Workben

45、ch 使用于大量8位、16位以及32位的微处理器和微控制器,使用户在开发新的项目时也能在所熟悉的开发环境中进行。它为用户提供一个易学和具有最大量代码继承能力的开发环境,以及对大多数和特殊目标的支持。嵌入式IAR Embedded Workbench 有效提高用户的工作效率,通过IAR工具,用户可以大大节省工作时间。6.1 IAR的在线调试图6.1即为程序开发和调试的界面。图 6.1 软件调试界面在程序的编译和运行当中,遇到的大部分问题,都能够通过IAR的在线调试中解决。例如其中 IAR C-SPY Debugger 允许用户查看在源代码中查看变量或表达式,使用户可以在运行程序时跟踪其值的变化,

46、并且查看变量的方式有许多种,我们使用Live watch功能,在小车实时运行中观察变量的变化,进而分析程序执行情况。6.2本章小结本章主要介绍了,本系统主要的调试方法以及使用的调试工具,其实,在这方面我们组做的工作远不止上面所介绍的一些,还包括了很多调试和上位机上的尝试,在刚刚入门时,这些调试的方法对技术的提高很有帮助,而当对系统驾轻就熟之后,在调试上所花的时间也越来越少了。但无论怎样,如果没有调试工具,很难让小车跑得好,跑得快,如果没有良好的辅助调试的方法,就不能更加高效地调试小车。本小组的水平有限,所用的调试方案仍然不是很好,希望借此抛砖引玉,发现更优的调试方案。 第七章 结论 第七章 结

47、论7.1 模型车整体制作情况及技术参数本系统以飞思卡尔单片机K40作为核心控制单元,以数字摄像头OV7725采集路况信息,以光电编码器对小车速度进行实时采集,完成智能车工程制作及调试,自主智能识别赛道,自动地驱动动力系统和转向系统完成智能控制。整个设计主要分为车体机械结构设计和软/硬件系统设计。车体机械结构设计主要包括编码器和图像传感器的安装、车身底盘的固定、舵机和转向轮调节等;硬件系统设计完成了电源管理模块、电机驱动模块、舵机控制模块、速度测量模块、辅助调试模块、图像采集处理模块等,且我们在硬件还做了创新,将单片机及外围电路直接焊接在主板上,从而去掉了单片机模块;软件系统设计完成了各功能模块

48、的算法及程序设计,包括图像采集算法设计、赛道搜线算法设计以及舵机和电机的PID算法设计。所设计的系统经过测试,赛车能够快速安全行驶。经过了赛区赛的检验之后,我们也对自己的小车更加有信心。模型车的主要技术参数如下表:表7.1 系统整体参数项目参数路径检测方法(赛题组)摄像头组车模几何尺寸(长、宽、高)(毫米)250mm/170mm/400mm车模轴距/轮距(毫米)200mm/140mm电路电容总量(微法)2000F车模平均电流(匀速行驶)(毫安)2100mA传感器种类及个数摄像头1 光电编码器1对光管ST1884新增加伺服电机个数 0摄像头检测精度、频率精度 640480 检测频率 30 Hz对

49、光管检测精度、频率有效距离 4-13mm检测频率 500 Hz主要集成电路种类/数量TPS73502 OV76201 TPS73331 MOS8车模重量(带有电池)(kg)1.583 kg7.2 存在的问题及解决方案 (1)硬件方面 :摄像头车的硬件不是非常复杂,主要是电源部分和驱动模块。在电源模块的制作中,我们首先使用的是AMS1117系列电源稳压芯片,给摄像头、单片机、舵机等供电。刚开始使用时还比较顺畅,可用到后面,我们发现电池电压在7.6V以下就无法正常工作了。查其原因,就是1117系列电源芯片稳压差过高,在2V以上。而我们给舵机供电电压为5.5V,故其芯片供电电压就需要在7.5V以上,

50、这极大地缩短了电池使用时间。所以,我们后面更换稳压芯片为TPS73XX系列,压差在0.35V都可正常工作,电池电压在6.8V时,小车也能正常行驶,极大地提高了电池作用时间。对于驱动模块,由于我们的控制算法非常激烈,加速和刹车非常灵敏,而单纯使用两片MOS芯片组成的全桥电路发热严重,甚至出现跑几米就停车的现象。所以,为增强驱动能力,我们采用四片MOS,两两并联,非常完美地解决发热过大问题,小车连续跑10圈都不会因芯片发热而停车。(2)软件方面: 我们发现,在硬件条件稳定的情况下,算法的改进最能够提高小车的速度,搜线算法的完善性,速度与方向控制的策略的优劣将直接影响小车的运行情况。另外值得一说的是

51、,控制算法的好坏并不是完全与算法的复杂度成正相关的。在前期我们尝试了对赛道进行分类识别的算法,但是实际效果并没有想象中的好。而且采用赛道类型分类的方式对算法的适应性提出了极大地挑战。于是中后期我们放弃了赛道类型识别,改为对任意的赛道进行完全相同的分析处理方式,结果取得了出乎意料的提高。小车对赛道的适应性得到了空前的提高。(3)机械方面:对小车稳定性的影响问题。一开始对于机械问题不是很重视,所有的机械都是手工搭建的,没有考虑太多的机械上的改进方法,制造的比较粗糙。前期我们对轮胎与赛道的摩擦力极为头疼,使用的轮胎没有带皮套,也没有对赛道进行很好的清理,发现各种打滑,甚至当时认为2m/s已经是小车的

52、极限速度了。后来在发现了带上皮套可以大幅提高摩擦力,直接调节车速后,发现依旧跑得不错,车速有了一次极大提升。机械与软件是相辅相成的,随着算法的改进,车速的提高,开始进入瓶颈,发现算法上的修改都不足以试车速有所提高了。最后只能从机械结构入手,考虑将整车的重心放低,使小车更平衡。改造的效果较为显著。一个良好的系统仍然需要不断完善和更新,为了保证车子能够稳定达到最高平均速度,智能车系统的设计还是在不断的改进的过程。但是限于水平有限,我们的小车仍然有很多需要改进的地方。 7.3 心得体会 自报名参加飞思卡尔智能车以来,到现在披荆斩棘将赴国赛之役已经十月有余,从最初的一窍不通到现在可以拍拍胸脯自信地说,

53、我们可以,经历了太多的酸甜苦辣,第一次调通电路的喜悦,第一次看见车轮转起来的喜悦,第一次跑上两米六,第一次以全校第一名的成绩从校内赛中脱颖而出,第一次上三米,这些刻骨铭心的瞬间都是我们队小车的热爱和奋斗的积淀。技术上的问题都在前面已经提到,只想与大家分享内心的感受:首先,投入心血认真地去做一件事情是很快乐的,特别是当你看着这件事一天天的变好,一天天的朝着你预想的方向发展时,你会觉得一切的努力都是值得的。就像小车一样,它是我们心血的结晶,我们会从它身上看到我们奋斗的影子,因此,我们对小车是有很深刻的感情。团队合作让我们懂得了一个小团队是如何运行和协作工作,更重要的是收获了一份珍贵的友谊。长达十个

54、月的努力让我们深刻地理解了什么是理论与实践结合,什么是科研。我们既要保证自己的思想足够天马行空,也要保证每一个想法最终都能够落到实处。比赛的残酷同样不得不让我们感慨,看到同实验室的兄弟姐妹们相继在赛区赛止步,我们难以抑制眼泪。同样的付出了心血和汗水,却注定了总有人会出局。没有热情、没有付出努力所得到的失败,大家觉得是自然而然的。但是,看得见的热情和看得见的努力却收获失败就让人叹惋,是细节,还是运气?人生也是这样吧?现在将赴最后的战役的我们,调整好心态,珍惜最后的与小车相处的日子,最后为它擦拭车轮,最后为它充满电池。虽然结果很重要,但是我们不看重结果,也许我们收获不到想要的结果,但是过程却只属于

55、我们自己。在做小车的日子里,我们所收获的知识和心路历程将一直陪伴着我们。 参考文献1卓晴,黄开胜,邵贝贝等编.学做智能车挑战“飞思卡尔”杯.北京:北京航空航天大学出版社,2007.2单伟,王亚飞,戴英华.第七届全国大学生“飞思卡尔”杯智能汽车竞赛安徽工业大学 D-I 队技术报告R.安徽:安徽工业大学,2012.3刘珂屹,舒伯特,徐国强.第七届全国大学生“飞思卡尔”杯智能汽车竞赛北京科技大学 摄像头一 队技术报告R.北京:北京科技大学,2012. 4李栋,金福彪,蒋亚楠.第七届全国大学生“飞思卡尔”杯智能汽车竞赛常熟理工学院 闪电六队 技术报告R.常熟:常熟理工学院,2012. 5杨永,模糊自适

56、应PID控制及其在智能车的应用J.广东技术师范学院学报,2011,(1): 29 32.6沈红卫.基于单片机的智能系统设计与实现M.北京:电子工业出版社,2005. 7王名发,江智军,郭鹏, 基于OV7620摄像头智能车道路信息视频采集及处理研究, 南昌:南昌大学. 8 http:/ 附录主函数#include common.h#include HAL_GPIO.h#include HAL_FTM.h#include HAL_LPTMR.h#include HAL_PIT.h#include camera.h#include search.h#include analyse.h#include

57、 servo.h#include motor.h#include system.hunsigned char process_finish;unsigned char speed_pit_lock;unsigned char L_line_1, L_line_2, R_line_1, R_line_2;unsigned char start_line_lock;int start_line_delay_time;int error_cnt;/*_| 名称:speed_pit_isr | 作用:电机控制定时中断 |_*/ void speed_pit_isr() speed_pit_lock =

58、 1; if(LPLD_GPIO_Get_b(PTC_BASE_PTR, 16) L_line_1 = 1; if(LPLD_GPIO_Get_b(PTC_BASE_PTR, 17) L_line_2 = 1; if(LPLD_GPIO_Get_b(PTC_BASE_PTR, 18) R_line_1 = 1; if(LPLD_GPIO_Get_b(PTC_BASE_PTR, 19) R_line_2 = 1;/*_| 名称:main | 作用:主函数 |_*/ void main (void)start: DisableInterrupts; /变量初始化 char row_begin, r

59、ow_end; int servo_error; int speed_error; unsigned char ramp_state = RAMP_NO; /赛道类型初始化 /舵机端口初始化 LPLD_FTM1_PWM_Init(300); LPLD_FTM1_PWM_Open(0, servo_middle); /电机端口初始化 LPLD_FTM0_PWM_Init(12000); LPLD_FTM0_PWM_Open(1, 0); /电机使能端初始化 LPLD_GPIO_Init(PORTC_BASE_PTR,1,1,1,1); LPLD_GPIO_Set_b(PTC_BASE_PTR,

60、1, 0); /编码器脉冲累加初始化 LPLD_LPTMR_Init(1,0,2,0,0); Display_Init(); /摄像头初始化 Camera_Init(); /初始化定时器0,周期2ms,中断函数为speed_pit_isr LPLD_PIT_Init(0, 2000, speed_pit_isr); car_state = CAR_RUN; L_line_1 = 0; L_line_2 = 0; R_line_1 = 0; R_line_2 = 0; start_line_lock = 1; start_line_delay_time = 0; stop_delay_flag

61、= 0; while(1) if(field_finish = 1) field_finish = 0; start_line_delay_time +; if(start_line_delay_time start_line_delay) start_line_lock = 0; if(!start_line_lock & car_state = CAR_RUN & (L_line_1 | L_line_2) & (R_line_1 | R_line_2) car_state = CAR_BRAKE; L_line_1 = 0; L_line_2 = 0; R_line_1 = 0; R_l

62、ine_2 = 0; if(search(&row_begin, &row_end) error_calc(row_begin, row_end, &servo_error, &speed_error, ramp_state); servo(servo_error); ramp_handle(row_begin, row_end, &ramp_state); switch(ramp_state) case RAMP_NO : indicator_set(LOFF);break; case RAMP_UP : indicator_set(NAVY);break; case RAMP_DN : i

63、ndicator_set(PINK);break; case RAMP_WT : indicator_set(LOFF);break; error_cnt = 0; else error_cnt+; if(car_state = CAR_RUN & error_cnt 15) car_state = CAR_BRAKE; if(car_state = CAR_STOP) if(!LPLD_GPIO_Get_b(PTA_BASE_PTR, 24) goto start; process_finish = 1; if(speed_pit_lock = 1) speed_pit_lock = 0;

64、if(process_finish = 1) process_finish = 0; /编码器脉冲累加初始化 LPLD_LPTMR_Init(1,0,2,0,0); else motor(speed_error, ramp_state); 摄像头采集子程序#include common.h#include HAL_GPIO.h#include HAL_eDMA.h#include image.h/摄像头寄存器设置对应引脚定义:SCL - PortA11SDA - PortA12#define CAMERA_SCL_OUT LPLD_GPIO_Init(PORTA_BASE_PTR,11,1,1

65、,1) /SCL-PA11设置为输出端口#define CAMERA_SDA_OUT LPLD_GPIO_Init(PORTA_BASE_PTR,12,1,1,1) /SDA-PA12设置为输出端口#define CAMERA_SDA_IN LPLD_GPIO_Init(PORTA_BASE_PTR,12,0,1,1) /SDA-PA12设置为输入端口#define CAMERA_SCL_HIGH LPLD_GPIO_Set_b(PTA_BASE_PTR, 11, 1)#define CAMERA_SCL_LOW LPLD_GPIO_Set_b(PTA_BASE_PTR, 11, 0)#def

66、ine CAMERA_SDA_HIGH LPLD_GPIO_Set_b(PTA_BASE_PTR, 12, 1)#define CAMERA_SDA_LOW LPLD_GPIO_Set_b(PTA_BASE_PTR, 12, 0)#define CAMERA_SDA_DATA LPLD_GPIO_Get_b(PTA_BASE_PTR, 12)uint8_t camera_sendByte(uint8_t data);void camera_init(void); /初始化SCCB端口为GPIOvoid camera_wait(void); /SCCB时序延时void camera_start(

67、void); /起始标志void camera_stop(void); /停止标志void camera_regWrite(uint8_t device,uint8_t address,uint8_t data);void portb_isr(void); void camera_gpio_init(void);void camera_dma_isr(void); LPLD_eDMA_Cfg_t User_Def_DMA_Init; /声明DMA初始化结构体unsigned char field_over; /场采集完成标志unsigned char rows_break_cnt; /行中断计

68、数unsigned char rows_select_cnt; /行选择计数unsigned char field_finish; /单幅图像采集完成标记/*_| 名称:wait | 作用:延时函数 |_*/ void camera_wait(void) int i; for( i=0; i 300; i+) asm (nop); /*_| 名称:start | 作用:开始信号 |_*/ void camera_start(void) CAMERA_SCL_OUT; CAMERA_SDA_OUT; CAMERA_SDA_HIGH; camera_wait(); CAMERA_SCL_HIGH;

69、 camera_wait(); CAMERA_SDA_LOW; camera_wait(); CAMERA_SCL_LOW;/*_| 名称:stop | 作用:停止信号 |_*/ void camera_stop(void) CAMERA_SCL_OUT; CAMERA_SDA_OUT; CAMERA_SDA_LOW; camera_wait(); CAMERA_SCL_HIGH; camera_wait(); CAMERA_SDA_HIGH; camera_wait();/*_| 名称:sendByte | 作用:字节写入 |_*/ uint8_t camera_sendByte(uint8

70、_t data) uint8_t i; uint8_t ack; CAMERA_SDA_OUT; for( i=0; i8; i+) if(data & 0x80) CAMERA_SDA_HIGH; else CAMERA_SDA_LOW; data = 1; camera_wait(); CAMERA_SCL_HIGH; camera_wait(); CAMERA_SCL_LOW; camera_wait(); CAMERA_SDA_HIGH; CAMERA_SDA_IN; camera_wait(); CAMERA_SCL_HIGH; camera_wait(); ack = CAMERA

71、_SDA_DATA; CAMERA_SCL_LOW; camera_wait(); return ack;/*_| 名称:regWrite | 作用:在指定设备的指定地址中写入指定数据 |_*/ void camera_regWrite(uint8_t device,uint8_t address,uint8_t data) uint8_t i; uint8_t ack; for( i=0; i 50) LPLD_GPIO_Set_b(PTC_BASE_PTR, 1, 1); /电机翻转使能 LPLD_FTM0_PWM_ChangeDuty(1, 4000); else if(stop_del

72、ay_flag = 0) stop_delay_flag = 1; else if(stop_delay_flag = 1) stop_delay_cnt-; if(stop_delay_cnt 0) LPLD_GPIO_Set_b(PTC_BASE_PTR, 1, 1); /电机翻转使能 LPLD_FTM0_PWM_ChangeDuty(1, 4000); else LPLD_GPIO_Set_b(PTC_BASE_PTR, 1, 0); LPLD_FTM0_PWM_ChangeDuty(1, 0); car_state = CAR_STOP; LCD_CLS(); LCD_P6x8Str(

73、0,3,Motor Stop); LPLD_GPIO_Init(PORTA_BASE_PTR, 24, 0, 1, 1); return; void car_stop() LPLD_GPIO_Set_b(PTC_BASE_PTR, 1, 0); LPLD_FTM0_PWM_ChangeDuty(1, 0); return;/*_| 名称:motor | 作用:电机控制 |_*/ void motor(int speed_error, unsigned char ramp_state) static int config_speed; static int current_speed; stat

74、ic float motor_deviation2 = 0; /电机偏差记录 static float motor_difference2 =0; /电机偏差的差分记录 static int motor_PWM = 6000; /电机初始PWM值 static unsigned char config_speed_record2; /编码器脉冲数目获取 current_speed = (int)(LPLD_LPTMR_GetPulseAcc() * motor_spe_ratio); LPLD_LPTMR_Init(1,0,2,0,0); if(car_state = CAR_STOP) ca

75、r_stop(); return; if(car_state = CAR_BRAKE) car_brake(current_speed); return; if(speed_error 90) speed_error = 90; if(speed_error 70) config_speed = L_speed; else config_speed = M_speed - speed_error; if(ramp_state = 3) config_speed -= ramp_speed_dec; /给定速度更新 config_speed_record1 = config_speed_reco

76、rd0; config_speed_record0 = config_speed; /偏差值更新 motor_deviation1 = motor_deviation0; motor_deviation0 = config_speed - current_speed; /偏差的差分更新 motor_difference1 = motor_difference0; motor_difference0 = motor_deviation0 - motor_deviation1; /修正版 motor_PWM += motor_PID_ratio *( spe * (config_speed_rec

77、ord0 - config_speed_record1) + motor_P * motor_difference0 + motor_I * motor_deviation0 + motor_D * (motor_difference0 - motor_difference1); /超界修正 if(motor_PWM = 0) LPLD_GPIO_Set_b(PTC_BASE_PTR, 1, 0); /电机正转使能 if(motor_PWM 10000) motor_PWM = 10000; LPLD_FTM0_PWM_ChangeDuty(1, motor_PWM); else LPLD_G

78、PIO_Set_b(PTC_BASE_PTR, 1, 1); /电机翻转使能 if(motor_PWM SERVO_MAX_R) servo_PWM = SERVO_MAX_R; if(servo_PWM 7) return; LPLD_GPIO_Set_b(PTA_BASE_PTR, 5, color_codecolor0); LPLD_GPIO_Set_b(PTA_BASE_PTR, 6, color_codecolor1); LPLD_GPIO_Set_b(PTA_BASE_PTR, 7, color_codecolor2);/*_| 名称:porta_isr | 作用:键盘中断 |_*

79、/ void porta_isr() /判断是否为取消键 if(PORTA_ISFR = 0x1000000) button = ESC; button_lock = 1; LCD_DLY_ms(1000); /判断是否为左按键 else if(PORTA_ISFR = 0x2000000) button = LT; button_lock = 1; LCD_DLY_ms(1000); /判断是否为确认按键 else if(PORTA_ISFR = 0x4000000) button = OK; button_lock = 1; LCD_DLY_ms(1000); /判断是否为下按键 else

80、 if(PORTA_ISFR = 0x8000000) button = DN; button_lock = 1; LCD_DLY_ms(1000); /判断是否为上按键 else if(PORTA_ISFR = 0x10000000) button = UP; button_lock = 1; LCD_DLY_ms(2000); /判断是否为右按键 else if(PORTA_ISFR = 0x20000000) button = RT; button_lock = 1; LCD_DLY_ms(2000); void Display_Init(void) Indicator_Init();

81、indicator_set(GREEN); LCD_Init(); LCD_P6x8Str(0,5,Red Rabbit); DisableInterrupts; /拨码开关初始化 LPLD_GPIO_Init(PORTA_BASE_PTR, 13, 0, 1, 1); LPLD_GPIO_Init(PORTA_BASE_PTR, 14, 0, 1, 1); LPLD_GPIO_Init(PORTA_BASE_PTR, 15, 0, 1, 1); LPLD_GPIO_Init(PORTA_BASE_PTR, 16, 0, 1, 1); /按键初始化 LPLD_GPIO_Init(PORTA_B

82、ASE_PTR,24,0,2,0xA); LPLD_GPIO_Init(PORTA_BASE_PTR,25,0,2,0xA); LPLD_GPIO_Init(PORTA_BASE_PTR,26,0,2,0xA); LPLD_GPIO_Init(PORTA_BASE_PTR,27,0,2,0xA); LPLD_GPIO_Init(PORTA_BASE_PTR,28,0,2,0xA); LPLD_GPIO_Init(PORTA_BASE_PTR,29,0,2,0xA); LPLD_GPIO_SetIsr(PORTA_BASE_PTR, porta_isr); /对光管初始化 LPLD_GPIO_I

83、nit(PORTC_BASE_PTR, 16, 0, 2, 1); LPLD_GPIO_Init(PORTC_BASE_PTR, 17, 0, 2, 1); LPLD_GPIO_Init(PORTC_BASE_PTR, 18, 0, 2, 1); LPLD_GPIO_Init(PORTC_BASE_PTR, 19, 0, 2, 1); static unsigned char L_line_1, L_line_2, R_line_1, R_line_2, L_line, R_line; static unsigned char gears = 2; EnableInterrupts; enab

84、le_irq (87);/等待按键/* LCD_CLS(); while(1) if (SWITCH_1 = SWITCH_ON) LCD_P6x8Str(0,0,1 ON ); else LCD_P6x8Str(0,0,1 OFF); if (SWITCH_2 = SWITCH_ON) LCD_P6x8Str(0,1,2 ON ); else LCD_P6x8Str(0,1,2 OFF); if (SWITCH_3 = SWITCH_ON) LCD_P6x8Str(0,2,3 ON ); else LCD_P6x8Str(0,2,3 OFF); if (SWITCH_4 = SWITCH_O

85、N) LCD_P6x8Str(0,3,4 ON ); else LCD_P6x8Str(0,3,4 OFF); */ while(1) if(button_lock = 1) button_lock = 0; break; /拨码开关1:对光管测试、舵机中值矫正、黑白阈值调整,默认不开启switch1: if(SWITCH_1 = SWITCH_OFF) goto switch2; LCD_CLS(); while(1) L_line_1 = LPLD_GPIO_Get_b(PTC_BASE_PTR, 16); L_line_2 = LPLD_GPIO_Get_b(PTC_BASE_PTR,

86、17); R_line_1 = LPLD_GPIO_Get_b(PTC_BASE_PTR, 18); R_line_2 = LPLD_GPIO_Get_b(PTC_BASE_PTR, 19); L_line = L_line_1 | L_line_2; R_line = R_line_1 | R_line_2; if(L_line_1) LCD_P6x8Str(3, 3,BK); else LCD_P6x8Str(3, 3,WE); if(L_line_2) LCD_P6x8Str(30,3,BK); else LCD_P6x8Str(30,3,WE); if(R_line_1) LCD_P6

87、x8Str(70, 3,BK); else LCD_P6x8Str(70, 3,WE); if(R_line_2) LCD_P6x8Str(100,3,BK); else LCD_P6x8Str(100,3,WE); if(L_line) LCD_P6x8Str(3,4, L_Black); else LCD_P6x8Str(3,4, L_White); if(R_line) LCD_P6x8Str(60,4,R_Black); else LCD_P6x8Str(60,4,R_White); if(L_line & R_line) LCD_P6x8Str(3,6,Find) ; else LC

88、D_P6x8Str(3,6,No!) ; if(button_lock = 1) button_lock = 0; break; LCD_CLS(); LCD_P6x8Str(0,3,servo middle:); LCD_PrintValueI(0,5, servo_middle); while(1) if(SWITCH_1 = SWITCH_OFF) break; if(button_lock = 1) button_lock = 0; if(button = OK) break; switch(button) case UP: servo_middle += 25; break; cas

89、e DN: servo_middle -= 25; break; case RT: servo_middle += 5 ; break; case LT: servo_middle -= 5 ; break; if(servo_middle 10000) servo_middle = 10000; if(servo_middle 80) differential_threshold = 80; if(differential_threshold 100) ramp_speed_dec = 100; if(ramp_speed_dec 0) ramp_speed_dec = 0; LCD_Pri

90、ntValueC(70,4, ramp_speed_dec); if(ramp_detect = 0) goto switch2; LCD_DLY_ms(500); if(ramp_detect = 1) LCD_CLS(); LCD_P6x8Str(0, 3,up_time:); LCD_PrintValueC(0,4, ramp_up_time); LCD_P6x8Str(0, 5,dn_time:); LCD_PrintValueC(0,6, ramp_dn_time); while(1) if(button_lock = 1) button_lock = 0; if(button =

91、OK) break; if(button = ESC) goto switch1; if(ramp_detect = 1) switch(button) case UP: ramp_up_time += 2; break; case DN: ramp_up_time -= 2; break; case RT: ramp_dn_time += 2 ; break; case LT: ramp_dn_time -= 2 ; break; if(ramp_up_time 10) ramp_up_time = 10; if(ramp_dn_time 100 * 60) start_line_delay

92、 = 100 * 60; if(start_line_delay 3) gears = 3; if(gears 40) basic_control_row = 40; if(basic_control_row 5) basic_control_row = 5; LCD_PrintValueC(0,5, basic_control_row); LCD_DLY_ms(500); /基准速度测试label_2: LCD_CLS(); LCD_P6x8Str(0, 3,motor_spe:); LCD_P6x8Str(0, 5,motor_PID:); LCD_PrintValueF(50, 3, m

93、otor_spe_ratio, 4); LCD_PrintValueF(50, 5, motor_PID_ratio, 4); while(1) if(button_lock = 1) button_lock = 0; if(button = OK) break; if(button = ESC) goto label_1; switch(button) case UP: motor_spe_ratio += 0.1; break; case DN: motor_spe_ratio -= 0.1; break; case RT: motor_PID_ratio += 0.1; break; c

94、ase LT: motor_PID_ratio -= 0.1; break; LCD_PrintValueF(50, 3, motor_spe_ratio, 3); LCD_PrintValueF(50, 5, motor_PID_ratio, 3); LCD_DLY_ms(500); /P参数调节label_3: LCD_CLS(); LCD_P6x8Str(0,3,servo_P:); LCD_P6x8Str(0,5,servo_D:); LCD_PrintValueF(50,3, servo_P,4); LCD_PrintValueF(50,5, servo_D,4); while(1)

95、 if(button_lock = 1) button_lock = 0; if(button = OK) break; if(button = ESC) goto label_2; switch(button) case UP: servo_P += 0.0005; break; case DN: servo_P -= 0.0005; break; case RT: servo_D += 0.0005; break; case LT: servo_D -= 0.0005; break; LCD_PrintValueF(50,3, servo_P,4); LCD_PrintValueF(50,

96、5, servo_D,4); LCD_DLY_ms(500); label_4: LCD_CLS(); LCD_P6x8Str(0,3,error_ratio:); LCD_PrintValueF(0,5, error_ratio,3); while(1) if(button_lock = 1) button_lock = 0; if(button = OK) break; if(button = ESC) goto label_3; switch(button) case UP: error_ratio += 0.1; break; case DN: error_ratio -= 0.1;

97、break; case RT: error_ratio += 0.05; break; case LT: error_ratio -= 0.05; break; LCD_PrintValueF(0,5, error_ratio,3); LCD_DLY_ms(500); /H_speed及M_speed调节 LCD_CLS(); LCD_P6x8Str(0,3,H_speed:); LCD_P6x8Str(0,5,M_speed:); LCD_PrintValueI(50,3, H_speed); LCD_PrintValueI(50,5, M_speed); while(1) if(butto

98、n_lock = 1) button_lock = 0; if(button = OK) break; if(button = ESC) goto label_4; switch(button) case UP: H_speed += 2; break; case DN: H_speed -= 2; break; case RT: M_speed += 2; break; case LT: M_speed -= 2; break; LCD_PrintValueI(50,3, H_speed); LCD_PrintValueI(50,5, M_speed); LCD_DLY_ms(500); while(1) if(button_lock = 1) button_lock = 0; if(button = OK) break; LCD_CLS(); LCD_P6x8Str(0,6,RUN); disable_irq (87); LCD_DLY_ms(10000); DisableInterrupts; indicator_set(LOFF);XXXI

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 商业/管理/HR > 管理学资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号