为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

第三届智能车大赛军交一队技术报告

2020-03-06 50页 doc 110KB 5阅读

用户头像

is_594905

暂无简介

举报
第三届智能车大赛军交一队技术报告第三届“飞思卡尔”杯全国大学生 智能汽车邀请赛 技 术 报 告 学    校:军事交通学院 队伍名称:军交一队 参赛队员:王  肖 刘俊杰 带队教师:徐友春 万  剑 关于技术报告和研究论文使用授权的说明 本人完全了解第三届“飞思卡尔”杯全国大学生智能汽车邀请赛关保留、使用技术报告和研究论文的规定,即:参赛作品著作权归参赛者本人,比赛组委会和飞思卡尔半导体公司可以在相关主页上收录并公开参赛作品的设计方案、技术报告以及参赛模型车的视频、图像资料,并将相关内容编纂收录在组委会出版论文集中。 参赛队员签名:王      肖 刘 ...
第三届智能车大赛军交一队技术报告
第三届“飞思卡尔”杯全国大学生 智能汽车邀请赛 技 术 报 告 学    校:军事交通学院 队伍名称:军交一队 参赛队员:王  肖 刘俊杰 带队教师:徐友春 万  剑 关于技术报告和研究使用授权的说明 本人完全了解第三届“飞思卡尔”杯全国大学生智能汽车邀请赛关保留、使用技术报告和研究论文的规定,即:参赛作品著作权归参赛者本人,比赛组委会和飞思卡尔半导体公司可以在相关主页上收录并公开参赛作品的设计、技术报告以及参赛模型车的视频、图像资料,并将相关编纂收录在组委会出版论文集中。 参赛队员签名:王      肖 刘  俊  杰 带队教师签名:徐 友  春 万    剑 日        期:8月 10 日 摘要:本设计是在以MC9S12DG128为主控芯片的基础上完成的,包括自制的系统板部分、数字CCD摄像机部分、车速传感器部分、加速度传感器部分、驱动电机及转向舵机控制部分;本车采用数字CCD传感器寻迹,以脉宽调制控制方式(PWM)控制电机和舵机。软件是在CodeWarrior 3.1的基础上用C 语言编写的,车辆纵向控制采用数字增量式PID控制算法,横向控制采用拟人控制算法。本设计研制的智能车模型能够准确迅速地识别特定的跑道,并沿着引导线以较高的速度稳定行驶。 关键字:MC9S12DG128,智能车,数字CCD摄像机 目  录 第一章:模型车设计制作主要思路以及实现的技术方案概要说明;    1 1.1设计制作思路    1 1.2设计方案概述    1 1.3设计方案小结    1 第二章:模型车机械设计说明;    3 2.1车模组装与调整    3 2.2摄像头支架设计与安装    3 2.3速度传感器支架设计与安装    4 第三章:控制电路设计说明;    5 3.1模块划分    5 3.2模块电路设计    5 第四章:控制软件设计说明;    9 4.1控制算法设计    9 4.2仿真软件设计    11 第五章 开发工具、制作调试过程说明及结论与展望    15 5.1结论    15 5.2展望    15 附  录    17 附录A:模型车的主要技术参数说明    17 附录B:程序代码    17 第一章:模型车设计制作主要思路及实现的技术方案概要说明; 1.1设计制作思路 为了用单片机系统实现小车智能控制,本设计以MC9S12DG128CPV为核心,附以外围电路,将摄像头传感器得到的图像信息进行综合判别和处理,并通过速度传感器获得当前车辆速度,然后发出指令给电机驱动器(包括舵机和驱动电机),控制小车,从而使小车能够快速、准确地识别特定路线行驶。快速准确的图像分析处理、准确的实时速度控制、CPU的综合数据处理为小汽车实现自动加速、减速、限速、左转、右转提供了充分的保证。通过组装车模、传感器的选择与布置、系统电路板的设计与安装、仿真软件的制作、安装与调试以及控制算法的调试等等,首先使智能车运行起来,由低速逐渐向高速过渡。在实验的基础上不断发现问题,不断调试,不断解决问题,使智能车能够最大限度的沿着轨道快速、准确的行驶。 1.2设计方案概述 本设计方案中的传感器拟采用CCD摄像头传感器和速度传感器,通过摄像头采集图像获得赛道信息,通过速度传感器获得速度信息。通过市场调研,采用CCD传感器作为主要的采集赛道图像的传感器,采用电子编码器作为速度传感器。选定传感器之后,需要对车模的机械性能加以改造,通过对舵机位置的改变,底盘高度的修定,前轮参数的调整,后轮轮距的修定等一系列,提高车模的行驶稳定性和转弯能力,有效的提高行驶速度。摄像头的安装位置也需要经过仔细分析才能够使摄像头采集的图像符合要求。在车模机械性能与摄像头安装位置改造完毕之后,开始进行车辆的软件设计,包括仿真软件设计和控制软件设计。控制软件设计中通过CCD传感器的硬件驱动程序,在单片机中设计采集图像的线程,完成实时图像的采集,然后通过图像分析算法获得车辆与赛道的相对位置,控制车辆转向。通过对速度传感器传输的脉冲信号记录,获得当前的速度值,然后通过与转向信息的综合,通过速度控制算法控制车模行驶速度。仿真软件设计主要包括软件界面设计,图像显示与处理设计,数据记录与分析设计,赛道实时显示设计等。 1.3设计方案小结 本设计方案包含了机械设计,电路设计,单片机软件设计以及PC机软件设计四个方面,具有较高的设计难度。通过对以上四个方面的分析与设计,进行优化匹配,尽可能地达到最优。将能够从整体上提高车模行驶的稳定性与快速性,有效的降低车模冲出赛道的可能性以及周围环境对车模的干扰,实现车模的精确控制与快速行驶的目的。在特殊的赛道里还能达到漂移的效果。 第二章:模型车机械设计说明; 2.1车模组装与调整 严格按照说明对车模进行正确组装,针对新车模底盘较高,底盘不是平板的特点,在适当的位置添加垫片,尽量降低车模重心,提高车模稳定性。当车模高速行驶时,前轮的定位参数对车模直线行驶的稳定性有着至关重要的作用,而当车模进入弯道时,转向稍微大点,来自赛道的侧向阻力又会使转向轮无法顺畅的转动,调整好前轮的主销内倾角和前轮前束,将会大大提高车模直线行驶的稳定性和转向灵敏度。为了增加转向的灵敏度,还将舵机架高(如图2.1所示),增加了转向臂的长度,将转向臂与舵机刚性连接,减少了转向余量与延迟。舵机调整还要注意的是准确地调整左右转向杆的长度,把前轮调正。 2.2摄像头支架设计与安装 如图2.2所示,摄像头的安装高度h以及摄像头的俯仰角γ0决定了摄像头的照射距离和照射范围,通过实验测得的数据,将摄像头的支架高度设置为30cm左右,并根据实验需要调节摄像头的俯仰角,以此获得合适的图像范围。由于车模底盘的空间限制,将摄像头支架安装与车模前部舵机之后,使摄像头可以获得较好的视场。 2.3速度传感器支架设计与安装 速度传感器安装于车模后部,可以从电机的驱动齿轮上安装取速齿轮,也可以从后轴的大齿轮上安装取速齿轮,通过取速齿轮带动电子编码器,当车轮转动时取速齿轮随之转动,电子编码器随之向单片机输出脉冲信号,从而获得车模的速度。如图2.3所示,速度转感器的安装与固定要考虑到信号的准确性和稳定性。 第三章:控制电路设计说明; 3.1模块划分 本设计的硬件设计主要分以下九部分:最小系统板、电源模块、摄像头模块、速度传感器模块、转向舵机控制模块、直流电机驱动模块、无线数传模块。系统硬件原理图如图3.1所示。 3.2模块电路设计 本设计自制了单片机最小系统板,主要包括以下几部分:时钟电路、复位电路、串口RS-232驱动电路等(如图3.2所示)。 本设计的电源模块具有5V供电和3.3V供电两种输出电压,两种稳压的电路图如图3.3所示。 本设计的摄像头采用OV6650型号,该摄像头能够提供清晰的图像,同时也能够满足采集速度的要求,摄像头硬件电路设计如图3.4所示。 本设计的舵机采用PWM脉冲控制,通过调整脉冲的占空比实现舵机的左转和右转,如图3.5所示。 MC9S12DG128具有8路8位PWM通道(即4路16位PWM通道),并且用PWM模块产生方波并不占用CPU资源。为了获得尽量高的转向速度,本设计用电池直接给舵机供电。为了获得较高的转向精度,用1路16 位PWM(PWM67)控制舵机旋转,将前轮从左极限位置旋转到右极限位置所需的舵机转角分成数百份,即获得数百个转向级别,足以满足设计需要。 本设计用H桥芯片MC33886驱动直流电机。由于电机启动和快速加速时所需电流较大,采用两片MC33886并联工作。MC33886的D2和D1脚直接接地和接高电平,使MC33886按预设方式工作,用PWM5和PWM0作为输入信号,OUT2和OUT1分别为功率放大了的相应的输出信号,控制电机转动。通过调整PWM5和PWM0的占空比,实现车模的加速、减速,甚至制动(电机反转实现制动)。MC33886驱动电路图如图3.6所示。 本设计中的各个硬件模块的设计为车模的行驶稳定性和快速性提供了坚实的基础,各个功能模块的调试与功能实现都符合大赛相关规定。 第四章:控制软件设计说明; 4.1控制算法设计 本智能车辆的控制算法部分主要需解决如下问题:车辆直线行驶的稳定性问题,车辆转弯控制问题,车辆行驶速度与转向角度大小的相关性问题,行驶轨迹的跟踪及预测问题等。为了更好的解决设计中存在的问题,本方案采用了目前自动控制领域中最常用的控制算法PID控制算法进行车辆进行控制。 PID控制算法包括直接计算法和增量算法,所谓的增量算法就是相对于的相邻两次运算之差,得到的结果是增量。也就是说在上一次的控制量的基础上需要增加(负值意味着减少)控制量,例如对于智能小车控制算法,就是智能小车相对于上一次转向角度还需要增加或减少的转向角度。在本方案的设计中采用了PID直接计算法。 PID算法中常用概念解释如下: (1)基本偏差e(t) 表示当前测量值与设定目标间的差,设定目标是被减数,结果可以是正或负,正数表示还没有达到,负数表示已经超过了设定值。这是面向比例项用的变动数据。 (2)累计偏差 表示每一次测量到的偏差值的总和,这是代数和,是面向积分项用的一个变动数据。 (3)基本偏差的相对偏差e(t)-e(t-1) 表示用本次的基本偏差减去上一次的基本偏差,用于考察当前控制对象的趋势,作为快速反应的重要依据,这是面向微分项的一个变动数据。 (4)三个基本参数:Kp,Ki,Kd 这三个参数是做好控制器的关键常数,分别称为比例常数、积分常数和微分常数,不同的控制对象需要选择不同的数值,还需要经过现场调试才能获得较好的效果。 (5)标准的直接计算法公式 三个基本参数Kp,Ki,Kd在实际控制中的作用: 比例调节作用:是按比例反映系统的偏差,系统一旦出现了偏差,比例调节立即产生调节作用用以减少偏差。比例作用大,可以加快调节,减少误差,但是过大的比例,使系统的稳定性下降,甚至造成系统的不稳定。 积分调节作用:是使系统消除稳态误差,提高无差度。因为有误差,积分调节就进行直至无差,积分调节停止,积分调节输出一常值。积分作用的强弱取决于积分时间常数Ti,Ti越小,积分作用就越强。反之Ti越大则积分作用越弱,加入积分调节可使系统稳定性下降,动态相应变慢。积分作用常与另两种调节规律结合,组成PI调节器或PID调节器。 微分调节作用:微分作用反映系统偏差信号的变化率,具有预见性,能预见偏差变化的趋势,因此能产生超前的控制作用,在偏差还没有形成之前,以被微分调节作用消除。因此,可以改善系统的动态性能。在微分时间选择合适情况下,可以减少超调,减少调节时间。微分作用对于噪声干扰有放大作用,因此过强的加微分调节,对系统抗干扰不利。此外,微分反应的是变化率,而当输入没有变化时,微分作用输出为零。微分作用不能单独使用,需要与另外两种调节规律相结合,组成PD或PID控制器。 此次参赛的智能车辆主要是寻迹行驶,转向控制算法所要做的就是控制车辆沿着预先设计好黑线行驶,保证车辆中心线在黑线上。在行驶过程中,由于车辆转向造成车辆中心与黑线有一定的偏差量,我们就选择这一偏差量作为输入的偏差(如图4.1所示)。 然后通过直接算法公式 计算出t时刻智能车的控制转向角,由此达到对智能车转向进行控制的目的。通过对大量的实验数据的分析,本算法中转向控制PID算法的Kp选定为2.2,Ki选定为1,Kd选定为1。 作为比赛,最终决定胜负的是车模的行驶速度,赛道中的直道少弯道多的情况比较多见,针对这样的情况需要对车模速度进行快速的调节。我们选择速度控制PID算法根据转向角度和车模速度传感器的值有效的控制车模速度,实现车模的快速行驶。在行驶过程中,我们首先根据不断实验获得的数据确定一个目标速度的经验公式,计算出t时刻车辆达到的速度,然后读取速度传感器的值,比较目标速度与当前实际速度的差值,以此作为偏差量,然后通过直接算法公式 计算出t时刻智能车的控制速度,通过不断的调节与比较,从而在较短的时间内使车模稳定的达到目标车速。PID速度控制算法能够较好的完成调节车速的功能,通过大量的实验和调节,本算法中的速度控制系数选定为Kp选定为1.8,Ki选定为1,Kd选定为1。 4.2仿真软件设计 仿真软件主要用于分析车模采集的图片和数据,获得较好的算法调节参数,发现已有算法中存在的不足并加以改正。本仿真软件采用VC++进行程序设计,包含界面设计、图像显示与仿真、数据显示与仿真、串口数据收发四个部分。界面设计如图4.2所示。 图像显示与仿真模块为分析大量图片提供的平台,编程中主要应用了打开图形文件、显示图形文件以及图像处理算法等VC++编程知识,通过对摄像头保存的图像的分析,可以获得图像处理最有效的方法(如图4.3)。 图像处理中的二值化处理的阈值选择对于后期图像处理算法的影响非常大,通过图像仿真这样的方式可以对阈值选择算法进行调整,从而获得最佳的图像处理效果。 数据接收、显示与保存对于车模的动态分析也是必不可少,车模在行驶过程中动态发送相关数据,通过实时监控这些数据,可以分析控制算法中存在的不足,从而提高控制的稳定性和可靠性,同时采用这样的方法可以加快调试过程,取得事半功倍的效果(如图4.4所示)。 目前的图像仿真软件还存在很多不足之处,需要在不断的增加仿真软件的功能,提高图像分析和数据分析的效率,为提高控制算法的稳定性打下良好的基础。 第5章:开发工具、制作调试过程说明及结论与展望 5.1开发工具、制作调试过程说明及结论 本智能车辆的控制算法部分主要需解决如下问题:车辆直线行驶的稳定性问题,车辆转弯控制问题,车辆行驶速度与转向角度大小的相关性问题,行驶轨迹的跟踪及预测问题等。为了更好的解决设计中存在的问题,本方案采用了目前自动控制领域中最常用的控制算法PID控制算法进行车辆进行控制。 本设计以MC9S12DG128CPV为核心,附以外围电路,设计制作了系统板和电路板,系统软件在CodeWorrior 4.1的基础上,用C语言编写。使用摄象头采集图象,利用防真软件进行对采集的图片和数据的分析。并对车模进行了一系列的机械部分改造。系统软硬件工作稳定,车模能够沿着跑道上的黑色引导线以一定的速度稳定行驶,并具有一定的防滑性能和抗干扰性,适应路面能力强。 5.2展望 本设计的车模虽然能准确的识别跑道并在跑道上以较快的速度稳定行驶,但在转向控制和速度控制上还有需要改进的地方,提升空间还很大。 1、 控制算法有待向更深层次作进一步的研究; 2、 可尝试加入光电传感器辅助车模提高性能; 3、 实现摄象头随着道路一起转向,从而获得弯道路径信息。 4、 对摄像头的固定方式进行优化,使摄像头的振动减小。 5、 对舵机的位置改变,进一步加大转向的灵活性。 6、 对起跑线和十字交叉点的识别的准确性提高。 7、 摄像头传感器对赛道的光线的要求较高,提高抗干扰能力。 8、 电路板的结构设计实现更加合理和小巧。 9、 板材的的表面,材料。          参考文献 [1]《单片机嵌入式应用的在线开发方法》 邵贝贝著  清华大学出版社 [2]《C程序设计(第二版)》  谭浩强著  清华大学出版社 [3]《学做智能车》  卓晴 黄开胜 邵贝贝等著  北京航空航天大学出版社 [4]《汽车理论》第三版 余志生 主编 机械工业出版社 [5]《汽车构造》第三版 陈家瑞 主编 人民交通出版社 [6]《C++程序设计教程》钱能 主编 清华大学出版社 [7]《数字图像处理学》朗锐 北京希望电子出版社 [8]《自动控制原理》胡寿松 科学出版社 [9]《电路设计与制版》高鹏  人民邮电出版社 [10]《单片机接口技术与应用》朱善君 清华大学出版社 附  录 附录A:模型车的主要技术参数说明 项目 参数 车模几何尺寸(长、宽、高)(毫米) 长:280宽:220高:250 车模轴距/轮距(毫米) 200/130 车模平均电流(匀速行驶)(毫安) 2000 电路电容总量(微法) 1600 传感器种类及个数 CCD摄像头1个, 速度传感器1个 新增加伺服电机个数 0 赛道信息检测空间精度(毫米) 10 赛道信息检测频率(次/秒) 100 除MC9S12DG128之外其它主要芯片 MC33886 车模重量(带有电池)(千克) 1.3     附录B:程序代码 #include                     /* common defines and macros */ #include               /* derivative information    */ #include "nRF2401.c" #include "PWM.c" #pragma LINK_INFO DERIVATIVE "mc9s12dg128b" const unsigned char FrameStart[3] = {0x5A,0xA5,'\0'}; const unsigned char FrameEnd[3]  = {0x75,0x57,'\0'}; unsigned char PixelData[72][36]= {0x33}; unsigned char PixelData1[72][36]= {0x33}; unsigned char LineCount = 0; unsigned char LineCount1 = 0; unsigned char PixelCount = 0; unsigned char Count =0; unsigned char flagFinish = 0x0; unsigned char flagFinish1 = 0x0; unsigned char flagFrame = 0; unsigned char flagFind; unsigned char ThresholdVal = 0; struct LinePosition { unsigned char XPsition; unsigned char YPosition; unsigned char PreXPsition; unsigned char PreYPosition; unsigned char XCoefficient; }; struct LinePosition Line[5]; /* ******************************************************************************* *  Register Settings *2007.5.4 *OV6650 ******************************************************************************* */ const unsigned char ov6650_init[] = { 0x12 ,0x80 ,0x11 ,0x83 ,0x6b ,0x0a ,0x6a ,0x25 ,0x3b ,0x09 ,0x01 ,0x80 ,0x02 ,0x80 ,0x00 ,0x00 ,0x10 ,0x00 ,0x39 ,0x43 ,0x38 ,0x12 ,0x37 ,0x00 ,0x35 ,0x91 ,0x0e ,0x20 ,0x1e ,0x14 ,0xA8 ,0x80 ,0x12 ,0x10 ,0x04 ,0x00 ,0x0c ,0x0D ,0x0d ,0x80 ,0x18 ,0xc8 ,0x17 ,0x28 ,0x32 ,0xa4 ,0x03 ,0x36 ,0x1a ,0x1e ,0x19 ,0x00 ,0x3f ,0xa6 ,0x14 ,0x2e ,0x15 ,0x30 ,0x41 ,0x02 ,0x42 ,0x08 ,0x1b ,0x00 ,0x16 ,0x06 ,0x33 ,0xe2 ,0x34 ,0xbf ,0x96 ,0x04 ,0x3a ,0x0c ,0x8e ,0x00 ,0x3c ,0x77 ,0x8B ,0x06 ,0x94 ,0x88 ,0x95 ,0x88 ,0x40 ,0xc1 ,0x29 ,0x3f ,0x0f, 0x4B ,0x27 ,0x80 ,0x28 ,0x80 ,0x2c ,0x80 ,0x3d ,0x92 ,0x69 ,0x40 ,0x5C ,0xb9 ,0x5D ,0x96 ,0x5E ,0x10 ,0x59 ,0xc0 ,0x5A ,0xaf ,0x5B ,0x55 ,0x43 ,0xf0 ,0x44 ,0x10 ,0x45 ,0x68 ,0x46 ,0x96 ,0x47 ,0x60 ,0x48 ,0x80 ,0x5F ,0xe0 ,0x60 ,0x8c ,0x61 ,0x20 ,0xa5 ,0xd9 ,0xa4 ,0x74 ,0x8d ,0x02 ,0x13 ,0xef ,0x4f ,0x3a ,0x50 ,0x3d ,0x51 ,0x03 ,0x52 ,0x12 ,0x53 ,0x26 ,0x54 ,0x38 ,0x55 ,0x40 ,0x56 ,0x40 ,0x57 ,0x40 ,0x58 ,0x0d ,0x8C ,0x23 ,0x3E ,0x02 ,0xa9 ,0xb8 ,0xaa ,0x92 ,0xab ,0x0a ,0x8f ,0xdf ,0x90 ,0x22 ,0x91 ,0x25 ,0x9f ,0x17 ,0xa0 ,0x19 ,0x3A ,0x09 ,0x24 ,0x70 ,0x25 ,0x64 ,0x26 ,0xc4 ,0x2a ,0x00 ,0x2b ,0x00 ,0x6c ,0x40 ,0x6d ,0x30 ,0x6e ,0x4b ,0x6f ,0x60 ,0x70 ,0x70 ,0x71 ,0x70 ,0x72 ,0x70 ,0x73 ,0x70 ,0x74 ,0x60 ,0x75 ,0x60 ,0x76 ,0x50 ,0x77 ,0x48 ,0x78 ,0x3a ,0x79 ,0x2e ,0x7a ,0x28 ,0x7b ,0x22 ,0x7c ,0x04 ,0x7d ,0x07 ,0x7e ,0x10 ,0x7f ,0x28 ,0x80 ,0x36 ,0x81 ,0x44 ,0x82 ,0x52 ,0x83 ,0x60 ,0x84 ,0x6c ,0x85 ,0x78 ,0x86 ,0x8c ,0x87 ,0x9e ,0x88 ,0xbb ,0x89 ,0xd2 ,0x8a ,0xe6 ,0x62 ,0x60 ,0x63 ,0xe0 ,0x64 ,0x04 ,0x65 ,0x00 ,0x66 ,0x01 ,0x8F, 0xDF ,0x90, 0x22 ,0x91, 0x25 ,0x9f, 0x17 ,0xA0, 0x19 ,0x2f, 0x6d ,0x4A, 0x40 ,0x4b, 0x40 ,0x4c, 0x40 ,0x4d, 0x40 ,0x41, 0x02 ,OV9650_REGEND,  0x00 }; unsigned char OV6650SetRegs( const unsigned char *regP) ; void photo(unsigned char *pixel); void photo60(unsigned char *pixel); unsigned char GetThresholdVal(unsigned char pixel[72][36]); unsigned char Threshold(unsigned char pixel[72][36]); unsigned char FindBlackLine(unsigned char pixel[72][36]); int DataProcess(void); interrupt 20 void SCI0_RX(void) { unsigned char rc; rc = SCI0SR1; /* dummy read to clear flags */ rc = SCI0DRL; /* data read */ } interrupt 12 void  PT4_ISR(void) { TIE  = 0X20;                              /* PT6 interrupt enable      */ //flagFinish = 0; Count = 0; LineCount = 0; LineCount1 = 0; temp = TC4 ; } /* ******************************************************************************** *                                    初始化锁相环 * * Description: 在外部晶振为16M(总线频率为8M)的条件下将系统总线频率提升到40M * * Arguments  : None * * Returns    : void ******************************************************************************** */ void PLL_inti(void) { REFDV = 0X01;                                SYNR = 0X04; while(!(CRGFLG&0X08)) ;            /* wait till VCO run stable            */ CLKSEL = 0X80;                      /* PLL clock enable                  */ } /* ******************************************************************************** *                                    初始化串口 * * Description: 在总线频率为40M的条件下,将串口band rate 设为115200bps * * Arguments  : None * * Returns    : void ******************************************************************************** */ static void SCI0Init(void) { SCI0BDL = (unsigned char)((48000000UL /* OSC freq */ / 2) / 115200 /* baud rate */ / 16 /*factor*/); SCI0CR2 = 0x2C; } /* ******************************************************************************** *                                    初始化IO口中断 * * Description: //PAC32(PACA) 用来计数车速脉冲 (接到PT7脚) *                            PP6  用来计数PCLK, *              PT4  用来捕捉VSYCN信号, 下降沿触发 *              PT5  用来捕捉HREF信号, 上升沿触发 *              PT3  用来捕捉2401 DR1上升沿信号 * * Arguments  : None * * Returns    : void ******************************************************************************** */ void init_pt(void) { TIOS  = 0X00;                      /* PT6,PT4,PT5用作输入捕捉            */ TIE  = 0X50;                    /* PT7,PT4,PT6 interrupt enable    */ TCTL3 = 0X06;                      /* PT4下降沿,PT5上升沿            */ TCTL4 = 0X40;                      /* PT3上升沿                        */  TSCR1 = 0X90;                    /*Timer enable,TimerFast Flag Clear All*/ TSCR2 = 0X00;                    /*Timer Prescaler is 0                */ PERT = 0XFF; //Either a pull-up or pull-down device is enabled. PPST = 0XFF;//A pull-down device is connected to the associated port T pin, } void init_io(void) { DDRA = 0x00;  //porta as input DDRM_DDRM1 = 1; //portM1 as output PTM_PTM1 = 0;        //reset DDRM_DDRM0 = 1;    //portM0 as output PTM_PTM0 = 0;        PORTA = 0X00;  } /* ******************************************************************************** *                                    延时函数 * * Description: 软件延时,在总线频率为40MHz的情况下测得。 * * Arguments  : ms      需要延时的时间,单位为0.1ms * * Returns    : void ******************************************************************************** */ void delay(unsigned char ms) { unsigned char i; unsigned char j; for(i=0;i=0;k--) { if(pixel[i][j] == k) { tempHold[k]++; break; } } } } return 1; } unsigned char Threshold(unsigned char pixel[72][36]) { unsigned char i; unsigned char j; for(i=0;i<40;i++) { switch(i) { case 4: case 18: case 28: case 36: case 39: { for(j=1;j<36;j++) { if(pixel[i][j] <= ThresholdVal) { pixel[i][j] = 0x02; } else { pixel[i][j] = 0xFD; } }  break; } default : break;          } } return 1; } unsigned char FindBlackLine(unsigned char pixel[72][36]) { unsigned char i; unsigned char j; unsigned char k; unsigned char tempX1,tempX2; unsigned char tempY; unsigned char flagX; flagX  = 0x1; tempX1 = 0; tempX2 = 0; k = 0; for(i=0;i<40;i++) { switch(i) { case 4: case 18: case 28: case 36: case 39: { flagFind = 0x0; for(j=0;j<36;j++) { if(flagX == 0x1 && pixel[i][j] == 0x02 && pixel[i][j+1] ==0x02) { tempX1 = j; flagX = 0x0; } if(flagX == 0x0 && pixel[i][j] == 0x02 && pixel[i][j+1] ==0x02) { tempX2 = j; flagFind = 0x1;  } } if(flagFind == 0x1) { Line[k].YPosition = i; Line[k].XPsition = (tempX1 + tempX2)/2; } flagX = 0x1; k++; tempX1 = 0; tempX2 = 0; break; } default : break;          } } return 1; } void RfTran(void) { unsigned char i,j; for (i=0;i<72;i++) { TX_data[2] = i; TX_data[3] = 0x0; for(j=0;j<20;j++) { TX_data[j+4] = PixelData[i][j]; } tran_com(); delay(100); TX_data[2] = i; TX_data[3] = 0x1; for(j=0;j<20;j++) { TX_data[j+4] = PixelData[i][j+18]; } tran_com(); } } int DataProcess(void) { char deviation[3]; int angle; deviation[0] = Line[2].XPsition - Line[1].XPsition; deviation[1] = Line[3].XPsition - Line[2].XPsition; deviation[2] = Line[4].XPsition - Line[3].XPsition; angle = (int)((deviation[0] + deviation[1] + deviation[2])/3); angle = -(((int)Line[1].XPsition-18) + angle/2)*30; return angle; } void main(void) { /* put your own code here */ unsigned char i,j; DisableInterrupts; init_io(); init_pt(); PLL_inti(); SCI0Init(); RF2401_Init(); sensor_reset(); OV6650SetRegs(ov6650_init); OV6650SetRegs(gYUV_QQCIF); delay(254); delay(254); InitPwm(); DrivePwm(180); EnableInterrupts; TIE  = 0X10; flagFrame = 0x1;    GetThresholdVal(PixelData); for(;;) { if(flagFrame == 0x1 && flagFinish == 0x1) { Threshold(PixelData1) FindBlackLine(PixelData1);    flagFinish = 0; flagFrame = 0X0;  } else if(flagFinish1 == 0x1) {      Threshold(PixelData); FindBlackLine(PixelData);      temp = DataProcess(); SteerPwm(temp); flagFrame = 0x1;     flagFinish1 = 0; } } /* wait forever */ }
/
本文档为【第三届智能车大赛军交一队技术报告】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索