




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目录摘要 VAbstract V第一章引言 11.1比赛背景 1总体方案介绍 1本文结构 2第二章机械结构部分的设计及调整 3摄像头的安装 4加速度计和陀螺仪模块的安装 52.3测速传感器的安装 5重心调整 6第三章硬件电路设计说明 93.1硬件设计概述 92传感器模块 93.2.1摄像头模块 93.2.2陀螺仪和加速度传感器模块 123.2.3速度采集传感器 12电机驱动模块 12电源模块 13第四章算法实现及软件设计 164.1整体算法说明 164.2PID控制算法介绍 184.2.1位置式PID 194.2.2增量式PID 194.3.3PID参数整定 20直立控制 204.2.1直立模型分析 214.2.2直立控制算法说明 21速度控制 224.3.1速度控制理论分析 224.3.2速度PID控制 22路径识别及方向控制算法 244.4.1边线提取 244.4.2起跑线识别 244.4.3障碍物识别 254.4.4人字识别处理 264.4.5十字的处理 264.4.6方向控制策略 27第五章开发工具、调试环境 285.1单片机开发工具 285.2波形调试上位机 285.3摄像头模块调试 29系统调试 29第六章智能车主要技术参数说明 30第七章 结论 31【参考文献】 32附件 33附件1:部分程序源代码 33附件2电路图 61 摘要本技术报告以第九届飞思卡尔杯全国大学生智能车竞赛为背景,详细介绍了基于数字摄像头为传感器的自主寻迹智能车设计在研究了往飞思卡尔”智能车设计方案的基础上,提出了直立智能车设计方案。本文首先讲述了系统硬件设计,其中包括系统主板设计,电机驱动电路板设计等。在硬件设计的基础上,本文介绍了系统软件设计及算法,并且对比了位置式与增量式PID的区别关键字:飞思卡尔自主寻迹直立智能车数字摄像头PIDAbstractInthebackgroundthe“Freescale”CupNationalSmartcarCompetition,thispapergivesanaccountofthedesignofintelligentcar,whichisbasedondigitalcamera.Bystudyingpreviousdesignsofintelligentcars,thepaperputsforwardthemethodwhichcanextracttheinformationofsmartcar.Thepaperfirstlyelaboratesthesystem,whichthesystemdesign,themotormodule,andsoon.Thenthepaperintroducesthedesignofsoftwaresystem,whichincludesmoduletesting,followcontrolleralgorithm,distinguishthetwodiffererntalgorithm.Finally,thewholesystemmeetstheexpectativerequirement.Keywords: Freescale,Auto-tracing,Smartcar,digitalcameraPID第一章引言1.1比赛背景智能车是一种高新技术密集型的新型汽车它涵盖的范围广泛包括模式识别、传感器技术、自动化控制实现、电力电子技术、计算机技术等多个领域。在国际上已经形成智能汽车研究、设计、开发、竞赛的热潮。在我国教育部为了加强大学生实践创新能力和团队合作精神的培养,委托教育部高等学校自动化专业教学指导分委员会主办了每年一度的全国大学生智能汽车竞赛。全国大学生智能汽车竞赛是在竞赛组委会提供的统一汽车模型平台上使用飞思卡尔半导体公司的8位16位微控制器作为核心控制模块通过设计道路识别传感器和电机驱动电路编写相应软件及装配模型车,制作一个能够自主识别道路的模型汽车按照规定路(路线赛前未知行进,以完成时间最短者为优胜。智能车竞赛目前已经发展有摄像头、光电组和电磁组三个组别比赛赛车速度与比赛质量也越来越高,竞争更是日趋激烈。总体方案介绍五个部分组成。其中,以单片机为核心,配有传感器、测速电路,执行机构以及它们的驱动电路构成了控制系统的硬件;信息处理与控制算法由运行在单片机中的控制软件完成。在检测方面,系统是以OV7725数字摄像头作为传感器进行路径识别,使用模拟的陀螺仪和加速度计采集车模角度和角速度信息。控制方面系统重点研究在保证智能车直立稳定行驶的前提下,提高系统的响应速度。同时需要处理传感器获得信号,滤除干扰,提高系统可靠性。此外,机械结构的调整是保证智能车系统能够稳定可靠运行的前提。因此,机械结构的调校是至关重要的,机械结构调整的原则是:减少质量,降低重心,防止转向侧滑。本文结构本文共分为五章第一章主要是介绍了比赛的背景及智能车系统总体方案的介绍;第二章从智能车系统的机械结构出发,详细阐述了智能车系统各部分机第四章是介绍了智能系统的软件算法;第五章则对智能车部分模块的调试仿真做出相关的介绍;第六章对智能车的技术参数作简要说明。第七章简述智能车制作过程中得出的结论。第二章机械结构部分的设计及调整智能车的机械结构在赛车速度快慢上起着重要作用要想提高智能车的速度,只有将机械结构与控制算法同时做好。总体来说,智能车的重心要尽可能低,以减小智能车在过弯的时侧翻的可能性,摄像头行过程中保证智能车的稳定性,在此基础上,简化布局,使智能车外观简洁。下面将具体阐述本智能车的机械结构的设计及调整。整车外观如图所示:图2.0.1智能车总体图摄像头的安装摄像头安装应保证足够的前(前瞻过近会影响提速过远容易误判赛道,通过实验,我们将前瞻固定到120CM,盲区在18CM,有效视野范围1M左右。我们选择碳纤维管作为摄像头的支架,该材料质量轻、硬度高。在平时的调试过程中,为防止意外撞击导致摄像头损坏,我们安装了保护杆;并且在摄像头模块电路板与支架之间用两根杆子形成三角支架,以提高稳定性。摄像头安装效果如图2.1.1所示图2.1.1摄像头安装图加速度计和陀螺仪模块的安装本智能车采用模拟加速度计和陀螺仪该模块包括一个三轴加速度计一个水平方向陀螺仪及一个竖直方向陀螺仪。该模块安装位置与其使用性能密切相关,故安装时应注意:竖直陀螺仪旋转中心应在智能车车轮轴心线处,转向陀螺仪应与车轮轴心线平行,且两个陀螺仪应在车身中心线处。同时模块安装不宜过高,过高会放大噪声,使采样得到的数据不准确。且加速度计输出值转化为角度的过程本身是一个近似过程,前提是加速度计位置比较低,可以被忽略。但是陀螺仪位置不能放太低,我们曾尝试把该模块放在两个电机中间,由于电机运行时产生的抖动很难消除,对陀螺仪产生干扰。在保证获得数据准确可靠的前提下,我们选择将该模块安装在智能车中部。2.3测速传感器的安装我们选择了欧姆龙500线光电编码器作为测速传感器安装时过紧会增大智能车的行驶阻力,过松会导致滑齿,计数不准。经过验证,E车模的编码器齿轮与车轮齿轮属于一级啮合,安装时相比于D车模更容易出现滑齿现象,这可能是E车模相比于D车模比较难调校之处。安装时综合考虑了齿轮啮合和摩擦的影响。2.4电路板的安装为了提高智能车的稳定性我们将电机驱动与主板分开尽可能减小两个电机和两个编码器之间的空隙。重心调整降低智能车重心我们将电池安装在尽可能低的位置。前期试验都是在D车模上进行,如图2.5.1,这是平衡车最经典的安装方式,存在一定缺陷,车模在这种方式下由于是直立运行,受到阻力较大,且电路板和摄像头等器件安装的位置较高,重心相对较高。在试验后期我们采用倾斜的安装方式加以改善。虽然我们最终采用第二种方案,但是对于两种方案,我们没有做精确对比。方式二也存在如下隐患:今年坡道角度最高达20度,限制电池离车身底板及其附属物不超过3CM,这意味着倒着跑电池位置不能放太低,也不能太远离车身。电池位置若调整不好很可能比方式一还高,重心可能更高。如图2.5.2图2.5.1D车机械安装方式PAGEPAGE28图2.5.2E车机械安装方式第三章硬件电路设计说明3.1硬件设计概述本智能车采用MK60作为主核心。需要3.3V及5V供电。系统还包括:编码器接口、通讯接口、液晶接口、拨码开关、陀螺仪加速度计接口、电机驱动接口和摄像头接口调试时采用串口收发数据下面将针对每一部分做具体论述。2传感器模块3.2.1摄像头模块(1)摄像头工作原理摄像头以隔行扫描的方式采样图像,当扫描到某点时,就通过图像传感芯片将该点处图像的灰度转换成与灰度对应的电压值然后将此电压值通过视频所示,摄像头连续地扫描图像上的一行,就输出一段连续的视频信号该电压信号的高低起伏正反映了该行图像的灰度变化情况当扫描完一行视频信号端就输出一个低于最低视频信号电压的电(如3保持一段时间。这样相当于紧接着每行图像对应的电压信号之后会有一个电压“凹槽”,此“凹槽”叫做行同步脉冲,它是扫描换行的标志。然后扫描新的一行,如此下去直到扫描完该场的信号接着会出现一段场消隐信号其中有若干个他的消隐脉冲(即该消隐脉冲的持续时间远长于其他的消隐脉冲的持续时间),帧场图像。图(2)摄像头对比在模块电路板上直接集成硬件二值化电路,输出的二值化图像十分清晰,噪声较少。(2)像素输出顺序数字摄像头输出图像时,一般都是从左到右,有上到下逐个输出(部分芯片可配置输出顺序):图3.2.2像素输出顺序有些摄像头有奇偶场,是采用隔行扫描方法,把一帧图象分为奇数场和偶数场两场。(ov7725没有奇偶场之分)图3.2.3行中断时序图3.2.4场中断时序3.2.2陀螺仪和加速度传感器模块陀螺仪与加速度计模块为直接购买的成品集成模块,上面集成了水平和竖直陀螺仪ENC-03和加速度计MMA7361.单片机对其进行AD采样,进行软件滤波后得到角度和角速度,用它们来控制小车的直立图3.2.5加速度计陀螺仪集成模块3.2.3速度采集传感器速度采集使用欧姆龙500线光电编码器增量式编码器是直接利用光电转换原理输出三组方波脉冲A、B和Z相;A、B两组脉冲相位差90°,从而可方便地判断出旋转方向.我们将这些脉冲信号连接到单片机的计数器端口,通过单片机的正交解码功能可获得车模的转速以及转向。电机驱动模块电机驱动电路板为一个由分立元件制作的直流电动机可逆双极型桥式驱动器,其功率元件由四个N沟道功率MOSFET管组成,额定工作电流可以轻易达到100A以上,大大提高了电动机的工作转矩和转速。由于E车电机为双电机,所以,我们用两路相同的驱动器分别驱动两个电机。该驱动器主要由以下部分组成:PWM信号输入接口、逻辑换向电路、死区控制电路、电源电路、上桥臂功率MOSFET管栅极驱动电压泵升电路、功率MOSFET管栅极驱动电路、桥式功率驱动电路、缓冲保护电路等,电路如图3.2所示。电路中肖特基二极管IN5819保证了电平VB_1、VB_2低于12V,VB_1高于MOTOR_A,VB_2高于MOTOR_B。电路如下图示,首先使能端为高时,驱动桥这时才会起作用。PWM0为某一占空比,PWM1为低时,使得IR2104驱动输出分别为低电平和相应的电压值。驱动桥电路左边上方IRLR7843与右边下侧的IRLR7843导通,另外的两个MOS管不导通,此时电机正转。因此,一个电机是由两路PWM控制,显然当PWM输出状态与上述相反则为反转。转速的大小取决于占空比的大小。图3.3.1驱动电路原理电源模块智能车电池提供的是7.2V的电压。为了使智能车正常工作,需要将7.2V的电压转化为3.3V和5V的电压。智能车系统用的5V稳压芯片是LM2940和LT1086。LM2940可以提供较大的稳压电流,具有较好的稳压性能,且纹波电压较小。陀螺仪、编码器需要5V供电,为减少单片电源芯片的功耗,避免编码器等影响主控芯片工作,本设计采用了一片LM2940和一片LT1086分别为主控芯片和其他需要5V的模块供电。鹰眼和液晶采用AMS1117_3.3V供电,如果直接让电池电压通过AMS1117_3.3V芯片转化为3.3V,容易使芯片发热,故我们先将电池电压转化为5V,再转化为3.3V.稳压芯片供电,其原理图如下图所示:AMS1117_3.3V稳压电路如图3.4.1所示图3.4.13.3V电源5VLM2940稳压电路如图3.4.2所示图3.4.2LM29405VLT1086稳压电路如图3.4.3所示图3.4.3LT108612VMC34063升压电路如图3.4.4所示图3.4.4MC34063 第四章算法实现及软件设计车模是否能够正常高速稳定运行,除了硬件系统外,软件系统的设计也很重要。整个软件系统主要由三部分构成:直立控制、速度控制及转向控制。控制算法均基于负反馈理论。4.1整体算法说明软件控制程序主要用到K60中的PIT模块、PWM模块、AD模块、SCI模块、FTM模块,GPIO模块等。PIT模块用于设置定时中断;PWM模块用于控制电机的运转,AD模块用于读取加速度计,陀螺仪的数据信息,SCI模块用于串口调试,FTM模块用于编码器数据采集。我们图像采集使用K60的DMA模块进行采集,主函数按普通的处理方法,在主循环里:采集图像,图像处理,然后把处理结果存放在全局参数里。PIT定时执行直立控制:采集模块参数,然后直立控制,根据图像处理的全局参数来进行速度控制和方向控制。主循环:图像采集与处理—写—>全局参数—读—>直立控制的速度控制和方向控制。图4.1.1主程序流程图开始边线处开始边线处第i行搜索初始化搜索位置搜索左边缘,右边缘求中线两个边线都找到或者搜索到左右极限i--
所有边线是否搜索结束边线中线搜索结束本行边线找到对未找到边线进行补边YYNYN图4.1.2图像处理流程图4.2PID控制算法介绍在工程实际中,应用最为广泛的调节器控制规律为比例、积分、微分控制,简称PID控制,又称PID调节。PID控制器问世至今已有近70年历史,它以其结构简单、稳定性好、工作可靠、调整方便而成为工业控制的主要技术之一。当被控对象的结构和参数不能完全掌握,或得不到精确的数学模型时,控制理论的其它技术难以采用时,系统控制器的结构和参数必须依靠经验和现场调试来确定,这时应用PID控制技术最为方便。即当我们不完全了解一个系统和被控对象,或不能通过有效的测量手段来获得系统参数时,最适合用PID控制技术。PID控制,实际中也有PI和PD控制。PID控制器是一种线性控制器,它根据给定值与实际输出值构成控制偏差。将偏差的比例(P)、积分(I)和微分(D)通过线性组合构成控制量,对被控对象进行控制,故称PID控制器,原理框图如图4.2.1所示。图4.2.1PID控制器原理框图在计算机控制系统中,使用的是数字PID控制器,控制规律为:公式1公式2式中k——采样序号,k=0,1,2…;r(k)——第k次给定值;c(k)——第k次实际输出值;u(k)——第k次输出控制量;e(k)——第k次偏差;e(k-1)——第k-1次偏差;KP——比例系数;TI——积分时间常数;TD——微分时间常数;T——采样周期。简单说来,PID控制器各校正环节的作用如下:比例环节:及时成比例地反映控制系统的偏差信号,偏差一旦产生,控制器立即产生控制作用,以减少偏差。积分环节:主要用于消除静差,提高系统的无差度。积分作用的强弱取决于积分时间常数,越大,积分作用越弱,反之则越强。微分环节:能反映偏差信号的变化趋势(变化速率),并能在该偏差信号变得太大之前,在系统中引入一个有效的早期修正信号,从而加快系统的动作速度减小调节时间。数字PID控制算法通常分为位置式PID控制算法和增量式PID控制算法。4.2.1位置式PID位置式PID中,由于计算机输出的u(k)直接去控制执行机构(如阀门),u(k)的值和执行机构的位置(如阀门开度)是一一对应的,所以通常称公式2为位置式PID控制算法。位置式PID控制算法的缺点是:由于全量输出,所以每次输出均与过去的状态有关,计算时要对过去e(k)进行累加,计算机工作量大;而且因为计算机输出的u(k)对应的是执行机构的实际位置,如计算机出现故障,u(k)的大幅度变化,会引起执行机构位置的大幅度变化,这种情况往往是生产实践中不允许的,在某些场合,还可能造成严重的生产事故。因而产生了增量式PID控制的控制算法,所谓增量式PID是指数字控制器的输出只是控制量的增量△u(k)。4.2.2增量式PID当执行机构需要的是控制量的增量(例如:驱动步进电机)时,可由式2推导出提供增量的PID控制算式。由式2可以推出式3,式2减去式3公式3公式4公式4称为增量式PID控制算法,可以看出由于一般计算机控制系统采用恒定的采样周期T,一旦确定了KP、TI、TD,只要使用前后三次测量值的偏差,即可由式4求出控制增量。增量式PID具有以下优点:(1)由于计算机输出增量,所以误动作时影响小,必要时可用逻辑判断的方法关掉。(2)手动/自动切换时冲击小,便于实现无扰动切换。此外,当计算机发生故障时,由于输出通道或执行装置具有信号的锁存作用,故能保持原值。(3)算式中不需要累加。控制增量△u(k)的确定仅与最近k次的采样值有关,所以较容易通过加权处理而获得比较好的控制效果。但增量式PID也有其不足之处:积分截断效应大,有静态误差;溢出的影响大。使用时,常选择带死区、积分分离等改进PID控制算法。4.3.3PID参数整定运用PID控制的关键是调整KP、KI、KD三个参数,即参数整定。PID参数的整定方法有两大类:一是理论计算整定法。它主要是依据系统的数学模型,经过理论计算确定控制器参数;二是工程整定方法,它主要依赖工程经验,直接在控制系统的试验中进行,且方法简单、易于掌握,在工程实际中被广泛采用。由于智能车系统是机电高耦合的分布式系统,并且要考虑赛道的具体环境,要建立精确的智能车运动控制数学模型有一定难度,而且我们对车身机械结构经常进行修正,模型参数变化较为频繁,理论计算整定法可操作性不强,最终我们采用了工程整定方法。直立控制这部分是软件设计中最基础也是最难的一个部分,直立控制做得好,小车的速度和方向控制才更容易实现。智能车直立控制通过PD控制实现将智能车简化为倒立摆增加额外受力,使得恢复力与位移方向相反。4.2.1直立模型分析图4.2.1倒立摆受力分析F=mgsinθ-macosθ公式5只要轮子运动的加速度a>g,就可以产生回复力,来保持车模的直立。当然回复力越大,对于保持直立越好,但是太大也会导致系统振荡,当系统发生振荡时,可以加入一定的阻尼力来消除振荡,这就可以通过倒立摆的角速度分量来控制摆的平衡。4.2.2直立控制算法说明直立控制采用PD控制实现。单片机采集陀螺仪和加速度的值后进行归一化处理,使用卡尔曼进行滤波,得到车模的角度和角速度。MMA7361=adc_once(ZOUT,ADC_12bit);ENC03=adc_once(Gyro2,ADC_12bit);Gyro_Now=(GYRO_VAL-ENC03)*Gyro_ratio;angle_offset_vertical=(MMA7361_vertical-MMA7361)*MMA7361_ratio;Kalman_Filter(angle_offset_vertical,Gyro_Now);g_fAngControlOut=(angle-car_set_angle)*P_ANGLE+angle_dot*D_ANGLE;速度控制4.3.1速度控制理论分析通常情况下速度控制部分由光电编码器把轮子的速度反馈回来,然后通过负反馈机制做一个PID控制器就可以控制速度,但是在直立小车系统里的速度控制就不是那么简单了,它看起来是一个正反馈的机制。当需要车模加速时,并不是通常意义上加大给电机的电压让轮子加速,速度控制反而是让电机减速,这样车模就会往前倾,这时角度控制就会与速度控制相抗衡来达到一个平衡,但是这时车模会持续向前加速,因为车模往前有一个倾角就会有往前倒的角加速度,为了保持角度轮子也必须有一个向前的加速度,这样车模就可实现加速了。要实现减速则要让车模向后仰就可以了。图4.3.1速度控制框图4.3.2速度PID控制速度控制采用的是增量PID控制,我们只采用PI控制,积分控制能使速度最终稳定在给定速度,比例控制能实现速度的快速调节。由于直立车的速度控制实际是改变车模倾角,因此速度控制对于直立控制是一种扰动,速度控制周期不能过大,控制量要平滑输出。voidPIT1_IRQHandler(void){PIT_Flag_Clear(PIT1);Car_speed=0;//车模速度清零L_speed=-FTM_QUAD_get(FTM1);FTM_QUAD_clean(FTM1);R_speed=FTM_QUAD_get(FTM2);FTM_QUAD_clean(FTM2);Car_speed=(L_speed+R_speed)/2;Error_Speed=g_Speedgoal-Car_speed;SpeedValuePID=P_SPEED*(Error_Speed-PreError_Speed)+I_SPEED*Error_Speed+D_SPEED*(Error_Speed-2*PreError_Speed+EarError_Speed);EarError_Speed=PreError_Speed;PreError_Speed=Error_Speed;g_fSpeedControlOut+=SpeedValuePID;g_fSpeedControlOutOld=g_fSpeedControlOutNew;g_fSpeedControlOutNew=g_fSpeedControlOut;}voidSpeedControlOutput(void){floatfValue;fValue=g_fSpeedControlOutNew-g_fSpeedControlOutOld;g_fSpeedControlOut=fValue*(float)(g_nSpeedControlPeriod+1)/SPEED_CONTROL_PERIOD+g_fSpeedControlOutOld;路径识别及方向控制算法4.4.1边线提取图4.4.1起跑线图片由于摄像头已经做好了硬件二值化,而且噪点很少,这简化了我们对边线地提取。引导线提取思路:(1)为提高搜索边线的稳定性,边线从最后一行往第一行依次搜索边线;(2)由于发车是在直道上发车,故第一场图像从中间往两边搜索,后面的行以上一行的中点为搜索起点往两边搜索,这种搜索方式比全行搜索的优点在于避免了会将左右边线混淆的情况,由于要对障碍物进行检测,故没有使用边缘检测算法;(3)往左搜索到白黑跳变标记为左边线,往右搜索到白黑跳变标记为右边线;(4)如果两个边线都找到,中点就是左右边线的平均值;(5)如果只找到一个边线,中点就根据找到边线的斜率进行补线;(6)如果两个边线都没有找到,则中点就是上一行的中点;4.4.2起跑线识别图4.4.2起跑线要能够准确的识别起跑线那么我们首先要能够分析出是跑线的特征,并且抓住最主要的特征,也就是他不同于赛道其它的地方。赛道有一个长为1米的出发区,图为串口示波器发回的起跑线效果图,计时起始点。两边分别有一个长度10厘米黑色计时起始线,赛车前端通过起始线作为比赛计时开始或者结束时刻。由上可知,起跑线前后最少有1m的直道,有两条10cm的黑带,并且黑带间距为9cm,最后是起跑线不会出现在窄道区域。有了上面对起跑线的特征的分析就可以对起跑线进行识别。步骤如下:(1)小车速度是否达到起跑线检测速度;(2)检测是否为直道;(3)判断跳变的次数是否达到检测要求;(4)判断黑条的宽度是否符合预设;(5)延时一段时间后才进行停止线检测(6)检测到停止线后关电机停车。因为前面已经说过起跑线的在直道上,弯道不可能出现起跑线,所以主要检测赛道是否为直道,在弯道上不检测。本方案在实际调试和应用中,发现其算法简单,特征明确,并且准确率较高。4.4.3障碍物识别图4.4.3障碍物E车轮距宽,不能不进行处理就通过障碍,障碍物的识别是判断左右边线的跳变,哪边有跳变障碍物就在哪一边,识别障碍物的位置后通过增大偏差量使车转过去。由于检测跳变可能会受到起跑线的干扰,因此要对起跑线处的边线进行处理。4.4.4人字识别处理图4.4.4人字人字进行纵向搜索,对跳变进行计数和长度判断,识别后增大偏差量让车转过去,但这种方法的劣势在于适应性差,不同的速度还要有对应的偏差量,这个增大了调试的难度。4.4.5十字的处理对于十字我们没有进行识别,在搜寻边线时,判断找到的左右边线是否是十字的拐点,如果是十字的拐点则进行一次线性插值补线,这里要避免小S和左右边线上的突变点的干扰。图4.4.5十字补线4.4.6方向控制策略对于双电机直立车模,转向靠电机控制车轮差速进行转向,方向控制量由识别出的路径偏移量通过计算给出,转向控制采用PD控制。由于车模转向时容易产生过冲,我们使用了水平陀螺仪来抑制转向过冲。floatSteerPidCal(floaterror){floatDirect=0.0;SteerPIDe0=error;ENC03_level=adc_once(Gyro1,ADC_12bit);Gyro_Now_level=GYRO_level-ENC03_level;Direct=P_dir*SteerPIDe0+D_dir*(SteerPIDe0-SteerPIDe1)+P_dir_Gyro*Gyro_Now_level;SteerPIDe1=SteerPIDe0;returnDirect;}第五章开发工具、调试环境5.1单片机开发工具在K60的开发上我们使用的是IAR_6.3他编译简单,下载简洁给我们的操作做来了很大的方便,至于具体的操作可以参看开始界面的使用帮助。图5.1.1IAR编译环境5.2波形调试上位机波形调试使用了虚拟示波器,用于在线观测卡尔曼滤波后最终算出的车模倾角对于加速度计所得倾角的追踪情况,看是否出现“过冲”或“跟踪缓慢”,角度融合情况对于直立控制十分关键。此外,在调试阶段还可以观察车模运行中相应参数情况,包括速度变化曲线,位移偏移量的变化曲线,转向差速时内侧轮和外侧轮轮速曲线等等,通过对这些参数的记录和分析,可以随时调整相关控制参数,以使车模达到最佳运行状态,以便在后期实现车模提速。图5.2.1波形调试上位机5.3摄像头模块调试图5.3.1摄像头上位机系统调试系统调试是在机械设计总体确定程序框架无误的基础上进行的需要突破的地方主要是提高小车的稳定性及对环境的适应能力,以及竞赛策略的设定。在提高转向稳定性与提高速度时需要不断调整参数,以获得一组合理的参数,让小车稳定运行。通过反复试验我们得出了一组适合该智能车系统的参数使智能车能稳定行驶。第六章智能车主要技术参数说明项目参数路径检测方法(竞赛组)摄像头组车模几何尺寸(长、宽、高)320mm/205mm/380mm车模平均电流(匀速行驶)(毫安)2000电路电容总量(微法)约1400uF传感器种类及个数摄像头1个,测速2个加速度计1个,陀螺仪2个赛道信息检测空间精度(毫米)10赛道信息检测频率(次/秒)67车模重量(不含电池)(千克)0.785kg第七章 结 论摄像头与直立融合,摄像头相对于其他传感器,优势相对明显,对赛道采集时信息量大,稳定性高,对环境依赖相对较低,算法可发挥空间大。平衡控制本身是直立、控速、转向三者的结合,想让小车立起来并不难,但是如果让车跑的既稳又快,除了精准的参数调整以外还需要严谨的逻辑算法。摄像头图像采集和处理部分的时间较长,范围从7ms~30ms之间不等,系统电机控制时间从5ms~20ms不等,一般取5ms,如何安排好两部分之间的关系,容易产生难题。系统执行一个周期所用的时间为5ms左右耗时较多的是陀螺仪加速度计的采样部分所以合理分配单片机资源提高资源利用率变成至关重要的一部分。目前,智能车系统研究还存在如下问题:(1)智能车在过十字交叉时有时会误判(2)在恒定目标速度下,过弯时速度变化明显(3)通过人字元素识别不稳定,有时略有滞后。针对智能车过十字交叉误判问题将主要从软件上优化路径识别算法方面解决。针对智能车过弯速度变化问题,将主要从控制算法和控制参数上做进一步优化解决。针对智能车元素识别滞后问题,将主要从识别特征上优化路径算法,在控制方法上尝试新的控制策略。此外,参数的高效率选取需做到:在调试程序的过程中,建立相应的数学模型,提高调试程序的目的性。【参考文献】京5】 凌阳技份限司PID节制电速控制206.6.BrianC 附件附件1:部分程序源代码/************************************************名称:main*功能:摄像头组人机交互模块程序拨码开关接低电平,进入人机交互拨码开关接高电平,退出人机交互退出之前求各个参数显示:各个电压的实际值各个PID参数主页面后期可拓展对摄像头和陀螺仪,加速度计,电机驱动,编码器的工作状态的检测可设置参数:速度PID参数直立PD参数方向PD参数车模角度车模速度死区电压如果需要还可进行扩展说明:*硬件:野火核心板K60FX512,野火鹰眼二代ST7735S*软件平台:IAR6.3*创建时间:2014-4-1*修改时间:2014-4-8修改说明:1.优化完善代码2014-4-8*版本号:V1.0*************************************************/#include"include.h"/********************************************说明:LEFT键:正常显示状态时切换屏幕设置状态时移位屏幕1:主屏幕显示屏幕2:电压采样显示屏幕3:速度检测显示屏幕4:速度PID参数显示屏幕1:直立PD参数,方向PD参数显示UP:调节PID参数大小OK:进入设置PID参数页面SET:在参数设置页面换行LEFT:*********************************************//********************函数申明*********************************/voidwelcome(void);//开机欢迎页面子程序voidkey_process(void);//大循环按键判断子程序voidkey_left(void);//左键子程序(移屏或移位)voidkey_up(void);//↑键子程序(主要用于设置数据大小)voidkey_set(void);//设置键子程序voidkey_ok(void);voidkey_right(void);//设置键子程序voidkey_down(void);voidOledHandle(void);//人机交互处理程序//voidfuzhi(unsignedchar*p,unsignedcharstart,unsignedcharend,unsignedchar*q);voidLCD_Fill(void);//LCD清屏voidfprint(uint8*str,floatdata);//小数转化为字符串voidInit_Parameter();//进入人机交互前将当前参数转换为字符方便进行显示voidAD_init();//电压AD采样初始化voidKeyInit();//按键初始化voidBack();//从人机交互调试界面返回正常界面voidLCD_fb_char(Site_tsite,uint8ascii,uint16Color,uint16bkColor);//反白显示字符voidLCD_fb_str(Site_tsite1,Site_tsite,uint8*Str,uint16Color,uint16bkColor);//反白显示字符串/********************变量声明*********************************/unsignedcharolcd_display_row=20;//行unsignedcharolcd_display_column=0;//列unsignedchargn_screen_num;//页数unsignedchargn_set_flag;//按下SET键标志位/***********速度PID*******************************/unsignedcharP_Spe[13]={'P','_','S','P','E',':','1','0','.','0','0','0','\0'};//电机PID控制参量设置unsignedcharI_Spe[13]={'I','_','S','P','E',':','0','0','.','0','0','0','\0'};//电机PID控制参量设置unsignedcharD_Spe[13]={'D','_','S','P','E',':','0','0','.','0','0','0','\0'};//电机PID控制参量设置unsignedcharSpeed[12]={'S','P','E','E','D',':','0','0','0','0','\0'};//速度/***********方向PID*******************************/unsignedcharP_Dir[13]={'P','_','D','i','r',':','0','0','.','0','0','0','\0'};//方向PDunsignedcharD_Dir[13]={'D','_','D','i','r',':','0','0','.','0','0','0','\0'};///***********直立PID*******************************/unsignedcharP_Zl[12]={'P','_','Z','l',':','0','0','.','0','0','0','\0'};//直立PDunsignedcharD_Zl[12]={'D','_','Z','l',':','0','0','.','0','0','0','\0'};//unsignedcharV_Dea[10]={'V','_','D','e','a',':','0','0','0','\0'};//死区电压unsignedcharCarAng[13]={'C','a','r','A','n','g',':','0','0','.','0','0','\0'};//车模角度unsignedcharBatPower[10]={'B','A','T',':','0','0','.','0','0','\0'};/********变量声明**************g_f_PID_Parameter[0]:P_SPEED,g_f_PID_Parameter[1]:I_SPEED,g_f_PID_Parameter[2]:D_SPEEDg_f_PID_Parameter[3]:P_DIRECTION,g_f_PID_Parameter[4]:D_DIRECTION,g_f_PID_Parameter[5]:P_ZILI,g_f_PID_Parameter[6]:D_ZILIg_f_PID_Parameter[7]:Speed速度给定g_f_PID_Parameter[8]:V_dea死区电压************存储各个PID参数的值**************/floatg_f_PID_Parameter[10];unsignedcharstrbuf[30];//存放字符串/************************************函数名称:fprint*函数功能:将浮点型00.000数据转换成字符串*入口参数:floatdata:将要转换的浮点型数据*出口参数:uint8*str:转换后的字符串************************************/uint32temp;voidfprint(uint8*str,floatdata){temp=(uint32)(data*1000);if(temp>=10000)//百位{*str=temp/10000%10+'0';}else{*str='0';}str++;if(temp>=1000)//十位{*str=temp/1000%10+'0';}else{*str='0';}str++;*str='.';//小数点str++;if(temp>=100)//小数点后一位{*str=temp/100%10+'0';}else{*str='0';}str++;if(temp>=10)//小数点后两位{*str=temp/10%10+'0';}else{*str='0';}str++;if(temp>=1)//小数点后三位{*str=temp%10+'0';}else{*str='0';}}/************************************函数名称fuzhi*函数功能:将源数组的值赋值给目的数组从start到end位置*入口参数:*p:目的数组start:目的数组起始位置end:目的数组结束位置*q:源数组****************************************************/voidfuzhi(unsignedchar*p,unsignedchars,unsignedcharend,unsignedchar*q){unsignedchari;for(i=s,p=p+s;i<end;i++,p++,q++){*p=*q;}}/************************************函数名称:fuzhi*函数功能:进入人机交互前将当前参数转换为字符方便进行显示****************************************************/voidInit_Parameter()//进入人机交互前将当前参数转换为字符方便进行显示{unsignedcharstart;//速度P参数fprint(strbuf,g_f_PID_Parameter[0]);start=6;fuzhi(P_Spe,start,13,strbuf);//速度I参数fprint(strbuf,g_f_PID_Parameter[1]);start=6;fuzhi(I_Spe,start,13,strbuf);//速度D参数fprint(strbuf,g_f_PID_Parameter[2]);start=6;fuzhi(D_Spe,start,13,strbuf);//方向P参数fprint(strbuf,g_f_PID_Parameter[3]);start=6;fuzhi(P_Dir,start,13,strbuf);//方向D参数fprint(strbuf,g_f_PID_Parameter[4]);start=6;fuzhi(D_Dir,start,13,strbuf);//直立P参数fprint(strbuf,g_f_PID_Parameter[5]);start=5;fuzhi(P_Zl,start,12,strbuf);//直立D参数fprint(strbuf,g_f_PID_Parameter[6]);start=5;fuzhi(D_Zl,start,12,strbuf);//车速sprintf((char*)strbuf,"%d",((uint16)g_f_PID_Parameter[7]));start=6;fuzhi(Speed,start,12,strbuf);//死区电压sprintf((char*)strbuf,"%d",((uint16)g_f_PID_Parameter[8]));start=6;fuzhi(V_Dea,start,12,strbuf);//车角度fprint(strbuf,g_f_PID_Parameter[9]);start=7;fuzhi(CarAng,start,12,strbuf);}/*********************************函数名称:AD_init*函数功能:电压AD采样初始化**********************************/voidAD_init(){adc_init(ADC1_SE16);//3V3adc_init(ADC0_SE10);//7V2adc_init(ADC1_SE14);//5Vadc_init(ADC1_SE15);//5V}/***************************函数名称:KeyInit*函数名称:人机交互按键初始化**************************/voidKeyInit(){LEFT_INIT;RIGHT_INIT;DOWN_INIT;UP_INIT;OK_INIT;SET_INIT;}/********************************函数名称:Back*函数功能:从人机交互状态返回到非调试状态,执行其他程序*返回前求各个参数********************************/voidBack(){//退出前求各个参数 //速度PID g_f_PID_Parameter[0]=(P_Spe[6]-0X30)*10+(P_Spe[7]-0X30)+(P_Spe[9]-0X30)*0.1+(P_Spe[10]-0X30)*0.01+(P_Spe[11]-0X30)*0.001;g_f_PID_Parameter[1]=(I_Spe[6]-0X30)*10+(I_Spe[7]-0X30)+(I_Spe[9]-0X30)*0.1+(I_Spe[10]-0X30)*0.01+(I_Spe[11]-0X30)*0.001; g_f_PID_Parameter[2]=(D_Spe[6]-0X30)*10+(D_Spe[7]-0X30)+(D_Spe[9]-0X30)*0.1+(D_Spe[10]-0X30)*0.01+(D_Spe[11]-0X30)*0.001;//方向PDg_f_PID_Parameter[3]=(P_Dir[6]-0X30)*10+(P_Dir[7]-0X30)+(P_Dir[9]-0X30)*0.1+(P_Dir[10]-0X30)*0.01+(P_Dir[11]-0X30)*0.001;g_f_PID_Parameter[4]=(D_Dir[6]-0X30)*10+(D_Dir[7]-0X30)+(D_Dir[9]-0X30)*0.1+(D_Dir[10]-0X30)*0.01+(D_Dir[11]-0X30)*0.001;//直立PDg_f_PID_Parameter[5]=(P_Zl[5]-0X30)*10+(P_Zl[6]-0X30)+(P_Zl[8]-0X30)*0.1+(P_Zl[9]-0X30)*0.01+(P_Zl[10]-0X30)*0.001;g_f_PID_Parameter[6]=(D_Zl[5]-0X30)*10+(D_Zl[6]-0X30)+(D_Zl[8]-0X30)*0.1+(D_Zl[9]-0X30)*0.01+(D_Zl[10]-0X30)*0.001;//速度g_f_PID_Parameter[7]=(Speed[6]-0X30)*1000+(Speed[7]-0X30)*100+(Speed[8]-0X30)*10+(Speed[9]-0X30);//死区电压g_f_PID_Parameter[8]=(V_Dea[6]-0X30)*10+(V_Dea[7]-0X30);//车模角度g_f_PID_Parameter[9]=(CarAng[7]-0X30)*10+(D_Zl[8]-0X30)+(D_Zl[10]-0X30)*0.1+(D_Zl[11]-0X30)*0.01;}/**************************************************************************************函数名称:OledHandle函数功能:人机交互处理 **************************************************************************************/voidOledHandle(void){int16BAT;unsignedcharstart;unsignedcharbat_strbuf[30];//存放字符串int16count=0,count1=0;gn_screen_num=0;gn_set_flag=0;Site_tsite={0,0};Site_tsite1={0,0};int16MMA7361,ENC03,ENC03_level;AD_init();//电压AD采样初始化KeyInit();//按键初始化Init_Parameter();//参数转换while(1){/*if(1==gpio_get(PTB7))//拨码开关选择退出人机交互{Back();//退出人机界面扫描LCD_Fill();//退出前清屏return;//退出人机交互调试界面}*/key_process();//按键扫描if(gn_set_flag==0)//非参数设置状态{if(!RIGHT){//DELAY_MS(10);if(!RIGHT){Back();//退出前求参数return;//while(!LEFT);}}if(gn_screen_num==0)//AD采样界面{site.x=35;site.y=0;LCD_str(site,"Voltage",RED,WHITE);count++;count1++;if(count==5000){site.x=0;site.y=0;count=0;//BAT=adc_once(ADC0_SE10,ADC_12bit);//7V2//电压显示BAT=adc_ave(ADC0_SE10,ADC_12bit,1);fprint(bat_strbuf,(BAT*4*3.3/4096.0));start=4;fuzhi(BatPower,start,10,bat_strbuf);site.x=0;site.y+=16;LCD_str(site,BatPower,BLACK,WHITE);}if(count1==1000){site.x=0;site.y=16;count1=0;//加速度计陀螺仪采MMA7361=adc_ave(ZOUT,ADC_12bit,100);//ZENC03=adc_ave(Gyro2,ADC_12bit,100);//gyro2ENC03_level=adc_ave(Gyro1,ADC_12bit,1);//加速度计site.y+=16;sprintf((char*)strbuf,"7361:%d",MMA7361_vertical);LCD_str(site,strbuf,BLUE,WHITE);site.y+=16;sprintf((char*)strbuf,"MMA7361:%d",MMA7361);LCD_str(site,strbuf,BLACK,WHITE);//直立陀螺仪site.y+=16;sprintf((char*)strbuf,"GYRO_VAL:%d",GYRO_VAL);LCD_str(site,strbuf,BLUE,WHITE);site.y+=16;sprintf((char*)strbuf,"ENC03:%d",ENC03);LCD_str(site,strbuf,BLACK,WHITE);//水平陀螺仪site.y+=16;sprintf((char*)strbuf,"GYRO_level:%d",GYRO_level);LCD_str(site,strbuf,BLUE,WHITE);site.y+=16;sprintf((char*)strbuf,"ENC03level:%d",ENC03_level);LCD_str(site,strbuf,BLACK,WHITE);}//sprintf((char*)strbuf,"BAT:%d",(uint16)(BAT*4.036*3.3*100/4096.0));}//endofif(gn_screen_num==0)if(gn_screen_num==1)//直立,速度PID参数显示界面{site.x=20;site.y=0;LCD_str(site,"ZL_PDSPE_PD",RED,WHITE);//直立参数site.x=0;site.y+=20;LCD_str(site,P_Zl,BLACK,WHITE);site.y+=20;LCD_str(site,D_Zl,BLACK,WHITE);site.y+=20;//速度参数LCD_str(site,P_Spe,BLACK,WHITE);site.y+=20;LCD_str(site,I_Spe,BLACK,WHITE);site.y+=20;LCD_str(site,D_Spe,BLACK,WHITE);}//endofif(gn_screen_num==1)if(gn_screen_num==2)//界面2,方向PD,死区电压,速度,车模角度{site.x=40;site.y=0;LCD_str(site,"Dir_PD",RED,WHITE);site.x=0;site.y+=20;LCD_str(site,P_Dir,BLACK,WHITE);site.y+=20;LCD_str(site,D_Dir,BLACK,WHITE);site.y+=20;LCD_str(site,V_Dea,BLACK,WHITE);site.y+=20;LCD_str(site,Speed,BLACK,WHITE);site.y+=20;LCD_str(site,CarAng,BLACK,WHITE);}//endofif(gn_screen_num==2)if(!SET)//OK键功能,进入速度PID参数设置{DELAY_MS(10);//注意此延时大小,太小则不能进入if(gn_set_flag==1)if(!SET){gn_set_flag=1;//进入设置页面标志位,进入速度PID参数设置LCD_Fill();//清屏while(!SET);}}}//endofif(gn_set_flag==0)if(gn_set_flag==1)//进入设置界面状态界面1,速度PID,方向PD设置{site.x=0;site.y=0;LCD_str(site,"PIDAdjust",RED,WHITE);site1.x=olcd_display_column;//olcd_display_row;site1.y=olcd_display_row;//olcd_display_column;site.x=0;site.y=+20;LCD_fb_str(site1,site,P_Spe,BLACK,WHITE);site.y+=20;LCD_fb_str(site1,site,I_Spe,BLACK,WHITE);site.y+=20;LCD_fb_str(site1,site,D_Spe,BLACK,WHITE);site.y+=20;LCD_fb_str(s
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年单组元肼、双组元液体推力器合作协议书
- 文档汽车车载网络技术应用
- 家政清洁服务技能培训体系
- 流程管理成功案例解析
- 中文生物医学文献检索系统
- 家庭子女环保意识教育及实践服务协议
- 抖音火花小程序合规性审查及整改协议
- 高端技术兼职岗位竞业限制合同
- 汽车行业广告视频定制拍摄与多平台推广合同
- 网络直播网红培养计划合伙人协议
- 幼儿园大班游戏中“一对一倾听”的策略
- 医院信息安全管理课件
- 2024年初级会计实务考试真题
- 变电站设备危险源辨识清单及预控措施
- GB/T 45083-2024再生资源分拣中心建设和管理规范
- 艾灸疗法课件
- 银行职业介绍课件
- T-CASME 1514-2024 市域智慧共享中药房建设指南
- 《全球各大邮轮公司》课件
- 【MOOC】创新与创业管理-南京邮电大学 中国大学慕课MOOC答案
- 2024年3月天津高考英语第一次高考真题(原卷版)
评论
0/150
提交评论