常州大学光电组智能汽车竞赛技术报告_第1页
常州大学光电组智能汽车竞赛技术报告_第2页
常州大学光电组智能汽车竞赛技术报告_第3页
常州大学光电组智能汽车竞赛技术报告_第4页
常州大学光电组智能汽车竞赛技术报告_第5页
已阅读5页,还剩79页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第六章开发工具介绍PAGE332第一章引言1.1大赛介绍为加强大学生实践、创新能力和团队精神的培养,促进高等教育教学改革,受教育部高等教育司委托(教高司函[2005]201号文,附件1),由教育部高等学校自动化专业教学指导分委员会(以下简称自动化分教指委)主办全国大学生智能汽车竞赛。该竞赛是以智能汽车为研究对象的创意性科技竞赛,是面向全国大学生的一种具有探索性工程实践活动,是教育部倡导的大学生科技竞赛之一。该竞赛以“立足培养,重在参与,鼓励探索,追求卓越”为指导思想,旨在促进高等学校素质教育,培养大学生的综合知识运用能力、基本工程实践能力和创新意识,激发大学生从事科学研究与探索的兴趣和潜能,倡导理论联系实际、求真务实的学风和团队协作的人文精神,为优秀人才的脱颖而出创造条件。该竞赛由竞赛秘书处设计、规范标准硬软件技术平台,竞赛过程包括理论设计、实际制作、整车调试、现场比赛等环节,要求学生组成团队,协同工作,初步体会一个工程性的研究开发项目从设计到实现的全过程。该竞赛融科学性、趣味性和观赏性为一体,是以迅猛发展、前景广阔的汽车电子为背景,涵盖自动控制、模式识别、传感技术、电子、电气、计算机、机械与汽车等多学科专业的创意性比赛。该竞赛规则透明,评价标准客观,坚持公开、公平、公正的原则,力求向健康、普及、持续的方向发展。该竞赛以飞思卡尔半导体公司为协办方,得到了教育部相关领导、飞思卡尔公司领导与各高校师生的高度评价,已发展成全国30个省市自治区近300所高校广泛参与的全国大学生智能汽车竞赛。2008年起被教育部批准列入国家教学质量与教学改革工程资助项目中科技人文竞赛之一(教高函[2007]30号文)。第二章整体设计方案2.1智能车直立寻迹原理2.1.1直立车模任务分解根据比赛规则要求,维持车模直立也许可以设计出很多的方案,本参考方案假设维持车模直立、运行的动力都来自于车模的两个后车轮。后轮转动由两个直流电机驱动。因此从控制角度来看,车模作为一个控制对象,它的控制输入量是两个电极的转动速度。车模运动控制任务可以分解成以下三个基本控制任务,如图2.1所示:(1)控制车模平衡:通过控制两个电机正反向运动保持车模直立平衡状态;(2)控制车模速度:通过调节车模的倾角来实现车模速度控制,实际上最后还是演变成通过控制电机的转速来实现车轮速度的控制。(3)控制车模方向:通过控制两个电机之间的转动差速实现车模转向控制。图2.1三个分解后的任务各自独立进行控制。由于最终都是对同一个控制对象(车模的电机)进行控制,所以它们之间存在着耦合。为了方便分析,在分析其中之一时假设其它控制对象都已经达到稳定。比如在速度控制时,需要车模已经能够保持直立控制;在方向控制的时候,需要车模能够保持平衡和速度恒定;同样,在车模平衡控制时,也需要速度和方向控制也已经达到平稳。这三个任务中保持车模平衡是关键。由于车模同时受到三种控制的影响,从车模平衡控制的角度来看,其它两个控制就成为它的干扰。因此对车模速度、方向的控制应该尽量保持平滑,以减少对于平衡控制的干扰。以速度调节为例,需要通过改变车模平衡控制中车模倾角设定值,从而改变车模实际倾斜角度。为了避免影响车模平衡控制,这个车模倾角的改变需要非常缓慢的进行。2.1.2直立控制车模平衡控制是通过负反馈来实现的。因为车模有两个轮子着地[2],车体只会在轮子滚动的方向上发生倾斜。控制轮子转动,抵消在一个维度上倾斜的趋势便可以保持车体平衡了。如图2.2所示。图2.2下面对倒立车模进行简单数学建模,然后建立速度的比例微分负反馈控制,根据基本控制理论讨论车模通过闭环控制保持稳定的条件。假设倒立车模简化成高度为L,质量为m的简单倒立摆,它放置在可以左右移动的车轮上。假设外力干扰引起车模产生角加速度()xt。沿着垂直于车模地盘方向进行受力分析,可以得到车模倾角与车轮运动加速度以及外力干扰加速度()at()xt之间的运动方程。如图2.3所示。图2.3对应车模静止时,系统输入输出的传递函数为:右半平面,因此车模不稳定。车模引入比例、微分反馈之后的系统如下图所示:图2.4加入比例微分反馈后的系统框图这一点,需要k1>g,k2>0。由此可以得出结论,当k1>g,k2>0时,直立车模可以稳定。在角度反馈控制中,与角度成比例的控制量是称为比例控制;与角速度成比例的控制量称为微分控制(角速度是角度的微分)。因此上面系数分别称为比例和微分控制参数。其中微分参数相当于阻尼力,可以有效抑制车模震荡。通过微分抑制控制震荡的思想在后面的速度和方向控制中也同样适用。总结控制车模直立稳定的条件如下:(1)能够精确测量车模倾角θ的大小和角速度θ'的大小;(2)可以控制车轮的加速度。2.2智能车整体结构本次智能车的设计是基于飞思卡尔公司的32位高性能单片机kinetisk60单片机为核心的,以线性CCD为基础的智能车系统。系统主要由单片机最小系统、角度计算传感器,探测道路信息的线性ccd以及电机和电机驱动组成。如图2.5:图2.52.3车模整体车模使用的是官方的c车车模,因为要求直立行走,拆除了前轮及舵机,后轮使用两个4.7w直流伺服电机驱动。整体包括车架、电机、电池、驱动板、主控制板、速度编码器、陀螺仪、加速度计、线性ccd等部件。如图2.6:*图2.6第三章车模机械结构3.1车模简化改装原有车模为了减轻后轮振动对于车体的影响,后轮的支架与底盘之间采用了活动连接方式。但是,为了保证车模直立车体稳定性,需要将原有车模地盘与后轮支架固定在一起。最简便的方式就是可以使用热熔胶在后轮支架与底盘之间的缝隙处进行粘接。这样后轮与车体之间形成一个刚体,便于进行直立控制。如图3.1:图3.1但是这是不够的,为了跟好大加固,再用PCB板加强缝隙部分,作如下处理方式,能更好的加强车体的链接。如图3.2如图3.23.2线性CCD高度选择线性CCD是小车的眼睛,是判别赛道的重要传感器,CCD的安装高度与倾斜度决定了小车的视野大小,如图3.3:图3.3小车视野狭窄会导致小车调整方向时的死区问题,保证赛道黑线在视野范围内,能够使小车及时纠正方向,所以我们使用了30cm高的碳纤维管,来安装CCD。如图3.4:图3.43.3电池的安装方式所有小车的部件安装都要尽量保证小车的重心足够低,而电池是这么多零件中最重的,所以电池的安装位置对小车有很大的影响。我们考虑到影响小车平衡的两个转动惯量,以车轴为轴心的转动惯量和转向的转动惯量,电池安装有两个方案:1,竖直安装,如图3.5图3.52.水平安装,如图3.6:图3.6方案一相对于方案二来说,转向转动惯量虽然小了,但是重心偏高,而且占用了较大的空间,权衡利弊,我们选择了方案二,水平安装,如图3.7:图3.73.4测速编码器的安装编码器是用于测量小车运行速度的,由于小车只沿一个方向运行,就选择了欧姆龙300线的编码器,为了减小因齿轮之间回程差而引起的测速误差,所以选择将编码器的轴通过车轮直接连在电机轴上。齿轮间咬合不宜太紧,否则会增大阻力矩;不宜太松,否则会造成咬合不当,造成误差。如图3.8:图3.83.5陀螺仪与加速度计的位置选择陀螺仪和加速度计的组合是小车最重要的传感器,它们的工作效率决定了小车站立的稳定度,所以为它们选择一个良好的安装位置也是十分重要的。因为陀螺仪测得的是角速度,所以水平放置就可以了,而加速度计测得的是传感器一面所受的感应力,所以小车的前后摆动和加速与减速都会对加速度计造成干扰,所以怎样减少传感器垂直轴上的干扰是安装加速度计时要考虑的首要问题。经过观察,我们发现,越接近单摆轴的地方干扰越小,所以我们选择了相对靠下的位置,如图3.9:图3.93.6主板与驱动板的安装固定重心过高会造成车模的不稳定容易跌倒,所以为了减小重心高度将主板安装在电机上方的位置,并用热熔胶将其固定,防止掉落。驱动板则固定在电机的正上方,为了防止破坏赛道,将其用薄泡沫盖住。如图3.10:图3.103.7轮胎处理轮胎粘死,轮胎的橡胶部分和轮毂用502粘死,搞的里面像充足气一样。

好处是过弯时没有轮胎和轮毂的错位导致转角没有转到位。如图3.11:图3.11打磨轮胎,众所周知,新轮胎的摩擦力是不足的,需要进行打磨处理,这个如何打磨貌似有很多方法,但是归到最终就是多在赛道上磨合,然后比赛的时候保留一份轮子。轮子中间有凸起的一圈,尽量去掉和磨平。如图3.12图3.123.8各个模块的连接为了降低连接线的重量,及减少线的故障率,使线清晰,不乱,易于检查接线故障,所以决定自己做的接线,编码器的部分直接插在主板槽上,减少接线如图3.13图3.13第四章硬件配置与电路设计4.1微处理器选择根据第八届飞思卡尔细则我们选择了K60芯片作为微控制器,K60是32微处理器,处理速度足以满足实际需求,而且容易下得K60开发的底层库,以野火的底层最为出名,大大节省开发时间与周期,使编程变得容易。我们选择了市场上价格相对便宜的一款K60系统版

K60的常用外设PWM:三个FTM模块,可提供8路以上PWM通道AD:两个16位ADC模块,可测8,10,12,16位精度PIT:四个通用中断定时器,32位计数器低功耗时钟(LPTimer):可用于累计脉冲通信接口:CAN,

SPI,

I²C

UART

通用I/O口(GPIO):除特殊引脚及电源引脚外的其他引脚都可配置为GPIO.DMA模块:

DMA控制器提供可编程的通道,为8位、16位、32位、128位提供双地址存取传送。4.2资源需求分析根据实际方案可以得到实际所需的处理器资源如下(1)4路PWM:用于电机正反转。(2)4路AD:一路测加速度,一路测陀螺仪,一路测CCD,还有一路预留。(3)UART:用于程序调试,与上位机通信(4)GPIO若干:用于液晶显示,按键及其他(5)2路DMA:通过DMA的特殊特点进行测速。4.3电源模块单片机使用5v或者3.3v直流电源,其他模块如陀螺仪、加速度计、液晶屏、线性ccd都使用5v电源,而比赛规定电池为7.2v直流电源,所以我们使用了线性稳压器LM2940作为各个模块的电源,考虑到多个模块使用同一片稳压器会导致稳压器发热量大,工作不稳定,所以我们做了两路电源,对模块电源的使用做了合理分配。第一路电源主要用于单片机,陀螺仪,加速度计等重要模块的电源供电,防止电源不稳定带来采集误差。第二路电源主要用于CCD,液晶显示,编码器,驱动板等对电源稳定性要求不高设备的供电。LM2940输出电压固定的低压差三端稳压器;输出电压5V;输出电流1A;输出电流1A时,最小输入输出电压差小于0.8V;最大输入电压26V;工作温度-40~+125℃4.4电机驱动模块Bts7970是NovalithIC家族三个独立的芯片的一部分:一是p型通道的高电位场效应晶体管,二是一个n型通道的低电位场效应晶体管,结合一个驱动晶片,形成一个完全整合的高电流半桥。两片bts7970构成H桥驱动电机,使得小车具有良好的低速性能。一片hc244增强单片机引脚负载能力,确保输出稳定。第五章软件设计5.3软件功能框架软件的主要功能(1)各传感器信号的采集(2)电机PWM输出;(3)车模运行控制:直立控制,速度控制,转向控制(4)车模运行流程控制:程序初始化、车模启动与结。(5)车模信息显示:状态显视与参数设定等。上述功能可以分成两大类:第一类包括1-3功能,它们属里完成。第二类包括4-5功能。它的执行不需要精确的时间周期。可以放在程序的主程序中完成。这两类任务之间可以通过全局变量实现相互的通讯。如图5.1:如图5.15.4K60的硬件资源配置CCD1SI1PTA26AO1PTB1CLK1PTA27CCD2/预留SI2PTA24AO2PTB0CLK2PTA25OLEDCSPTA11DCPTA12RSTPTA13D1PTA14D0PTA15LEDLED1PTA11LED2PTA16按键KEY1~KEY6PTD0~5蓝牙TXPTD7RXPTD6PWMR+PTC1R-PTC2L+PTC3L-PTC4编码器1PTC52PTC6陀螺仪ENCPTB2加速度计MMAPTB3表5.15.5主要算法及实现直立控制由直立控制的理论分析可知,直立控制需要实际的车模角度,那就要用AD采集到加速度计与陀螺仪的值进行转化,由于加速度计易受干扰,陀螺仪具有温漂,所以采用凯尔曼滤波进行角度融合,从而滤波。凯尔曼滤波函数floatkalman(constfloatgyro_m,constfloatincAngle)//只读变量不可以修改{//陀螺仪角度floatK_0;//含有卡尔曼增益的另外一个函数,用于计算最优估计值floatK_1;//含有卡尔曼增益的函数,用于计算最优估计值的偏差floatY_0;floatY_1;floatRate;floatPdot[4];floatangle_err;//角度偏量floatE;staticfloatangle=0;//下时刻最优估计值角度staticfloatq_bias=0;//最优估计值的偏差staticfloatP[2][2]={{1,0},{0,1}};Rate=gyro_m-q_bias;Pdot[0]=Q_angle-P[0][1]-P[1][0];//卡尔曼增益矩阵Pdot[1]=-P[1][1];Pdot[2]=-P[1][1];Pdot[3]=Q_gyro;angle+=Rate*dt;P[0][0]+=Pdot[0]*dt;//计算协方差矩阵P[0][1]+=Pdot[1]*dt;P[1][0]+=Pdot[2]*dt;P[1][1]+=Pdot[3]*dt;angle_err=incAngle-angle;E=R_angle+P[0][0];K_0=P[0][0]/E;K_1=P[1][0]/E;Y_0=P[0][0];Y_1=P[0][1];P[0][0]-=K_0*Y_0;//跟新协方差矩阵P[0][1]-=K_0*Y_1;P[1][0]-=K_1*Y_0;P[1][1]-=K_1*Y_1;angle+=K_0*angle_err;//给出最优估计值q_bias+=K_1*angle_err;//跟新最优估计值偏差returnangle;}直立控制PIDVoidStandConTrol(){Pwm=(int)(StandP*(-angleout+AngleG)+StandD*(-AngleDot));}StandP是直立P参数StandD是直立D参数Angleout是滤波角度AngleDot是角加速度AngleG表示设定角度速度控制速度控制需要测量实际速度用到编码器,由于K60本身只有一个测速的LPTMR模块,所以另一路要有别的进行测速,根据野火提供的底层库,可以选择DMA或者FTM测速,由于FTM测速占用PWM模块,所以统一用DMA来测速。测速初始化DMA_count_Init(DMA_CH4,PTC6,600,DMA_rising);DMA_count_Init(DMA_CH3,PTE4,600,DMA_rising);测速函数voidPulseGet(){cd45q=cd45h;////////////////////if(CarStopPulseCountFlag)//CarStopPulseCount+=cd45h;/////////////////cd45h=DMA_count_get(DMA_CH4);DMA_count_reset(DMA_CH4);//gmpq=gmph;//gmph=LPTMR0_CNR;//lptmr_counter_clean();gmpq=gmph;gmph=DMA_count_get(DMA_CH3);DMA_count_reset(DMA_CH3);if(cd45h>200)cd45h=250;if(gmph>200)gmph=250;LeftPulse+=cd45h;//SpeedFilter(cd45h);//ic5=SpeedFilter(cd45q);RightPulse+=gmph;//SpeedFilter(gmph);//ic6=SpeedFilter(gmpq);}速度计算函数,读取5次脉冲求平均值,以相对速度代替实际速度即脉冲个数voidSpeedCount(){sudu=(LeftPulse+RightPulse)/2.0/5.0;//五次平均速度哦LeftPulse=0;RightPulse=0;if(SpeedIFlag==0&&sudu>70)SpeedIFlag=1;if(SpeedIFlag==1)sudu_dot+=(SpeedSet-sudu);//速度的积分if(sudu_dot>50)sudu_dot=50;//积分限幅if(sudu_dot<-50)sudu_dot=-50;//积分限幅}速度闭环函数VoidSpeedColtrol(){SpeedControlOut=SpeedP*(SpeedSet-sudu)+SpeedI*sudu_dot}转向控制转向控制要得到赛道的信息,就需要处理光电传感器的采集值。线性CCD这个模块有一般有五个PIN,其中VCC和GND是电源,建议给低噪声的电源电压,特别是地线的连接质量一定不能差。SI和CLK是信号输入:注意对于模块是输入,单片机需要配置为输出AO是模拟信号输出:对于单片机需要配置为模拟输入,并启用ADC转换功能图5.2图5.2是单个像素积分器的结构,当S1在1的位置时,开关是断开的,简单分析可得电容上流过的电流和光电器件的光生电流相等,这个电路对光生电流进行积分。而当S1在2的位置时,积分电容被短路,释放积累的电荷。S2用来采样输出,不输出(第129个CLK之后)时,接在1的位置上保持采样电容电压和运放输出一致,当轮到这个像素输出的时,打到3的位置,其他像素输出时在2的位置。图5.3图5.4上面图是时序图(图5.3),简要说明下,CLK是一个上升沿触发的信号,采样一次数据的时候,首先把SI拉高,然后把CLK拉高这时候AO上已经出现了第1个(这里数数的方式是正常人数法不是程序员数法)像素的模拟电压,然后把SI拉低否则积分复位电路工作可能不正常,连续输入128个CLK(指的是上升沿)以后,128个模拟电压已经传输完毕。根据龙丘的CCD模块参考程序编写了自己的CCD采集程序CCD采集函数intGetADSample(){unsignedchari;unsignedintATD0DR0_RETURN;//ATD0CTL5=0x32;_CLK_=1;//起始电平高_SI_=0;//起始电平低CCD_DelayNS();//合理的延时_SI_=1;//上升沿_CLK_=0;//下降沿CCD_DelayNS();//合理延时_CLK_=1;//上升沿_SI_=0;//下降沿CCD_DelayNS();//合理延时CCD_DelayMS();//合理延时for(i=0;i<128;i++){_CLK_=0;//下降沿CCD_DelayNS();//合理延时CCD_DelayNS();CCD_DelayNS();ATD0DR0_RETURN=Pixel[i]=(ad_once(ADC0,SE9,ADC_12bit))-BlackCCDV;//读取ADC1_SE6a,12位精度//////////////////////////////////////ccdwatch[i]=Pixel[i]>>2;///////////////////////////////////////_CLK_=1;//上升沿CCD_DelayNS();//合理延时CCD_DelayNS();CCD_DelayNS();}returnATD0DR0_RETURN;}上面用数组Pixel保存了128个采样值,接下来就是要从128个值中得到赛道信息,由于黑带的光照强度弱,白带强,则可以通过边沿或静态的阈值来判断。由于调试地方光照均匀就采用静态阈值法,阈值以上为白色赛道,阈值以下为黑色胶带,通过计算两边白带里中性点的距离之差来判断赛道转向。CCD处理函数voidAnalysisPixel1(){unsignedchari;unsignedcharcount_one_left=0,count_one_right=0;unsignedcharcount_zero_left=0,count_zero_right=0;unsignedcharflag_left=1,flag_right=1;intdelta_CCD_result;//,acc_CCD_result;for(i=0;i<64;i++){if(Pixel[64-i]>_COMP_VALUE_&&flag_left)count_one_left++;elsecount_zero_left++;if(Pixel[64+i]>_COMP_VALUE_&&flag_right)count_one_right++;elsecount_zero_right++;if(count_zero_left>3){flag_left=0;}if(count_zero_right>3){flag_right=0;}if(flag_left==0&&flag_right==0)break;}if(count_one_left==64&&count_one_right==64){CCD_result[_LEFT_]=0;CCD_result[_RIGHT_]=0;}elseif(count_one_left==0&&count_one_right==0){//CCD_result[_LEFT_]=0;//CCD_result[_RIGHT_]=0;}elseif(count_one_left<64&&count_one_right<64){CCD_result[_LEFT_]=count_one_left;CCD_result[_RIGHT_]=count_one_right;}elseif(count_one_left<64&&count_one_right==64){CCD_result[_LEFT_]=count_one_left;CCD_result[_RIGHT_]=70;//count_one_right;}elseif(count_one_left==64&&count_one_right<64){CCD_result[_LEFT_]=70;//count_one_left;CCD_result[_RIGHT_]=count_one_right;}delta_CCD_result=CCD_result[_RIGHT_]-CCD_result[_LEFT_];//acc_CCD_result=CCD_result[_LEFT_]+CCD_result[_RIGHT_];//if(acc_CCD_result==0)acc_CCD_result=1;if(delta_CCD_result>0)RIGHT_LED=0,LEFT_LED=1;if(delta_CCD_result<0)RIGHT_LED=1,LEFT_LED=0;if(delta_CCD_result>=-5&&delta_CCD_result<=5){p_CCD_result=(1.0*delta_CCD_result)/70;//acc_CCD_result;}else{p_CCD_result=(1.0*delta_CCD_result)/70;//acc_CCD_result;}//////////////////////ic1=delta_CCD_result;//ic2=acc_CCD_result;////////////////////AjustDrectionPD(delta_CCD_result);/////////////////////}根据得到的差,乘以比例系数来得到实际的转向PWM,但是由于车体转动会存在转动惯量,会使转向过冲,车么冲出赛道,所以要去两次转向之差作为D,即转向进行PD调节。转向控制。voidDrectionCount(){DirectionOut=DrectionP*MidErr/70.0+DrectionD*MidErrErr/70.0/0.006;}起跑线检测:起跑线是位于直道的两段黑带组成,检测的主要难度就是误判,主要有黑色路障误判,虚线误判等,通过观察可知在直道上ccd可以看到两条边线,当看到起跑线是必然会产生突变沿,通过检测上升或下降沿便可以的达到检测器跑向的目的。/////////////////////////////////起跑线检测条件if(ABS(DeltAngle)<3&&LostTypeArray[7]==NoneLost&&CarStartLineCheckFlag&&!StartLineFlag){if(LostTypeArray[0]!=Obstacle&&LostTypeArray[1]!=Obstacle&&LostTypeArray[2]!=Obstacle&&LostTypeArray[3]!=Obstacle&&LostTypeArray[4]!=Obstacle&&LostTypeArray[5]!=Obstacle&&LostTypeArray[6]!=Obstacle&&LostTypeArray[8]!=Obstacle&&LostTypeArray[9]!=Obstacle&&LostTypeArray[10]!=Obstacle&&LostTypeArray[11]!=Obstacle&&LostTypeArray[12]!=Obstacle&&LostTypeArray[13]!=Obstacle&&LostTypeArray[14]!=Obstacle){if((LostTypeArray[6]!=WhiteLost&&LostTypeArray[6]!=BlackLost)&&(LostTypeArray[5]!=WhiteLost&&LostTypeArray[5]!=BlackLost)&&(LostTypeArray[4]!=WhiteLost&&LostTypeArray[4]!=BlackLost)){if((MidSumArray[7]+30)<MidSumArray[6])StartLineFlag=1;}if((LostTypeArray[8]!=WhiteLost&&LostTypeArray[8]!=BlackLost)&&(LostTypeArray[9]!=WhiteLost&&LostTypeArray[9]!=BlackLost)&&(LostTypeArray[10]!=WhiteLost&&LostTypeArray[10]!=BlackLost)){if((MidSumArray[7]+30)<MidSumArray[8])StartLineFlag=1;}}/////////////////////////////////*/第六章开发工具介绍6.1IAR开发平台6.1.1开放平台介绍IARSystems是全球领先的嵌入式系统开发工具和服务的供应商。公司成立于1983年,提供的产品和服务涉及到嵌入式系统的设计、开发和测试的每一个阶段,包括:带有C/C++编译器和调试器的集成开发环境(IDE)、实时操作系统和中间件、开发套件、硬件仿真器以及状态机建模工具。作品以K60芯片为处理器,所以选用IAR为编译环境,进行交叉编译。6.1.2下载工具介绍我们选择的蓝普兰德系统版有J-TAG下载口,因此选择J-LINK进行下载,系统版也具有BOOTLOADER下载方式,但是不利于在线调试因此只用了J-LINK下载器。 J-Link是SEGGER公司为支持仿真ARM内核芯片推出的JTAG仿真器。配合IAREWAR,ADS,KEIL,WINARM,RealView等集成开发环境支持所有ARM7/ARM9/ARM11,CortexM0/M1/M3/M4,CortexA4/A8/A9等内核芯片的仿真,与IAR,Keil等编译环境无缝连接,操作方便、连接方便、简单易学,是学习开发ARM最好最实用的开发工具。6.1.3野火底层库介绍K60芯片寄存器众多,让我们非专业的学生去写底层不太现实,在网上有野火的底层库,比较完善,也比较好用,为我们K60程序的编写带来很大方便,摆脱苦苦纠缠的底层配置,下面就我们做智能车用到的一些做简单介绍。FTMPWM模块voidFTM_PWM_init(FTMn,CHn,u32freq,u32duty);功能说明初始化FTM的边沿PWM模式,设置频率和占空比。调用例子FTM_PWM_init(FTM1,CH0,35000,50);//初始化FTM1_CH0频率为35kHZ,占空比为50%的PWM该函数可以在程序中初始换PWM口,以改变占空比非常方便。GPIO模块函数原型voidgpio_init(PORTx,u8n,GPIO_CFG,u8data);//初始化gpio功能说明初始化gpio,设置端口的输入输出方向,输出数据。初始化后,才能对IO口进行读取或电平设置。调用例子gpio_init(PORTA,27,GPO,1);//初始化PTA27为输出方向,高电平gpio_init(PORTA,26,GPI,0);//初始化PTA26为输入方向UART模块函数原型voiduart_init(UARTn,u32baud);功能说明初始化uartx模块调用例子uart_init(UART1,19200);//初始化串口1波特率为19200函数原型voiduart_putchar(UARTn,charch);功能说明发送1个字节。传递参数参考形参变量的命名及其作用。调用例子uart_putchar(UART1,'F');//发送一个字符'F'函数原型charuart_getchar(UARTn);功能说明无限等待接受1个字节。函数返回一个字符。调用例子ch=uart_getchar(UART1);//等待串口1发送数据,接收到后保存在变量chADC模块adc_init函数原型voidadc_init(ADCn,ADC_Ch);功能说明初始化ADC模块调用例子adc_init(ADC1,SE16);//初始化ADC1_SE16通道函数原型u16ad_once(ADCn,ADC_Ch,ADC_nbit);功能说明采样一次一路模拟量的AD值函数返回返回采样数值。按采集精度来返回不同大小,16位精度最大返回:65535调用例子result=ad_once(ADC1,SE16,ADC_16bit);//在ADC1_SE16上采样一次16位精度PIT定时中断模块函数原型voidpit_init(PITn,u32cnt);功能说明初始化PITn,并设置定时时间(单位为bus时钟周期)调用例子pit_init(PIT0,100000);//初始化PIT0,定时100000个时钟周期MCG模块超频函数原型unsignedchar(clk_option);//锁相环初始化功能说明初始化锁相环,设置系统频率。超频就是调用这函数。调用例子pll_init(PLL100);//初始化锁相环为100MHz6.2辅助调试软件6.2.1蓝宙CCD助手6.2.2下位机数据格式需要用户填充原始数据,发送函数转化为ASCII码后发送发送函数添加表一帧格式实例:①、发送CCD数据到上位机使用unsignedcharSciBuf[200];//发送数据SciBuf[0]=0;//长度高字节,此设置为0SciBuf[1]=128+4;//132SciBuf[2]=0;//保留字节,设置为0SciBuf[3]=0;//保留字节,设置为0SciBuf[4]=0;//保留字节,设置为0SciBuf[5]=0;//保留字节,设置为0//填充CCD数据,共128字节SciBuf[6]=24;SciBuf[7]=16;SciBuf[8]=8;SciBuf[9]=225;…SCI_SendData(&SciBuf[0]);//发送到上位机②、SCI_SendData向PC发送一帧数据,与硬件无关。unsignedcharSCI_SendData(unsignedchar*data){intlen;unsignedcharlrc=0;PutChar('*');//发送帧头,一个字节len=(int)(data[0]<<8)|(int)(data[1]);data+=2;//调整指针PutChar('L');//发送帧类型,共两个字节PutChar('D');while(len--)//发送数据的ASCII码,含保留字节和CCD数据{SendHex(*data);lrc+=*data++;}lrc=0-lrc;//计算CRC,可以为任意值SendHex(lrc);//发送CRC校验ASCIIPutChar('#');//发送帧尾,一个字节}③、SendHex把一个8位数以ASCII的形式通过,与硬件无关。voidSendHex(unsignedchardata){unsignedchartemp;temp=data>>4;if(temp>=10){PutChar(temp-10+'A');}else{PutChar(temp+'0');}temp=data&0x0F;if(temp>=10){PutChar(temp-10+'A');}Else{PutChar(temp+'0');}}④、PutChar()为发送串口数据函数,和用户硬件相关。6.2.3蓝牙调试串口助手模块说明:该串口蓝牙模块分为主机模块和从机模块,其中主机模块为USB接口,装上电脑并安装驱动就可以使用,主机模块可以搜索并和与之匹配的蓝牙从机模块通信,从机模块必须由蓝牙主机设备与其连接通信如带蓝牙功能的手机等设备,只有主从之间才能连接通信,从机与从机不能进行通信。如果同时购买了主机和从机模块,两个模块上电后自动匹配连接不需要密码,假如是手机跟从机模块连接则需要输入出厂默认的密码:1234USB蓝牙主机实物图:主机模块带可恢复保险丝,以免贵重的电脑意外损坏。主机模块中STATE为状态指示灯,无设备连接是闪烁状态,设备连接成功为长亮状态。POWER为电源指示灯。按一下按键主机就会从新搜索从机设备。从机模块实物图:从机可以安装在小车主板等需要采集数据的主板上,供电电压为5V,带有防反接功能。STATE为状态指示灯,无设备连接是闪烁状态,设备连接成功为长亮状态,POWER为电源指示灯。二、使用方法:2.1主机:主机模块插在电脑USB口之前可以先双击安装驱动程序:安装完之后把主机模块插上电脑就可以使用了。最简单的测试蓝牙模块是否正常方法就是:主机插上已安装好驱动的电脑,从机模块供电,将从机模块的RX和TX接线端短接,这样就是收发环回,电脑打开串口调试工具,发送什么内容就会接收什么内容,就说明蓝牙模块正常。记得每次要先退出串口调试工具后再拔掉电脑上的蓝牙模块。2.2从机:蓝牙模块从机的RX要与MCU的TX连接,蓝牙模块从机的TX要与MCU的RX连接。蓝牙从机未配对时电流约30mA,配对后约10mA。三、蓝牙模块参数修改指令集:一、出厂默认参数:波特率:9600,配对密码:1234;二、AT命令集如下:1、测试通讯发送:AT(返回OK,一秒左右发一次)返回:OK2、改蓝牙串口通讯波特率发送:AT+BAUD1返回:OK1200发送:AT+BAUD2返回:OK2400……1120022400348004960051920063840075760081152009230400A460800B921600C1382400不建议用在超过115200的波特率,信号的干扰会使系统不稳定。设置超过115200后用电脑无法使用,要用单片机编程于高于115200才能使用此波特率和重新发AT命令设低波特率用AT命令设好波特率后,下次上电使用不需再设,可以掉电保存波特率。虚拟示波器该虚拟示波器有四个通道CH1,CH2,CH3,CH4,可同时显示四个通道的曲线以不同颜色标识,方便选择。使用时需要在下位机的程序安装具体的通信协议进行发送数据。具体协议如下:unsignedshortCRC_CHECK(unsignedchar*Buf,unsignedcharCRC_CNT)//用于CRC校验{unsignedshortCRC_Temp;unsignedchari,j;CRC_Temp=0xffff;for(i=0;i<CRC_CNT;i++){CRC_Temp^=Buf[i];for(j=0;j<8;j++){if(CRC_Temp&0x01)CRC_Temp=(CRC_Temp>>1)^0xa001;elseCRC_Temp=CRC_Temp>>1;}}return(CRC_Temp);}voidOutPut_Data(void)//将四个通道数据加上校验发送出去{inttemp[4]={0};unsignedinttemp1[4]={0};unsignedchardatabuf[10]={0};unsignedchari;unsignedshortCRC16=0;for(i=0;i<4;i++){temp[i]=(int)OutData[i];temp1[i]=(unsignedint)temp[i];}for(i=0;i<4;i++){databuf[i*2]=(unsignedchar)(temp1[i]%256);databuf[i*2+1]=(unsignedchar)(temp1[i]/256);}CRC16=CRC_CHECK(databuf,8);databuf[8]=CRC16%256;databuf[9]=CRC16/256;for(i=0;i<10;i++)//printf("%c",databuf[i]);uart_putchar(UART0,databuf[i]);}通过定义OutData[4]数组,然后对数组元素赋值,再调用OutPut_Data()函数,就能完成数据的发送。通过上述蓝牙模块主从设备,将有下位机传来的角度,速度,转向的信息变成实时的曲线显示出来,从而改善预期效果,与实际之间的偏差。第七章参数调试车模制作与软件开发为车模运行打下了基础,是否运行的稳定和快速需要通过车模精心的调试才能够完成。调试过程同时也可以使得同学们加深对于控制算法物理过程深刻理解,提高解决实际工程问题的能力,为寻找更加优化的车模设计方案打下基础。调试过程对于竞赛车模制作非常重要。车模调试分为调试准备、静态参数整定、动态参数整定、车模机械调整和竞赛策略制定等各个环节。整个调试中涉及到的参数和部件非常多,而且这些参数之间还有着紧密的相互影响。如果对于其中的物理过程认识不清,有没有正确的调试步骤,那么在调试过程中出现的各种错误现象就会掩盖正确的原因,影响整个调试进程,甚至会动摇制作的信心。7.1调试参数陀螺仪静态零点值:将车模静止防止,观察液晶屏上的采集量,从而确定陀螺仪静态零点值。加速度计静态零点值:将车模置于竖直状态观察液晶屏显示采集量,从而确定加速度计零点值。为了预防环境变化而引起零点漂移,可以在程序里设置自动采集程序,开机时,将车模置于垂直状态,并尽量保持静止,然后自动采集。CCD阈值采集:将车模置于赛道分别在背景色与赛道,观察液晶屏,然后取中间值。直立调试:直立调试主要就是凯尔曼参数的调节,凯尔曼共有(加速度计精度)Q_angle,(陀螺仪精度)Q_gyro,(过程方差)R_angle,(采样时间)dt,四个参数,(加速度计精度)Q_angle,(陀螺仪精度)Q_gyro可有数据手册大至知道,dt也比较容易确定,主要就是相邻两次滤波时间间隔,接下来就是R_angle,要通过反复调试得到。实际调试得到R_angle越小跑起来越抖,R_angle越大滤出角度越不稳定。下面是用虚拟示波器观察出来的,加速度计,与滤波出来角度的比较:黄色是加速度计,粉色是滤出来的波形,可知加速度计易受干扰,滤出波形比较平滑上图是小车直立时的波形图,角度基本不变,略有变化。转向调试:转向有两个参数转向的P与转向的D,P与D根据实际测试效果取得,但是要对参数进行优化,就要经过上位机观察。下边几幅图比较不同P值下的转向效果:在不同的P值下观察在知道上车模(蓝色曲线)摆幅,便可以得到一个较好的P值参考文献野火小霸王系列光盘.三天入门M4—Kinetis(v2.2)竞赛秘书处:第七届全国大学生“飞思卡尔”杯智能汽车竞赛电磁组直立行车参考设计方案(版本2.0).2012.卓晴,黄开胜,邵贝贝.学做智能车[M].3.北京:北京航空航天大学出版社,2007年3月.谭浩强.C程序设计(第三版)[M].2.北京:清华大学出版社,2005年1月.马建伟,李银伢.满意PID控制设计理论与方法[M].1.北京:科学出版社,2007.附录程序voidd2c(u8*s,constchar*ss,floatch)//数字转换字符串{chari;if(ss[0]=='%'&&ss[1]=='d')sprintf((char*)s,"%d",(int)ch);if(ss[0]=='%'&&ss[1]=='f'){sprintf((char*)s,"%d",(int)(ch*100));for(i=0;s[i]!=0;i++);if(i==1||i==0){s[3]=s[1];s[2]=s[0];s[1]='0';s[0]='.';}else{s[i+1]=s[i];s[i]=s[i-1];s[i-1]=s[i-2];s[i-2]='.';}if(s[1]=='-'){s[1]='.';s[0]='-';}}}unsignedshortCRC_CHECK(unsignedchar*Buf,unsignedcharCRC_CNT){unsignedshortCRC_Temp;unsignedchari,j;CRC_Temp=0xffff;for(i=0;i<CRC_CNT;i++){CRC_Temp^=Buf[i];for(j=0;j<8;j++){if(CRC_Temp&0x01)CRC_Temp=(CRC_Temp>>1)^0xa001;elseCRC_Temp=CRC_Temp>>1;}}return(CRC_Temp);}voidOutPut_Data(void){inttemp[4]={0};unsignedinttemp1[4]={0};unsignedchardatabuf[10]={0};unsignedchari;unsignedshortCRC16=0;for(i=0;i<4;i++){temp[i]=(int)OutData[i];temp1[i]=(unsignedint)temp[i];}for(i=0;i<4;i++){databuf[i*2]=(unsignedchar)(temp1[i]%256);databuf[i*2+1]=(unsignedchar)(temp1[i]/256);}CRC16=CRC_CHECK(databuf,8);databuf[8]=CRC16%256;databuf[9]=CRC16/256;for(i=0;i<10;i++)//printf("%c",databuf[i]);uart_putchar(UART0,databuf[i]);}voidPwmchange(){unsignedintleftval,rightval;if(pwmleft<-1000)pwmleft=-1000;if(pwmright<-1000)pwmright=-1000;if(pwmleft>1000)pwmleft=1000;if(pwmright>1000)pwmright=1000;rightval=(int)(pwmright*pwmradio);leftval=(int)pwmleft;if((pwmright>=0)&&(pwmleft>=0)){FTM_PWM_init(FTM0,CH0,20000,rightval);FTM_PWM_init(FTM0,CH1,20000,0);FTM_PWM_init(FTM0,CH2,20000,leftval);FTM_PWM_init(FTM0,CH3,20000,0);}elseif((pwmright>=0)&&(pwmleft<0)){leftval=-leftval;FTM_PWM_init(FTM0,CH0,20000,rightval);FTM_PWM_init(FTM0,CH1,20000,0);FTM_PWM_init(FTM0,CH2,20000,0);FTM_PWM_init(FTM0,CH3,20000,leftval);}elseif((pwmright<0)&&(pwmleft>=0)){rightval=-rightval;FTM_PWM_init(FTM0,CH0,20000,0);FTM_PWM_init(FTM0,CH1,20000,rightval);FTM_PWM_init(FTM0,CH2,20000,leftval);FTM_PWM_init(FTM0,CH3,20000,0);}elseif((pwmright<0)&&(pwmleft<0)){leftval=-leftval;rightval=-rightval;FTM_PWM_init(FTM0,CH0,20000,0);FTM_PWM_init(FTM0,CH1,20000,rightval);FTM_PWM_init(FTM0,CH2,20000,0);FTM_PWM_init(FTM0,CH3,20000,leftval);}}voidfall_down(){FTM_PWM_init(FTM0,CH0,20000,0);FTM_PWM_init(FTM0,CH1,20000,0);FTM_PWM_init(FTM0,CH2,20000,0);FTM_PWM_init(FTM0,CH3,20000,0);}voidcorner(){//AnalysisPixel();//AnalysisPixelNew();AnalysisPixel1();//AnalysisPixelDown();Leaving=p_CCD_result;as=Leaving;}floatkalman(constfloatgyro_m,constfloatincAngle)//只读变量不可以修改{//陀螺仪角度floatK_0;//含有卡尔曼增益的另外一个函数,用于计算最优估计值floatK_1;//含有卡尔曼增益的函数,用于计算最优估计值的偏差floatY_0;floatY_1;floatRate;floatPdot[4];floatangle_err;//角度偏量floatE;staticfloatangle=0;//下时刻最优估计值角度staticfloatq_bias=0;//最优估计值的偏差staticfloatP[2][2]={{1,0},{0,1}};Rate=gyro_m-q_bias;Pdot[0]=Q_angle-P[0][1]-P[1][0];//卡尔曼增益矩阵Pdot[1]=-P[1][1];Pdot[2]=-P[1][1];Pdot[3]=Q_gyro;angle+=Rate*dt;P[0][0]+=Pdot[0]*dt;//计算协方差矩阵P[0][1]+=Pdot[1]*dt;P[1][0]+=Pdot[2]*dt;P[1][1]+=Pdot[3]*dt;angle_err=incAngle-angle;E=R_angle+P[0][0];K_0=P[0][0]/E;K_1=P[1][0]/E;Y_0=P[0][0];Y_1=P[0][1];P[0][0]-=K_0*Y_0;//跟新协方差矩阵P[0][1]-=K_0*Y_1;P[1][0]-=K_1*Y_0;P[1][1]-=K_1*Y_1;angle+=K_0*angle_err;//给出最优估计值q_bias+=K_1*angle_err;//跟新最优估计值偏差returnangle;}unsignedintSpeedFilter(unsignedintpulse){staticunsignedcharSpeedLEN=6,pdata=0,pmax=0,pmin=5;//pmax给小,pmin給大staticunsignedintSpeedRecord[6]={0,0,0,0,0,888};unsignedchari;unsignedintaverage=0;pdata=(pdata+1)%SpeedLEN;SpeedRecord[pdata]=pulse;if(pulse==0)pmax=pdata,pmin=pdata;for(i=0;i<SpeedLEN;i++)average+=SpeedRecord[i];/*******去除被认为是脉冲的数据******/if(pulse>SpeedRecord[pmax])pmax=pdata;//得到最大值的指针elseif(pulse<SpeedRecord[pmin])pmin=pdata;//得到最小值的指针average=average-SpeedRecord[pmax]-SpeedRecord[pmin];//减去脉冲return(average>>2);//求算术平均值}voidPulseGet(){cd45q=cd45h;////////////////////if(CarStopPulseCountFlag)//CarStopPulseCount+=cd45h;/////////////////pp+=cd45h;cd45h=DMA_count_get(DMA_CH3);DMA_count_reset(DMA_CH3);//gmpq=gmph;//gmph=LPTMR0_CNR;//lptmr_counter_clean();gmpq=gmph;gmph=DMA_count_get(DMA_CH4);DMA_count_reset(DMA_CH4);if(cd45h>250)cd45h=250;if(gmph>250)gmph=250;LeftPulse+=cd45h;//SpeedFilter(cd45h);//ic5=SpeedFilter(cd45q);RightPulse+=gmph;//SpeedFilter(gmph);//ic6=SpeedFilter(gmpq);}voidSpeedCount(){sudu=(LeftPulse+RightPulse)/2.0/5.0;LeftPulse=0;RightPulse=0;if(SpeedIFlag==0&&sudu>70)SpeedIFlag=1;if(SpeedIFlag==1)sudu_dot+=(SpeedSet-sudu);if(sudu_dot>50)sudu_dot=50;if(sudu_dot<-50)sudu_dot=-50;}voidcountsudu2(){intaa,suduxx2c,suduxxc;staticintpulsecount=0;//记录有效脉冲次数suduxx2c=sududmaflag*30000+cd45h;//-cd45q;//前后两次之差即使时间段内的脉冲数即速度suduxxc=suduflag*30000+gmph;//-gmpq;//48ms脉冲数//每2次平均一次if(suduxx2c>200||suduxxc>200)//简单滤毛刺//if(suduxx2c+50<suduxx2[flagsudu]||suduxx2c-50>suduxx2[flagsudu]||suduxxc+50<suduxx[flagsudu]||suduxxc-50>suduxx[flagsudu]){suduxx2[flagsudu]=0;suduxx[flagsudu]=0;}else{pulsecount++;suduxx2[flagsudu]=suduxx2c;suduxx[flagsudu]=suduxxc;}flagsudu++;if(flagsudu==5){flagsudu=0;sudu1=0;sudu2=0;if(pulsecount!=0){for(aa=0;aa<pulsecount;aa++){sudu1+=suduxx[aa];sudu2+=suduxx2[aa];}sudu1/=pulsecount;sudu2/=pulsecount;//ic5=sudu1;//ic6=sudu2;sudu=((sudu1+sudu2)/2)*0.35+0.6

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论