koorio.com
海量文库 文档专家
当前位置:首页 >> 文学 >>

第八届飞思卡尔光电平衡组华东交通大学-追风队技术报告


第八届“飞思卡尔”杯全国大学生 智能汽车竞赛技术报告



校:华东交通大学

队伍名称:追风队 参赛队员:黄健 刘勇勇 张望 带队教师:甘岚 涂春萍

关于技术报告和研究论文使用授权的说明
本人完全了解第八届“飞思卡尔”杯全国大学生智能汽车邀请赛关保留、 使用技术报告和研究论文的规定,即:参赛作品著作权归参赛者本人,比赛组 委会和飞思卡尔半导体公司可以在相关主页上收录并公开参赛作品的设计方 案、技术报告以及参赛模型车的视频、图像资料,并将相关内容编纂收录在组 委会出版论文集中。

参赛队员签名: 带队教师签名: 日 期: ____________

II

摘要
本文记录了华东交通大学追风队队员在准备第八届“飞思卡尔”杯全国智能汽车竞赛 中的工作成果和体会,并总结了方案中成功的经验和不足之处,愿与各高校代表队分享。 本智能车系统以飞思卡尔高性能 16 位单片机 MC9S12XS128 为核心,通过用线性 CCD 检 测赛道两边的黑线来引导小车行驶,用编码器来检测小车的速度。使用陀螺仪和加速度计 检测小车的直立信息,通过 AD 采样获得当前 CCD 在赛道上的位置信息,运用红外对管检测 起跑线完成自动启停,使用 PID 算法控制小车方向和分段 PID 算法对小车进行速度控制, 实现稳定快速的运行。 关键词:飞思卡尔智能车 MC9S12XS128 线性 CCD PID 控制

III

目录
摘要............................................................................................................................. III 目录............................................................................................................................. IV 第一章 引言............................................................................... 错误!未定义书签。 1.1 比赛背景介绍.............................................................. 错误!未定义书签。 1.2 技术报告内容安排说明................................................................................. 1 第二章 系统整体方案设计......................................................................................... 2 2.1 系统硬件设计方案概述................................................................................. 2 2.2 系统软件设计方案概述................................................................................. 2 第三章 机械调整......................................................................................................... 3 3.1 车体调整......................................................................................................... 3 3.2 CCD 的安装与调整......................................................................................... 4 3.3 陀螺仪与角速度计的安装.......................................... 错误!未定义书签。 3.4 编码器的安装.............................................................. 错误!未定义书签。 第四章 硬件电路设计................................................................................................. 7 4.1 电源模块设计................................................................................................ 7 4.2 最小系统……………………………………………………………………..8 4.3 驱动电路设计.............................................................. 错误!未定义书签。 4.4 红外对管设计.............................................................................................. 11 第五章 软件设计....................................................................... 错误!未定义书签。 第六章 智能车主要参数…………………………………………………………………….12 第七章 结论............................................................................................................... 13 参考文献 附录 程序源代码

IV

第一章 引言

1.1 比赛背景介绍
全国大学生“飞思卡尔”杯智能汽车竞赛是由教育部高等自动化专业教学指导分委员会 (以下简称自动化分教指委)主办的一项具有导向性、示范性和群众性的全国竞赛活动。 竞赛以智能汽车为研究对象的创意性科技竞赛,是面向全国大学生的一种具有探索性工程 实践活动,是教育部倡导的大学生科技竞赛之一。全国大学生智能汽车竞赛由竞赛秘书处 为各参赛队提供/购置规定范围内的标准硬软件技术平台,竞赛过程包括理论设计、实际制 作、整车调试、现场比赛等环节,要求学生组成团队,协同工作,初步体会一个工程性的 研究开发项目从设计到实现的全过程。该竞赛融科学性、趣味性和观赏性为一体,是以迅 猛发展、前景广阔的汽车电子为背景,涵盖自动控制、模式识别、传感技术、电子、电 气、计算机、机械与汽车等多学科专业的创意性比赛。全国大学生智能汽车竞赛以“立足培 养,重在参与,鼓励探索,追求卓越”为指导思想,旨在加强大学生实践、创新能力和团队 精神的培养,促进高等教育教学改革,促进高等学校素质教育,培养大学生的综合知识运 用能力、基本工程实践能力和创新意识,激发大学生从事科学研究与探索的兴趣和潜能, 倡导理论联系实际、求真务实的学风和团队协作的人文精神,为优秀人才的脱颖而出创造 条件。

1.2 技术报告内容安排说明
本文采用先总后分的结构,先对系统总体设计进行介绍,然后分别对各部分 进行介绍,突出强调了系统机械设计、硬件电路和软件编程。 第一章 引言:简单介绍了智能车比赛的一些情况; 第二章 系统设计:总体介绍了整个智能车各部分系统设计; 第三章 机械结构设计:详细介绍了本智能车机械结构设计; 第四章 智能车硬件系统:分模块详细介绍了小车硬件电路设计与制作; 第五章 软件系统设计:介绍了智能小车软件设计及算法实现; 第六章 智能车技术参数:智能车主要技术参数说明; 第七章 总结:主要说明一下我们在设计过程中遇到的问题和解决办法,以 及还存在的问题;

1

全国大学生智能汽车邀请赛技术报告

第二章 系统整体方案设计

2.1 系统硬件设计方案概述
首先将弄清直立车运行方式,需要接收哪些数据能够使小车实现直立,直立有需要哪 些条件,逐个把小车分解成一个个小模块。开始是电源模块,我们要理清需要哪些电压电 源,给哪部分供电,对电源稳定性与失真的要求,还有功率的要求。对一些不确定的模 块,可选择可调电源。其次是单片机的确定,我们要保证它有足够的运行速度来处理所采 集的数据,还能准确的输出控制信号。接着就是驱动电路的设计,驱动芯片的选择,我们 要确保能够输出足够的功率去控制电机,因为驱动功率大,电流大,我们还要采取一些保 护措施。最后是陀螺仪和加速度的设计,我们要确保输出数据准确快速。根据智能车设计 要求,设计合理的电路实现小车的功能,注意负载的电流,并着重考虑电路的稳定性。上 面一切电路设计好后就能够为将来小车平稳运行打好坚实的基础。

2.2 系统软件设计方案概述
软件是给智能车实现控制的执行语言,软件控制着智能车的一切行动,通过对软件的 编写可以让智能车按照你的思路去实现个个路段的完美赛跑。软件控制其实就是把自己的 思想灌输到单片里面,并让其高速有序的执行,实现对智能车的精确控制。软件又细分为 主程序、小车直立控制子程序、小车速度控制子程序、小车转向控制子程序、循环子程序 等等。 主程序:程序的主体采用顺序结构。为了方便控制,Main 函数里面除了初始化程序 就是液晶显示程序,而所有的核心操作放在定时中断中。同时为了细分每一时 刻的任务,我们对中断进行了计数,使得每一个时刻单片机需要处理什么数据 可以简单明了。 小车直立控制子程序:我们通过陀螺仪和加速度计采集小车的倾斜角度和小车转动的 角速度来反映小车的直立情况,然后通过处理实现对电机的控制来消除小车的倾斜角,从 而达到小车直立控制。利用倾角传感器来检测车模此时刻的状态,然后调节电机的转速, 让车模整体可以跟得上车模的倾角变化,在车模发生更大幅度的倾斜之前将车模的状态维 持到平衡。如果在 PID 调节中不是很顺利,可以适当的添加一些 I 项的系数,这样会使得 调节顺利不少。当车模顺利的维持直立姿态之后,也就意味着我们的后续的速度控制以及

2

转向控制就可以开始开展了! 小车速度控制子程序:我们给小车设定一个速度,通过编码器采集回来的数据计算出 小车实际的速度,然后形成一个闭环控制,这样就可以保证小车实现恒速与时刻可以准确 改变小车的运行速度,即使是在干扰的情况下也能够迅速返回设置的速度并稳定下来。

第三章 机械调整
3.1 车模调整
一辆车的好坏不仅仅由软件跟硬件决定,机械对智能车的影响也是十分重要的。 一辆智能车的机械做的好,它就能更加稳定,速度也能挺高的更多。 (1)车模底盘的加固与电池卡槽的安装 在不断的测试中我们总结出,重心的位置对平衡车的稳定性能影响十分的大,重心相 对较低比较好,但也不能太低,太低了对电机的要求就更高了。经过不断的测试与调试, 我们决定下来电池的安装位置,电池的安装也可以改变车模的倾斜角度。同时电池的卡槽 角要磨段一点,只要不要与车轮想接触就可以了。 (2)车轮的调整 刚买回来的车轮会有些晃动,这对车的影响是有的,我们的减小一切给小车带来的影 响。经过一次次的实验,我们最后选定了一块小铁片安装在车轮的一侧。铁皮的厚度要求 要很精确,太厚了会造成两轮太卡,要是太薄了就会跟没有安装一样,这要不断实验才能 确定铁片的厚度。

3

全国大学生智能汽车邀请赛技术报告

图 3-1 车模固定与电池安装

3.2 CCD 的安装与调整
CCD 可以说是光电平衡车的眼睛,可见 CCD 的安装是多么的重要,CCD 的安装位置要能 够确保 CCD 的视野宽广,能够扫描到整个跑到,但也不能够太过于宽广,这样它会扫描到 另外的跑到上,这样就给数据处理带来麻烦。同时还要确保 CCD 的前瞻足够的符合你的要 求,一辆车 CCD 前瞻调的好坏往往影响你小车的整体速度。CCD 前瞻调的好腻弯道的处理 也会更好。大家都总结出,前瞻决定速度,当能这是相对而言的。装 CCD 的支架一定要保 证安装在车模的正中间,这装的准确可以给你调整 CCD 减少很多麻烦。其次两边的支架可 有可无,这得看你试验的结果,我们是确保小车在运行中 CCD 支架不晃动。

4

图 3-2 CCD 的安装

3.3 陀螺仪与加速度计的安装
陀螺仪跟角速度计都是用来检测车模的倾斜角度,我们将这块带有陀螺仪和加速度计 的电路板固定在整个车模中间质心的位置。这样可以最大程度减少车模运行时前后振动对 于测量倾角的干扰,同时陀螺仪一定要安装水平,因为陀螺仪安装的不水平,就会使得小 车转弯出现突然加速减速的情况,只要陀螺仪安装的水平就不会出现这样的情况。这要在 不断测试中调整陀螺仪位置。

5

全国大学生智能汽车邀请赛技术报告

图 3-3 陀螺仪与加速度计的安装

3.4 编码器的安装
编码器的齿轮我们选择与电机齿轮想接触,这样可以更加准确的测出电机的转速从而 转换为小车的速度。

6

图 3-4 编码器的安装

第四章 硬件电路设计
4.1 电源模块设计
根据不同的要求我们选择了几种不同电源电路的设计:

7

全国大学生智能汽车邀请赛技术报告

1.LM2940-s(5v)低压降线性(LDO)-固定式稳压器,最大输出电流>1A;压降 0.5V,电 压调整率 20mv;电流调整率 35mv;静态电流 10mA;PSRR72dB;噪音电压 150uA。(单片 机,陀螺仪模块供电) 2.TPS7350QD 超低压降线性(VLDO)一固定式稳压器最大输出电流 500mA;压降 35mA; 有延时复位功能(200ms 低电平)输出电压误差 2%;静态电流 340uA(与负载无关) ; 待机电流 0.5uA;噪音电压 300uA,PSRR:50dB(120KHz),(20-80KHz 左右时最小,只有 5dB)(CDD,红外对管供电) 。 3.LM2596S-ADJ 降压式开关-固定式稳压器,最大输出电流 3A;有断电保护功能,输出电 压误差 4%;饱和电压 1.16V;静态电流 5mA;待机电流 80Ua(编码器供电).

图 4-1 电源电路图

8

图 4-2 电源板实物图

4.2 最小系统
单片机最小系统为本智能车系统的核心。为了稳定和可重复使用,我们购买了单片机 最小系统板。这个最小系统板引出了几乎所有功能引脚,板上自带晶振电路、复位电路、 单片机电源电路。单片机我们选择的是 MS12SX128,其主要特性:S12X CPU, 最高总线速 度 40MHz;64KB、128KB 和 256KB 闪存选项,均带有错误校正功能(ECC);带有 ECC 的、4KB 至 8KB DataFlash,用于实现数据或程序存储;可配置 8- 、10- 或 12- 位模数转换 器(ADC),转换时间 3μ s;支持控制区域网(CAN)、本地互联网(LIN)和串行外设接 口(SPI)协议模块;带有 16-位计数器的、8-通道定时器;出色的 EMC,及运行和停止省 电模式。

9

全国大学生智能汽车邀请赛技术报告

图 4-3 最小系统板电路

4.3 驱动电路设计
我们智能车中采用 4 片 BTS7970 搭载成两个 H 桥来驱动机器人的两个电机,具有输出 功率大,稳定性好,保护措施好等优点。

图 4-4 驱动电路图

10

图 4-5 驱动电路板实物图

11

全国大学生智能汽车邀请赛技术报告

4.4 红外对管设计
红外对我们用于专门检测起跑线,这样检测的结果很准确,但是用 CCD 检测会用一定 概率性,就是不能够确保每次都能检测到,但是用 3 个红外对管就可以实现,红外对管的 电路也十分的简单。

图 4-6 红外对管实物电路板

12

第五章 软件设计

小车的控制归根决地是对两个驱动电机的精确控制,通过电机的正转反转控制小车的平 衡。通过同样转速控制小车的运行速度,通过对两个电机的差速控制来控制小车的转向。 能而这些都是需要算法处理采集的数据来控制电机。平衡我们采用了卡尔曼滤波来实现, 速度和转向控制采用了 PID 来处理。详情请参考附录程序源代码的注释,上面注释的很清 楚。

第六章 智能车主要参数

车模长、宽、高(毫米) 电路功耗(w) 所以电容总量(uF) 传感器个数(个) 陀螺仪(个) 加速度计(个) 红外对管(个) 编码器(个) 外加电机,舵机(个) 赛道信息检测精度(毫米) 赛道信息检测频率(次/秒)

165*85*430 10.5w 1650.54 8 2 1 3 2 0 5 200

13

全国大学生智能汽车邀请赛技术报告

第七章 结论

记得刚接触智能车这个名词的时候感觉很神奇,我们 3 人热血沸腾的组队参加了第八 届的飞思卡尔智能车大赛。当时我们抱着的只是一腔热血,什么都不懂,只是稍微看了点 质料。当接触了才知道是那么的难,刚开始走了很多很多的弯路,经常一两个月的坚持摸 索之后,我们开始慢慢的上路。越到后面越是难熬,感觉一切的冲劲到覆灭在了前几个 月,开始有人放弃了,我们开始争吵了,一段静心之后我们开始重新振作,把放弃的重新 请了回来,我们又开始没日没夜的摸索。时间渐行渐远我们开始摸索到了一些门道,事事 开始尽心尽愿,我们开始在智能车的大道上奔跑。 经过一学期的摸索,做智能车首先得先去收集有关质料报告,把他们摸懂搞透,这样 做事就有头有系了,可以走很多的弯路,同时也可以多吸取他们的优点,看到别人犯过的 错误。选择正确的器件也是非常重要的,也不要太在意钱,该花的还是要花,条件好的情 况下可以多买点不同的,融合一下各个的优点。再次就是团队很重要,不要把自己看的太 重,不要什么事都自己去插下手,相信队友,给他们点空间。 在这我们要谢谢我们的指导老师在背后一直给我们支持,给我们提供一个做车的环 境。在此感谢组委会给我们这样一个展现的平台,也感谢各个举办学校各个志愿者为我们 付出的辛劳。

14

参考文献
【1】使久贵 编著 《基于 Altium Designer 的原理图与 PCB 设计》 机械工业 出版社,2010. 【2】 乐山师范学院__明星电缆 2 队技术报告. 【3】 野火 三天入门 Cortex-M4——Kinetis 系列.pdf 【4】 薛涛、邵贝贝等 《单片机与嵌入式系统开发方法》 清华大学出版社, 2009.10. 【5】张肃文 主编 《高频电子线路》 高等教育出版社 2010.5. 【6】谭浩强?C 程序设计?北京:清华大学出版社,2001 【7】电磁组直立车模参数整定与调试指南手册 【8】陶永华,新型 PID 控制及其应用,机械工业出版社,2005 【9】胡寿松,自动控制原理,科学出版社,2007

15

全国大学生智能汽车邀请赛技术报告

附录 程序源代码 #include "include.h" #define TSL_SI PORTA_PA7 #define TSL_CLK PORTA_PA6 #define coder1 PORTE_PE7 #define coder2 PORTE_PE6 #define coder3 PORTE_PE5 #define coder4 PORTE_PE4 #define speedcoder1 PORTE_PE2 #define speedcoder2 PTM_PTM5 #define speedcoderp1 PTM_PTM4 #define speedcoderp2 PTM_PTM3 #define open1 PTS_PTS2 #define open2 PTS_PTS3 #define open3 PTJ_PTJ6 #define open4 PTJ_PTJ7 /*******************************9600 ***************************************/ int OutData[4]={0}; /******************************* 中



















***************************************/ byte EventCount=0; /***************************** 加 速 度 和 陀 螺 仪 采 集 需 要 的 数 据 *************************/ float adValue[2]=0; //读取陀螺仪和加速度计的值 /***************************** 角 度 和 陀 螺 仪 *************************************/ float acceler=0; //加速度计的角度值 float gyro=0; //陀螺仪的值 float ACCELERSET=1459,GYROSET=0,DIRECTIONGYROSET=0; 加速度计和陀螺仪的 0 偏值 //





float Angle_P=8.3888889999,Angle_D=0.2199999999; float ZHILI=0; /******************************* 卡 尔 曼 滤 波 用 到 的 数 据 *******************************/ float angle=0,angle_dot=0; float C_0=1;

16

float Q_angle=0.001; float Q_gyro=0.003; float R_angle=0.5; float dt=0.005;

//卡尔曼采样时间

float P[2][2]={{1,0},{0,1}}; float Pdot[4]={0,0,0,0}; float q_bias=0,angle_err=0,PCt_0=0,PCt_1=0,E=0,K_0=0,K_1=0,t_0=0,t_1=0; /******************************* 小 车 转 速 的 数 据 *************************************/ float LeftSpeedPulse=0; //20 次左轮的转速之和 float RightSpeedPulse=0; //20 次右轮的转速之和 /******************************* 电 机 输 出 用 到 的 数 据 *********************************/ byte Judje[2]={1,1}; /******************************* 速 *********************************/ unsigned char SpeedControlPeriod=0;

















//速度控制的周期

unsigned char SpeedControlCount=0; float SpeedControlOutNew=0,SpeedControlOutOld=0,SpeedControlOut=0; float CarSpeedSet=0,CarSpeed=0; float CarSpeedSet1=0; float SpeedP=5.011,SpeedI=0.15; float SpeedPSet=0; float SpeedControlIntegral=0; /******************************10ms *******************************/ unsigned char TimerCnt10ms=0; unsigned char TimerFlag10ms=0; /****************************** 采

采 集

CCD

用 到 的 数 据

//计时 10ms 中断中计数 //10ms 进行一次方向控制 集 CCD 用 到 的 数



***********************************/ unsigned char Pixel[128]=0; //现在的 128 个点 float pixelleftplace=0; //本次左边黑线位置 float pixelrightplace=127; //本次右边黑线位置 float pixelview=94; float pixelmax=110; float pixelmin=94; float pixelmiddle=0; float pixelleftview;

17

全国大学生智能汽车邀请赛技术报告

float pixelrightview; float piancha=0; float prepiancha=0; float directionout=0; float directionp=188.9989789,directiond=0.045787999999; /******************************** 转 向 陀 螺 仪









******************************/ float directionanglevalue=0,directionanglepluse=0,directionspeed=0; /******************************** 设 置 起 跑 时 平 衡 ************************************/ float second=0; //记录时间 byte flag=0; //标志零点采集 byte secondflag=0; byte pa_flag=0; byte bar=0; float secondbar=0; byte end=0; float speedpcount=0; int pianchacount=0; /********************************9600

















********************************/ unsigned short CRC_CHECK(unsigned char *Buf, unsigned char CRC_CNT) { unsigned short CRC_Temp; unsigned char i,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; else CRC_Temp = CRC_Temp >> 1; } } return(CRC_Temp); }

18

void uart_putchar(unsigned char c) { while(!(SCI0SR1&0x80)) ; SCI0DRL=c; } void OutPut_Data(void) { int temp[4] = {0}; unsigned int temp1[4] = {0}; unsigned char databuf[10] = {0}; unsigned char i; unsigned short CRC16 = 0; for(i=0;i<4;i++) { temp[i] = (int)OutData[i]; temp1[i] = (unsigned int)temp[i]; } for(i=0;i<4;i++) { databuf[i*2] = (unsigned char)(temp1[i]%256); databuf[i*2+1] = (unsigned char)(temp1[i]/256); } CRC16 = CRC_CHECK(databuf,8); databuf[8] = CRC16%256; databuf[9] = CRC16/256; for(i=0;i<10;i++) uart_putchar(databuf[i]); } /******************************* 读 取 脉 冲 累 加 器 的 数 值 *******************************/ void GetMotorPulse(void){ float LeftSpeed=0,RightSpeed=0; LeftSpeed=PACNT; RightSpeed=PORTB + 255*PORTA_PA3 + 511*PORTA_PA4; PACNT=0x0000; PORTA_PA2=1; PORTA_PA2=0; if(Judje[0]==0){ //keep waiting when not empty

19

全国大学生智能汽车邀请赛技术报告

LeftSpeed = -LeftSpeed; } if(Judje[1]==0){ RightSpeed = -RightSpeed; } LeftSpeedPulse += LeftSpeed; RightSpeedPulse += RightSpeed; } /****************************** 采 集 加 速 度 计 和 陀 螺 仪 的 值 ****************************/ void Read_adValue(void){ while(!ATD0STAT0_SCF); adValue[0] = (float)ATD0DR1; adValue[1] = (float)ATD0DR2; } /****************************** 卡 尔 曼 滤 波

******************************************/ void Kalman_Kilter(float angle_m,float gyro_m){ angle += (gyro_m - q_bias) * dt; angle_err = angle_m - angle; Pdot[0] = Q_angle - P[0][1] - P[1][0]; Pdot[1] = -P[1][1]; Pdot[2] = -P[1][1]; Pdot[3] = Q_gyro; P[0][0] += Pdot[0] * dt; P[0][1] += Pdot[1] * dt; P[1][0] += Pdot[2] * dt; P[1][1] += Pdot[3] * dt; PCt_0 = C_0*P[0][0]; PCt_1 = C_0*P[1][0]; E = R_angle + C_0*PCt_0; K_0 = PCt_0/E; K_1 = PCt_1/E; t_0 = PCt_0; t_1 = C_0 * P[0][1]; P[0][0] -= K_0*t_0; P[0][1] -= K_0*t_1; P[1][0] -= K_1*t_0;

20

P[1][1] -= K_1*t_1; angle += K_0 * angle_err; q_bias += K_1 * angle_err; angle_dot = gyro_m - q_bias; } /****************************** 角 度 计 算 和 直 立 控 制

**********************************/ void AngleCalculate(void){ Read_adValue(); acceler = adValue[0]-ACCELERSET; gyro = GYROSET-adValue[1]; Kalman_Kilter(acceler,gyro); if(acceler>=154 ||acceler<=-300){ PORTA_PA0 = 0; //电机使能 PORTA_PA1 = 0; //电机使能 pa_flag=1; } ZHILI = angle * Angle_P + angle_dot * Angle_D; } void MotorOutPut(void){ float LeftMotorOut,RightMotorOut; Judje[0]=1; Judje[1]=1; LeftMotorOut = ZHILI-SpeedControlOut+directionout; RightMotorOut = ZHILI-SpeedControlOut-directionout; if(LeftMotorOut>=0){ LeftMotorOut +=5; } else{ LeftMotorOut -=5; } if(RightMotorOut>=0){ RightMotorOut+=5; } else{ RightMotorOut-=5; } if(LeftMotorOut>=250){ LeftMotorOut = 250; } else if(LeftMotorOut<=-250){

21

全国大学生智能汽车邀请赛技术报告

LeftMotorOut = -250; } if(RightMotorOut>=250){ RightMotorOut = 250; } else if(RightMotorOut<=-250){ RightMotorOut = -250; } if(LeftMotorOut<0){ Judje[0]=0; LeftMotorOut=-LeftMotorOut; } if(RightMotorOut<0){ Judje[1]=0; RightMotorOut=-RightMotorOut; } if(Judje[0]==1 && Judje[1]==1){ motor_left_forward((int)LeftMotorOut); motor_right_forward((int)RightMotorOut); } else if(Judje[0]==1 && Judje[1]==0){ motor_left_forward((int)LeftMotorOut); motor_right_backward((int)RightMotorOut); } else if(Judje[0]==0 && Judje[1]==1){ motor_left_backward((int)LeftMotorOut); motor_right_forward((int)RightMotorOut); } else if(Judje[0]==0 && Judje[1]==0){ motor_left_backward((int)LeftMotorOut); motor_right_backward((int)RightMotorOut); } } /****************************** 速 度 控 制 输 出 函 数

//正转

//左轮正转,右轮反转

//左轮反转,右轮正转

//反转

************************************/ void SpeedControlOutPut(void){ float fValue; fValue = SpeedControlOutNew - SpeedControlOutOld; SpeedControlOut = fValue * (SpeedControlPeriod+1)/100 SpeedControlOutOld; } /****************************** 速 度 控 制 函

+



22

****************************************/ void SpeedControl(void){ float fDelta; float fP,fI; CarSpeed = (LeftSpeedPulse+RightSpeedPulse)*0.01; LeftSpeedPulse = RightSpeedPulse = 0; fDelta = CarSpeedSet - CarSpeed; fP = fDelta * SpeedP; fI = fDelta * SpeedI; SpeedControlIntegral += fI; if(SpeedControlIntegral>10){ SpeedControlIntegral=10; } if(SpeedControlIntegral<-10){ SpeedControlIntegral=-10; } SpeedControlOutOld = SpeedControlOutNew; SpeedControlOutNew = fP + SpeedControlIntegral; } /***********************************CCD ***********************************/ void RD_TSL(void) { byte i=0; int temp_int; TSL_CLK=1;//起始电平高 TSL_SI=0; //起始电平低 SamplingDelay(); //合理的延时 TSL_SI=1; //上升沿 TSL_CLK=0;//下降沿 SamplingDelay(); //合理延时 TSL_CLK=1;//上升沿 TSL_SI=0; //下降沿 SamplingDelay(); //合理延时 for(i=0;i<128;i++) { 采 集 数 据

23

全国大学生智能汽车邀请赛技术报告

TSL_CLK=0;//下降沿 SamplingDelay(); //合理延时 while(!ATD0STAT0_SCF);//等待转换结束 temp_int = (int)ATD0DR0; directionanglevalue=ATD0DR3; Pixel[i]=(byte)(temp_int>>4); //AD 采集 directionanglepluse+=directionanglevalue; TSL_CLK=1;//上升沿 SamplingDelay(); //合理延时 } } /*************************小车运行时加速度计的值和转向陀螺仪的值得函 数************/ void directionSpeed(void){ directionspeed=directionanglepluse/128-DIRECTIONGYROSET; directionanglepluse=0; } /************************ 找 黑 线 的 ********************************************/ void findpixel(unsigned char findplace){ unsigned char i; byte leftflag=0; byte rightflag=0; for(i=findplace;i>1;i--){ if(Pixel[i]==0){ if(Pixel[i-1]==0){ //找到黑线 // if(Pixel[i-2]==0){ leftflag=1; pixelleftplace=i-1;





//向左寻找黑线

Pixel[i-1]=250; break; // } } } } for(i=findplace;i<127;i++){ if(Pixel[i]==0){ //向右寻找黑线

24

if(Pixel[i+1]==0){ //找到黑线 // if(Pixel[i+2]==0){ rightflag=1; pixelrightplace=i+1; Pixel[i+1]=250; break; // } } } } if(leftflag==1&&rightflag==1){ pianchacount=0; pixelview=pixelrightplace-pixelleftplace; if(pixelview>=pixelmax){ //进行限制 pixelview 的范围 测定 pixelview=pixelmax; } else if(pixelview<=pixelmin){ pixelview=pixelmin; } pixelmiddle=pixelview*0.5; pixelleftview=63-pixelleftplace; pixelrightview=pixelrightplace-64; if(pixelleftview<=pixelmiddle){ piancha=(pixelmiddle-pixelleftview)/pixelview; } else if(pixelrightview<=pixelmiddle){ piancha=-(pixelmiddle-pixelrightview)/pixelview; } } if(leftflag==1&&rightflag==0){ pianchacount=0; pixelrightplace=127; if(pixelleftplace>=63){ pixelleftview=pixelleftplace-63+pixelmiddle; piancha=pixelleftview/pixelview; } else{ pixelleftview=63-pixelleftplace; piancha=(pixelmiddle-pixelleftview)/pixelview;

需要进行

25

全国大学生智能汽车邀请赛技术报告

} } else if(leftflag==0&&rightflag==1){ pianchacount=0; pixelleftplace=0; if(pixelrightplace<=64){ pixelrightview=64-pixelrightplace+pixelmiddle; piancha=-pixelrightview/pixelview; } else{ pixelrightview=pixelrightplace-64; piancha=-(pixelmiddle-pixelrightview)/pixelview; } } else if(leftflag==0&&rightflag==0){ pixelleftplace=0; pixelrightplace=127; pianchacount++; if(pianchacount<=0){ piancha=prepiancha; } } } void ccd_filter(void){ unsigned char i; unsigned char max=0; unsigned char min=255; float aver=0; unsigned char withecount=0; unsigned char blackcount=0; for(i=2;i<127;i++){ //比赛时可以不加 if((Pixel[i]-Pixel[i+1]>=10||Pixel[i]-Pixel[i+1]<=-10)&&(Pixel[i]Pixel[i+2]<10&&Pixel[i]-Pixel[i+2]>-10)){ Pixel[i+1]=(Pixel[i]+Pixel[i+2])/2; } if((Pixel[i]-Pixel[i+1]>=10||Pixel[i]-Pixel[i+1]<=-10)&&(Pixel[i]Pixel[i+2]>=10||Pixel[i]-Pixel[i+2]<=-10)&&(Pixel[i]-Pixel[i+3]<10&&Pixel[i]Pixel[i+3]>-10)){ Pixel[i+1]=Pixel[i+2]=(Pixel[i]+Pixel[i+3])/2; i=i+1; }

26

} for(i=3;i<127;i++){ if(Pixel[i]<50){ withecount++; } if(Pixel[i]>50){ blackcount++; } } if(withecount<3 || blackcount<5){ if(blackcount<5){ bar=1; } } else{ for(i=2;i<127;i++){ if(Pixel[i]>max){ max=Pixel[i]; } else if(Pixel[i]<min){ min=Pixel[i]; } } aver=(max+min)/2; aver=aver*0.8; if(aver<=min+8){ aver=min+8; } for(i=2;i<127;i++){ if(Pixel[i]>=aver){ Pixel[i]=1; } else{ Pixel[i]=0; } } } } /****************************** 偏 差 计 算 函 数 和 转 向 值 的 输 出 函 数 ***************************/ void piancha1(void){ //寻找障碍 需要进行测试 //寻找白线 需要进行测试

//需要进行测试

//60is1 //20is0

27

全国大学生智能汽车邀请赛技术报告

unsigned char temp; //进行 CCD 滤波测试 ccd_filter(); //动态的改变提取黑线的中间位置 if(64-pixelleftplace<=10){ temp=pixelleftplace+11; if(temp>=126){ temp=126; } } else if(pixelrightplace-64<=10){ temp=pixelrightplace-11; if(temp<=2){ temp=2; } } else{ temp=64; } //寻找黑线计算出偏差值 findpixel(temp); //转向控制数据输出 directionout=piancha*directionp+directionspeed*directiond; if(pianchacount<=3&&pianchacount>=2){ //虚线进行补线,补线可能过 大进行限制 if(directionout>=6){ directionout=6; } else if(directionout<=-6){ directionout=-6; } } if(speedpcount<800){ if(directionout>15){ directionout=15; } else if(directionout<-15){ directionout=-15; } } if(directionout>50){ directionout=50; //刚开始检测到起跑线会过大

28

} else if(directionout<-50){ directionout=-50; } //保存本次的偏差值,用于没有读到黑线的时候使用 prepiancha=piancha; //清零本次的偏差值 piancha=0; } /************************** 开 始 测 试 陀 螺 仪 的 零 偏 的 函 数 ****************************/ void gyro_zero(void){ int i=0,a=0; float g2=0,g3=0; for(a=0;a<50;a++){ for(i=0;i<1024;i++){ while(!ATD0STAT0_SCF); g2+=ATD0DR2; //水平陀螺仪的零偏 g3+=ATD0DR3; //转向陀螺仪的零偏 } GYROSET=g2/1024; DIRECTIONGYROSET=g3/1024; g2=0; g3=0; } Cpu_Delay1us(); Cpu_Delay1us(); Cpu_Delay1us(); //速度参数调节拨码开关 if(speedcoderp1==0&&speedcoderp2==1){ //拨码开关 3 打开 SpeedPSet=4.1; } else if(speedcoderp2==0&&speedcoderp1==1){ //拨码开关 4 打开 SpeedPSet=4.4; } else if(speedcoderp1==0&&speedcoderp2==0){ //拨码开关 3,4 打开 SpeedPSet=4.6; } else if(speedcoderp1==1&&speedcoderp2==1){

29

全国大学生智能汽车邀请赛技术报告

//拨码开关 3,4 关闭 SpeedPSet=4.82; } //速度调节拨码开关 if(speedcoder1==0&&speedcoder2==1){ //拨码开关 1 打开 CarSpeedSet1=69; } else if(speedcoder2==0&&speedcoder1==1){ //拨码开关 2 打开 CarSpeedSet1=74; } else if(speedcoder1==0&&speedcoder2==0){ //拨码开关 1,2 打开 CarSpeedSet1=76; } else if(speedcoder1==1&&speedcoder2==1){ //拨码开关 1,2 关闭 CarSpeedSet1=80; } //平衡调节拨码开关 if(coder1==0&&coder2==1&&coder3==1&&coder4==1){ //拨码开关 1 打开 ACCELERSET+=5; } else if(coder2==0&&coder1==1&&coder3==1&&coder4==1){ //拨码开关 2 打开 ACCELERSET+=10; } else if(coder3==0&&coder1==1&&coder2==1&&coder4==1){ //拨码开关 3 打开 ACCELERSET+=15; } else if(coder4==0&&coder1==1&&coder2==1&&coder3==1){ //拨码开关 4 打开 ACCELERSET+=20; } else if(coder1==0&&coder2==0&&coder3==1&&coder4==1){ //拨码开关 1,2 打开 ACCELERSET+=25; } else if(coder1==0&&coder3==0&&coder2==1&&coder4==1){ //拨码开关 1,3 打开 ACCELERSET+=30; } else if(coder1==0&&coder4==0&&coder2==1&&coder3==1){ //拨码开关 1,4 打开

30

ACCELERSET+=35; } else if(coder2==0&&coder3==0&&coder1==1&&coder4==1){ //拨码开关 2,3 打开 ACCELERSET-=5; } else if(coder2==0&&coder4==0&&coder1==1&&coder3==1){ //拨码开关 2,4 打开 ACCELERSET-=10; } else if(coder3==0&&coder4==0&&coder1==1&&coder2==1){ //拨码开关 3,4 打开 ACCELERSET-=15; } else if(coder1==0&&coder2==0&&coder3==0&&coder4==1){ //拨码开关 1,2,3 打开 ACCELERSET-=20; } else if(coder1==0&&coder2==0&&coder4==0&&coder3==1){ //拨码开关 1,2,4 打开 ACCELERSET-=25; } else if(coder1==0&&coder3==0&&coder4==0&&coder2==1){ //拨码开关 1,3,4 打开 ACCELERSET-=30; } else if(coder2==0&&coder3==0&&coder4==0&&coder1==1){ //拨码开关 2,3,4 打开 ACCELERSET-=35; } else if(coder1==0&&coder2==0&&coder3==0&&coder4==0){ //拨码开关 1,2,3,4 打开 ACCELERSET-=40; } else if(coder1==1&&coder2==1&&coder3==1&&coder4==1){ //拨码开关 1,2,3,4 全关上 } flag=1; } /*********************************1ms 中 断 函 数

************************************/ #pragma CODE_SEG __NEAR_SEG NON_BANKED interrupt VectorNumber_Vpit0 void PIT(){ PITTF_PTF0 = 1; //清中断标志 if(flag){ //处理水平陀螺仪和转向陀螺仪的零偏完成 second++; if(pa_flag==0&&end==0){

31

全国大学生智能汽车邀请赛技术报告

PORTA_PA0 = 1; PORTA_PA1 = 1;

//电机使能 //电机使能

} if(second>15000&&bar==0){ if(PTM_PTM0==1&&PTM_PTM1==0&&PTM_PTM2==1){ PORTA_PA0 = 0; //电机使能 PORTA_PA1 = 0; //电机使能 end=1; } } EventCount++; TimerCnt10ms++; if(TimerCnt10ms>=10){ TimerCnt10ms=0; TimerFlag10ms=1; } if(second>10000){ if(second>15000){ second=15006; } speedpcount++; if(speedpcount<4000){ if(CarSpeed>23.8){ SpeedP=2.4; } else{ if(SpeedP<SpeedPSet){ SpeedP=SpeedP+0.008; } else{ SpeedP=SpeedPSet; } } } else if(speedpcount>=4000){ speedpcount=50005; SpeedP=SpeedPSet; } CarSpeedSet=CarSpeedSet1; if(speedpcount>100&&speedpcount<1211){ CarSpeedSet=CarSpeedSet+35;

32

} Angle_D=0.2199999999; if(bar==1){ secondbar++; if(secondbar<=900){ Angle_D=0.3599999999; SpeedP=9.211; CarSpeedSet=0; } else if(secondbar>900&&secondbar<=2500){ CarSpeedSet=25; if(secondbar>1000&&secondbar<=1500){ CarSpeedSet=45; } else if(secondbar>1500&&secondbar<=2000){ CarSpeedSet=50; } else if(secondbar>2000&&secondbar<=2300){ CarSpeedSet=60; } else if(secondbar>2300&&secondbar<=2500){ CarSpeedSet=70; } } else if(secondbar>2500){ CarSpeedSet=CarSpeedSet1; } if(secondbar>=3000){ secondbar=0; bar=0; } } } if(second>5000){ secondflag=1; } SpeedControlPeriod++; SpeedControlOutPut(); switch(EventCount){ case 1: GetMotorPulse(); break; case 2:

33

全国大学生智能汽车邀请赛技术报告

break; case 3: AngleCalculate(); MotorOutPut(); break; case 4: SpeedControlCount++; if(SpeedControlCount>=20){ SpeedControl(); SpeedControlCount=0; SpeedControlPeriod=0; } break; case 5: EventCount=0; break; } } } #pragma CODE_SEG DEFAULT /******************************







*******************************************/ void main(void) { system_init(); gyro_zero(); EnableInterrupts; for(;;) { if(TimerFlag10ms&&secondflag){ TimerFlag10ms=0; /**************捕获 CCD 数据*****************/ RD_TSL(); directionSpeed(); piancha1(); /*********10ms 向上位机发送一次数据********/ SendImageData(Pixel); } } }

34

35


推荐相关:

飞思卡尔光电平衡组-追风队技术报告_图文.doc

飞思卡尔光电平衡组-追风队技术报告 - “飞思卡尔”杯全国大学生 智能汽车竞赛技术报告 1 关于技术报告和研究论文使用授权的说明 本人完全了解第八届“飞思卡尔”杯...


第八届飞思卡尔光电平衡组郑州轻工业学院光电平衡1队技....pdf

第八届飞思卡尔光电平衡组郑州轻工业学院光电平衡1队技术报告 - 第八届全国大学生智能汽车邀请赛技术报告 第八届“飞思卡尔”杯全国大学生 智能汽车竞赛 技术报告 ...


第八届飞思卡尔智能车竞赛光电平衡组 华南理工大学广州....doc

第八届飞思卡尔智能车竞赛光电平衡组 华南理工大学广州学院远航2队技术报告_军事_高等教育_教育专区。第八届飞思卡尔智能车竞赛光电平衡组 ...


东4 华东赛区-摄像头组-华东交通大学-和一队 技术报告.pdf

华东交通大学-和一队 技术报告_调查/报告_表格/...人完全了解第八届飞思卡尔 ”杯全国大学生智能...2.3 设计思路根据摄像头平衡组的规则、 要求及为了...


第八届飞思卡尔智能车竞赛光电平衡组北京理工大学技术....pdf

第八届飞思卡尔智能车竞赛光电平衡组北京理工大学技术报告_兵器/核科学_工程科技...北京理工大学 队伍名称: 光电一队 参赛队员: 黄琨 王震 谢悦 带队教师: 张幽彤...


光电组技术报告_图文.doc

光电组技术报告 - 第八届飞思卡尔”杯全国大学生 智能汽车竞赛 技术报告 学 校: 中南民族大学 混沌骑士 姚德翔 甘仕举 徐睿 队伍名称: 参赛队员: 带队教师:...


2013飞思卡尔智能车-厦门大学光电平衡组至远队技术报告.pdf

2013飞思卡尔智能车-厦门大学光电平衡组至远队技术报告_兵器/核科学_工程科技_专业资料。第八届飞思卡尔智能车技术报告 第八届“飞思卡尔”杯全国大学生 智能汽车...


飞思卡尔 光电组 技术报告.pdf

飞思卡尔 光电组 技术报告_信息与通信_工程科技_专业资料。第十全国大学生“飞思卡尔”杯 智能汽车竞赛 技术报告 学 校:安徽工程大学 队伍名称:艳艳队 参赛队员...


第八届飞思卡尔光电平衡组_郑州轻工业学院_赛尔号技术....pdf

第八届飞思卡尔光电平衡组_郑州轻工业学院_赛尔号技术报告 - 第八届“飞思卡尔”杯全国大学生 智能汽车竞赛 技术报告 学 校: 郑州轻工业学院 电气光电平衡一队 ...


飞思卡尔智能车竞赛光电平衡组技术报告 精品_图文.doc

飞思卡尔智能车竞赛光电平衡组技术报告 精品 - 第八届飞思卡尔”杯全国大学生 智能汽车竞赛 技术报告 关于技术报告和研究论文使用授权的说明 本人完全了解第八届...


第八届飞思卡尔智能车竞赛光电平衡组常熟理工学院技术....doc

第八届飞思卡尔智能车竞赛光电平衡组常熟理工学院 第八届“飞思卡尔”杯全国大学...一队 参赛队员:杨楚、蒋林洋、卜建锋 带队老师:徐健、吴正阳 1 关于技术报告...


第八届飞思卡尔智能车竞赛光电平衡组西南交通大学Simpl....pdf

第八届飞思卡尔智能车竞赛光电平衡组西南交通大学Simple_兵器/核科学_工程科技_...该竞赛由竞赛秘书处为各参赛队提供/购置规定范围内的标准硬软件技术平 台,竞赛...


第八届飞思卡尔智能车竞赛光电平衡组南京邮电大学 SEA....doc

第八届飞思卡尔智能车竞赛光电平衡组南京邮电大学 SEA光电一队_学科竞赛_初中...第八届“飞思卡尔”杯全国大学生 智能汽车竞赛 技术报告 学 校:南京邮电大学 ...


飞思卡尔智能车光电组技术报告_图文.doc

9 第八届全国大学生智能汽车邀请赛技术报告 图 3.8 陀螺仪接口 3.2 智能汽车传感器由于今年比赛规则对光电平衡组的传感器有明确的规定,所以我们在 传感器的选择上...


飞思卡尔智能车竞赛光电平衡组技术报告__本科毕业设计....doc

飞思卡尔智能车竞赛光电平衡组技术报告__本科毕业设计论文 - 第八届飞思卡尔”杯全国大学生 智能汽车竞赛 技术报告 1 关于技术报告和研究论文使用授权的说明 本人...


光电平衡组 厦门大学嘉庚学院 光电平衡组 凌云队 技术....pdf

光电平衡组 厦门大学嘉庚学院 光电平衡组 凌云队 技术报告_电子/电路_工程科技_专业资料。第八届飞思卡尔杯全国大学生智能车竞赛技术报告 ...


第八届飞思卡尔光电平衡组哈尔滨工程大学-极品飞车3号_....doc

第八届飞思卡尔光电平衡组哈尔滨工程大学-极品飞车3号 - 第八届“飞思卡尔”杯全国大学生 智能汽车竞赛 技术报告 基于电磁传感器的智能车路径识别 控制系统 学 校...


第八届飞思卡尔智能车竞赛光电平衡组中国海洋大学passe....doc

第八届飞思卡尔智能车竞赛光电平衡组中国海洋大学passer队 new_文学_高等教育_...第八届“飞思卡尔”杯全国大学生 智能汽车竞赛 技术报告 学 校:中国海洋大学 ...


第八届飞思卡尔光电组规则.pdf

第八届飞思卡尔光电组规则 - 第八届全国大学生智能汽车竞赛 赛道路障说明 ? ? ? ? ? ? 在第八届全国大学生智能汽车竞赛竞速比赛的道路中引入的路障元素, ...


飞思卡尔智能车竞赛光电平衡组_图文.doc

飞思卡尔智能车竞赛光电平衡组 - “飞思卡尔”杯全国大学生 智能汽车竞赛 技术报告 关于技术报告和研究论文使用授权的说明 本人完全了解第八届飞思卡尔” 杯全国...

网站首页 | 网站地图
All rights reserved Powered by 酷我资料网 koorio.com
copyright ©right 2014-2019。
文档资料库内容来自网络,如有侵犯请联系客服。zhit325@126.com