创新设计与实践报告自动寻迹小车Word文件下载.docx
《创新设计与实践报告自动寻迹小车Word文件下载.docx》由会员分享,可在线阅读,更多相关《创新设计与实践报告自动寻迹小车Word文件下载.docx(42页珍藏版)》请在冰豆网上搜索。
1。
设计基于光电开关的寻迹电路;
2.设计小车主电机驱动及调速电路;
3。
编写主程序,使小车能够根据比赛赛道自动寻迹前进;
4、绘制相应的硬件图纸及软件流程图;
5.完成软件与硬件设计并加以调试;
6。
按照要求撰写创新设计与实践报告书。
主要参考
资料
[1]王威.嵌入式微控制器S08AW原理与实践[M].北京:
北京航空航天大学出版社,2009.
[2]陈杰。
传感器与检测技术[M].北京:
高教出版社,2004.
[3]邵贝贝龚光华。
单片机认识与实践[M]。
北京:
北京航空航天大学出版社,2006。
[4]阎石。
数字电子技术基础(第三版).北京:
高等教育出版社,1989
审查意见
系(教研室)主任签字:
年月日
绪论
1.1设计背景
为加强大学生实践、创新能力和团队精神的培养,促进高等教育教学改革,
受教育部高等教育司委托(教高司函[2005]201号文,附件1),由教育部高等学校自动化专业教学指导分委员会(以下简称自动化分教指委)主办全国大学生智能汽车竞赛。
该竞赛以“立足培养、重在参与、鼓励探索、追求卓越”为指导思想,是以智能汽车为竞赛平台的多学科专业交叉的创意性科技竞赛,是面向全国大学生的一种具有探索性的工程实践活动,旨在促进高等学校素质教育,培养大学生的综合知识运用能力、基本工程实践能力和创新意识,激发大学生从事科学研究与探索的兴趣和潜能,倡导理论联系实际、求真务实的学风和团队协作的人文精神。
该竞赛分竞速赛与创意赛两类比赛。
竞速赛是在规定的模型汽车平台上,使
用飞思卡尔半导体公司的8位、16位微控制器作为核心控制模块,通过增加道
路传感器、电机驱动电路以及编写相应软件,制作一部能够自主识别道路的模型
汽车,按照规定路线行进,以完成时间最短者为优胜。
创意赛在统一比赛平台上,
充分发挥参赛队伍想象力,以特定任务为创意目标,完成研制作品,由竞赛专家
组观摩作品现场展示、质疑、现场观众投票等环节,最终决定比赛名次。
该竞赛
涵盖了控制、模式识别、传感技术、电子、电气、计算机、机械等多个学科知识。
该竞赛以飞思卡尔半导体公司为协办方,已成功举办了五届,曾得到了原教
育部副部长吴启迪教授、原高教司张尧学司长及理工处领导、飞思卡尔公司与各
高校师生的高度评价,已发展成全国26个省(自治区)、直辖市的300余所高校广泛参与的全国大学生智能汽车竞赛。
第三、四、五届连续被教育部批准列入国家教学质量与教学改革工程资助项目之一(附件2,教高函[2010]13号)。
飞思卡尔公司在2010年8月26与国家教育部国际合作交流司签署了关于“高等学校人才培养战略合作协议"
,此协议将继续赞助全国大学生“飞思卡尔”杯智能汽车竞赛.
1.2设计的意义
智能车竞赛与教育部已举办的数学建模、电子设计、机械设计、结构设计4大专业竞赛不同,是以迅猛发展的汽车电子为背景,涵盖了控制、模式识别、传感技术、电子、电气、计算机、机械等多个学科交叉的科技创意性比赛.引导和激励学生实事求是、刻苦钻研、勇于创新、多出成果、提高素质,发现和培养一批在学术科技上有作为、有潜力的优秀人才。
1.3设计所需的设备
采用组委会提供的标准赛车底盘(赛车MATIZ,配备标准驱动电机RS—380SH、转向舵机和可充电蓄电池);
单片机FREESCALE的8位单片机MC9S08AW60开发评估板;
传感器采用红外反射式对管及触发电路;
电机驱动采用基于33886芯片的H—Bridge驱动电路。
车模介绍
◆车模:
G768
◆电机:
RS380—ST/3545,
◆舵机:
FUTABA3010
2总体设计
2.1小车系统可分为6个部分:
◆电源管理:
稳定电压,使系统电压稳定在要求的电压范围
◆光电传感器:
检测路径,校正小车在跑道上的位置
◆车速传感:
实时检测小车当前的速度
◆参数选择:
根据小车当前的状态,确定算法的参数
◆驱动电机:
根据小车的速度、位置,增减速度
◆转向电机:
控制小车的方向
2。
2跑道
小车跑道宽度50CM,中间黑线20mm,小车从出发去出发,跑完一圈后,在起始线后1米范围内自动停下来。
3硬件电路设计
1传感器的选择
光电式传感器是利用光电器件把光信号转换成电信号的装置。
光电式传感器工作时,先将被测量转换为光量的变化,然后通过光电器件再把光量的变化转换为相应的电量变化,从而实现非电量的测量.光电式传感器的核心(敏感元件)是光电器件,光电器件的基础是光电效应。
本设计采用采用A/D转换的光电对管红外光耦传感器,当发光二极管由A→B导通时,会发出红外线,经小车跑道散射,红外接收二极管在接收到红外线时会由C→D导通,从而使OUT1的电压由+5V变为+0.7。
3.2车速检测
电动机的测速有很多方法,常见的有测速发电机测速、霍尔传感器测速、编码器测速、光电码盘测速等。
测速发电机测速适合大型电机的测速.霍尔传感器测速的方法具有抗干扰能力强,准确可靠地特点,但是测速分度较低,结构也比较复杂。
编码器测速,不但使用方便,运行可靠稳定而且分辨率高,也是目前智能车大赛中普遍使用的测速装置,但是价格有点高.我们将着重介绍光电码盘测速,这种测速方法比较简单、容易操作,而且编码器也是基于光电码盘测速的原理。
接下来的是电路部分,需要用到槽型光耦,槽型光耦的外形成一个“凹”字型,一边是个红外发射管另一边是接收管,它们都被塑料壳包起来,中间留了一条很细的窄缝,没有障碍物时接收管能接受到红外线,有东西挡住中间时接收管就接收不到了。
在选择槽型光耦时中间缝越细小说明管子性能越好。
从右图电路中可以看出没有遮挡时,发射管发出的光线直接被接收管接收,接收管导通集电极电位为低电平,当光线被遮挡时,接收管接受不到光线,处于截止状态,集电极为高电平,后面串了个CD40106BC施密特触发器的作用是对信号整形,遮光物体进入和离开时都有一个过程,这就使得信号变化也有一个过程,不是规则的方波,不能直接提供给MCU,加上施密特触发器以后,通过阀值触发,就变成规则的电平信号了。
将方波信号送入测速芯片CD4040BC,可在Q0—Q11管脚输出小车的速度。
链接电路图、CD4040BC封装图如下:
3电源管理
通过稳压芯片LM2940将电池电压7.2V将为5V供单片机和光电传感器,使用一个普通二极管将另一路输出电压钳制到5。
7V向舵机供电.电路图如下:
3.4转向电机
1、舵机内部结构:
由舵盘、齿轮组、位置反馈电位计、直流电机、控制电路板等组成
2、工作原理:
脉宽信号给定参考位置,舵机内部电路通过反馈控制调节舵盘角位。
舵盘角位由PWM控制信号的脉宽决定.
3、舵机基本参数:
型号:
S3010
电压:
4。
0~6。
0[V]
角度控制:
1°
/400us
工作速度:
0。
16+0。
02
堵转力矩:
6.5+1。
3[Kg。
cm]
5驱动电机
电机驱动电路,我们在此使用MC33886芯片直接驱动。
◆MC33886特性:
工作电压:
5—40V
◆导通电阻:
120毫欧姆
◆输入信号:
TTL/CMOS
◆PWM频率:
<
10KHz
◆短路保护、欠压保护、过温保护等
MC33886驱动电路
电机外形
4系统软件设计
在智能车系统的设计中,硬件是基础,没有一个好的硬件平台,软件就无法运行。
对于智能车系统来说,软件的核心是控制算法.而完成这些任务的编程语言有汇编语言和C语言。
软件部分是整个智能车系统的灵魂,在硬件方面各参赛队之间大同小异,真正体现各参赛队智能车的优势和最后决定比赛成绩好坏的往往是软件部分,尤其是核心控制算法的设计。
4.1控制算法
PID(ProportionalIntegralDifferential)控制是比例、积分、微分控制的简称。
在自动控制领域中,PID控制是历史最久、生命力最强的基本控制方式.
PID控制器的原理是根据系统的被调量实测值与设定值之间的偏差,利用偏差的比例、积分、微分三个环节的不同组合计算出对广义被控对象的控制量。
常规PID控制系统原理框图
PID控制算法可分为位置型和增量型两种:
(1)位置型算法
模拟调节器的调节动作是连续的,任何瞬间的输出控制量u都对应于执行机构(如调节阀)的位置。
数字控制器的输出控制量也和阀门位置相对应,故称为位置型算式(简称位置式)。
(2)增量型算法
增量型算法仅仅是在算法设计上的改进,其输出是相对于上次控制输出量的增量形式,并没有改变位置型算法的本质,即它仍然反映执行机构的位置开度.如果希望输出控制量的增量,则必须采用具有保持位置功能的执行机构。
4.2主程序流程图
主程序流程图如图所示。
系统首先对设备进行初始化,然后选择进入参数修改程序。
参数设定完之后打开中断,最后循环执行位置速度控制程序.
4。
3程序的初始化
初始化部分包括参数的读取、PID初始化、定时器和脉冲计数器的初始化、I/O端口的初始化、PWM控制器的初始化和键盘显示控制器7279的初始化。
图4。
2初始化程序流程图
4位置速度控制
程序首先读取前方传感器组的状态来判断赛车和黑线的位置关系,通过该位置关系给出相应的转向舵机的转角和电机的转速。
具体程序流程图如图。
图4.3位置速度控制程序
4.5中断处理程序
中断处理程序每20毫秒执行一次,中断处理函数的主要目的是定时读取脉冲计数器的值并把该值反馈给PID控制程序,然后调用PID控制程序。
图给出了程序流程图。
6PID控制程序
系统采用增量式的速度PID,具体流程图如图4。
5。
图4.5PID控制程序
5系统调试
5.1开发工具
程序的开发是在组委会提供的CodeWarriorIDE下进行的,包括源程序的编写、编译和链接,并最终生成可执行文件。
CodeWarrior6.2是面向以HC1和S12为CPU的单片机嵌入式应用开发软件包。
包括集成开发环境IDE、处理器专家库、全芯片仿真、可视化参数显示工具、项目工程管理器、C交叉编译器、汇编器、链接器以及调试器。
5。
2调试过程
我们使用的是单片机本身配套的BDM,在调试时,把程序编译下载到S08AC60单片机内,运行后可通过内存窗口查看程序运行状况。
根据小车在模拟跑道上的状况调整参数,完善硬件、软件设计,最终达到理想的水平。
总结
在此份报告中,我主要介绍了智能车准备的基本思路,包括电路、软件、以及最重要的控制算法的创新思想。
在电路方面,我们以模块形式分类,在电源管理、电机驱动、舵机驱动、传感器、速度检测,这五个模块分别设计,在查找资料的基础上确定合适的最优方案;
然后我加以实验,最后以报告中所提到的形式决定了我们最终的电路。
在算法方面,我们使用C语言编程,利用比赛推荐的开发工具调试程序,经过小组成员不断讨论、改进,终于设计出一套比较通用的,稳定的程序。
在这套算法中,我们结合路况调整车速,做到直线加速,弯道减速,保证在最短时间跑完全程。
虽然成功的完成了智能车的设计制作,但是赛车的整体性能还有可提高的环节,我们在以下方面还有待于更大的提高。
路线识别方面,如果合理的调整红外装置,则可以更远的探测路线,以便做好弯道前的准备,这样便可以在直道上更充分的加速.在循线算法方面,更多的阅读文献,查阅资料,可以使得理论更加成熟,也可以更有效的完善算法.
参考文献
1王威.嵌入式微控制器S08AW原理与实践[M].北京:
北京航空航天大学出版社,2009.
2陈杰。
传感器与检测技术[M].北京:
高教出版社,2004.
3邵贝贝龚光华.单片机认识与实践[M].北京:
北京航空航天大学出版社,2006.
4阎石.数字电子技术基础(第三版)。
北京:
高等教育出版社,1989
5陈懂,刘瑢,金世俊.智能小车的多传感器数据融合.现代电子技术,2005,第六期
6臧杰,阎岩.汽车构造[M].北京.机械工业出版社.2005
7沈长生.常用电子元器件使用一读通[M].北京.人民邮电出版社.2004
8宗光华.机器人的创意设计与实践[M].北京。
北京航空航天大学出版社.2004
9张伟等.ProtelDXP高级应用[M].北京.人民邮电出版社.2002
10张文春。
汽车理论[M].北京.机械工业出版社.2005
11王晓明.电动机的单片机控制[M].北京.北京航空航天大学出版社.2002
附表1:
硬件电路图
附表2:
程序源代码
#include<
hidef。
h〉/*forEnableInterruptsmacro*/
#include"
derivative。
h"
/*includeperipheraldeclarations*/
#include<
math.h>
/*********************************定义舵机变量******************************************/
intad_data[12];
/*定义数组,存放12路ad转化后的值*/
intad_add=0;
intad_average=0;
intAD,Turn;
intmid_flag,left_close,right_close;
charZhuanjiao[]={180,170,160,150,140,130,121,113,106,100,95,90,85,80,74,67,59,50,40,30,20,10,0};
intflag0,flag1,flag2,flag3,flag4,flag5,flag6,flag7,flag8,flag9,flag10,flag11;
/*********************************定义电机变量******************************************/
#defineStop1TPM2C0V=2500;
PTCD_PTCD6=0;
PTFD_PTFD7=0;
//能耗
#defineStop2TPM2C0V=1500;
PTCD_PTCD6=1;
//反转
intcangshu[]={6,6,6,5,5,4,4,3,3,0,0,0,0,0,—3,—3,-4,-4,-5,—5,—6,-6,-6,};
//charShuruSudu[]={35,35,35,35,38,38,40,40,42,42,45,45,45,42,42,40,40,38,38,35,35,35,35};
//charShuruspeed[]={23,23,23,23,24,25,26,27,28,29,35,35,35,29,28,27,26,25,24,23,23,23,23};
//冲出跑道
charShuruspeed[]={12,12,12,13,14,15,16,17,18,19,20,20,20,19,18,17,16,15,14,13,12,12,12};
//刚好
//charShuruspeed[]={8,8,8,7,7,8,9,9,10,11,13,13,13,11,10,9,9,8,7,7,8,8,8};
intspeed,a,b;
intu=0;
intv,w;
intuk;
intm,n;
intzw[]={0,0,0,0,0,0,0,0,0,0,0};
intr;
intl[]={0};
intcircle=0;
typedefstruct
{
intNextPoint;
intThisPoint;
//设定目标Desiredvalue
intKp;
//比例常数ProportionalConst
intKi;
//积分常数IntegralConst
intKd;
//微分常数DerivativeConst
intLastError;
//Error[-1]
intPrevError;
//Error[—2]
intSumError;
//SumsofErrors
}speedPID;
speedPIDsPID;
/**pp=&sPID;
*/
//比例常数ProportionalConst
intKi;
//Error[-1]
intPrevError;
//Error[—2]
}steerPID;
steerPIDDjPID;
/*,*pp=&DjPID;
*/
/*************************************************************************/
voidADCInit(void)
{
ADC1CFG=0X00;
/*A/D初始化,高速模式,8位精度,ADCK=总线频率*/
ADC1SC2=0X00;
/*软件触发,比较功能禁止*/
APCTL1=0XFF;
/*AD0~AD7使能*/
APCTL2=0XFF;
/*AD8—AD15使能*/
ADC1SC1=0X00;
/*禁止转换完成中断,单词转换,选择AD0,并启动了转换*/
}
/*************************************************************************/
voidget_data(void)
{
ad_add=0;
/*采集*/
ADC1SC1=0X00;
/*选择AD通道0,若转化没有结束则等待,否则将转化结果存放入ad_data[0]中*/
for(;
!
ADC1SC1_COCO;
);
ad_data[0]=ADC1RL;
ad_add=ad_add+ad_data[0];
ADC1SC1=0X01;
ADC1SC1_COCO;
);
ad_data[1]=ADC1RL;
ad_add=ad_add+ad_data[1];
ADC1SC1=0X02;
for(;
!
ad_data[2]=ADC1RL;
ad_add=ad_add+ad_data[2];
ADC1SC1=0X03;
ad_data[3]=ADC1RL;
ad_add=ad_add+ad_data[3];
ADC1SC1=0X04;
ad_data[4]=ADC1RL;
ad_add=ad_add+ad_data[4];
ADC1SC1=0X05;
ad_data[5]=ADC1RL;
ad_add=ad_add+ad_data[5];
ADC1SC1=0X06;
ad_data[6]=ADC1RL;
ad_add=ad_add+ad_data[6];
ADC1SC1=0X07;
ad_data[7]=ADC1RL;
ad_add=ad_add+ad_data[7];
ADC1SC1=0X08;
ad_data[8]=ADC1RL;
ad_add=ad_add+ad_data[8];
ADC1SC1=0X09;
ad_data[9]=ADC1RL;
ad_add=ad_add+ad_data[9];
ADC1SC1=0X0A;
ad_data[10]=ADC1RL;
ad_add=ad_add+ad_data[10];
ADC1SC1=0X0B;
ad_data[11]=ADC1RL;
ad_add=ad_add+ad_data[11];
ad_average=ad_add/7;
/*************************************************************************/
if(ad_data[0]〉=ad_average)
{
flag0=1;
}
if(ad_data[0]<
ad_average)
{
flag0=0;
if(ad_data[1]〉=ad_average)
flag1=300;
if(ad_data[1]〈ad_average)
flag1=0;
if(ad_data[2]〉=ad_average)
flag2=5;
if(ad_data[2]〈ad_average)
flag2=0;
if(ad_data[3]>
=ad_average)
flag3=700;
if(ad_data[3]<
ad_average)
flag3=0;
if(ad_data[4]〉=ad_average)
flag4=8;
}
if(ad_data[4]<
flag4=0;
if(ad_data[5]〉=ad_average)
flag5=1100;
if(ad_data[5]<