武汉科技大学级智能汽车设计及制作论文Word格式.docx
《武汉科技大学级智能汽车设计及制作论文Word格式.docx》由会员分享,可在线阅读,更多相关《武汉科技大学级智能汽车设计及制作论文Word格式.docx(16页珍藏版)》请在冰豆网上搜索。
论文以智能汽车的设计与制作的实现流程进行模块化的介绍:
第一节:
制作技术的整体方案;
第二节:
设计的思路;
1.硬件设计与实现
2.软件设计与实现
第三节:
制作模块调试过程;
第四节:
总结与回顾
制作技术的整体方案
全国大学生“飞思卡尔”杯智能汽车竞赛是在规定的模型汽车平台上,使用飞思卡尔半导体公司的8位、16位微控制器作为核心控制模块,通过增加道路传感器、电机驱动电路以及编写相应软件,制作一个能够自主识别道路的模型汽车,按照规定路线行进,以完成时间最短者为优胜。
制作智能汽车所涉及的专业知识包括控制、模式识别、传感技术、汽车电子、电气、计算机、机械等多个学科,对大学生的知识融合和实践动手能力的培养,对汽车电子技术的发展,具有良好的长期的推动作用。
在实现智能车的过程中我们采用了各种的方案比对,对所有电路进行模块化接口化处理,大大降低了电路在实现过程中出现的错误,分为:
电源接口模块,传感器模块,测速模块,电机驱动模块,数据传输与上位机模块等。
然后通过接口连接在一起,实现工作稳定的智能车硬件电路。
他使用了传感器,编码电机,无线模块,稳压管等作为重要的任务器件。
实现了赛道识别,速度测控,赛车数据传输,电源稳压,速度控制等功能。
关键字智能车,传感器,稳压电路,PCB设计
设计思路
硬件:
1、前后轮
2、舵机:
舵机主要用来调节转向来达到控制车速和车身平稳。
3、测速码盘
4、传感器支架
第二步:
1.最小系统是焊接的第一个步骤,主要包括晶振(下)和复位电路(上)。
2.红外传感器:
光电传感器一般有两个部分组成:
发射管和接收管。
发射管发射光线,光线经过赛道的反射,由接收管接受,用过不同的光强接收管的状态不同,实施赛道信息的采集,应为白色和黑色对于光线反射的系数不同,放射会傀儡的光线的强度不一样,被不同的接收单元接收后表现出不同的反应状态(电阻的变化,电流电压的变化等)
3.电源:
为了使智能汽车的系统正常的工作,需要对电源电池电压进行调节,其中单片机的路径识别传感器,测速模块需要5V的电压,用LM7805组成5V稳压电路。
直流电机作在7.2V直接上电。
因为电机,舵机要频繁接加速减速,所以电压波动较大,5V电压还要给51单片机供电,防止意外功能给点不足重启再LM7805两端加上大电解电容。
4.舵机:
5电机驱动模块:
电机驱动使用专用电机的驱动芯片ULN2803,系统利用单片机的PWM控制电机转速,充分利用PWM模块资源。
电机PWM的频率8KHz。
6.指示灯拨码调试:
软件:
程序的实现:
功能实现的程序与注释:
//晶振24MHz6T模式,总线频率4MHz指令0.25us
#include<
REG52.H>
//89C52的头文件
#defineucharunsignedchar//宏定义
#defineuintunsignedint
#defineT0_HIGH0xff//T0计时器寄存器初值
#defineT0_LOW0xaf//溢出计数80个,定时周期80*0.25us=20us
//为了保证主程序正常运行,定时器计数最好不要小于80个
#defineMOTOR_MAX_PWM_COUNT100//PWM计数器最大值20us*100=2000us,500Hz
#defineSERVO_MAX_PWM_COUNT1000//20us*1000=20ms,50HZ//舵机控制高电平0.5~2.5ms对应PWM的25~125
//舵机控制频率在50~100Hz之间,这里选50Hz
#defineMOTOR_MAX_PWM100//电机PWM最大最小值
#defineMOTOR_MIN_PWM0//
#defineSERVO_LEFT_MAX_PWM50//min48//舵机左打最大角度时的PWM
#defineSERVO_RIGHT_MAX_PWM84//max84//这个值需要自己根据舵机实际角度调试
#defineSERVO_MID_PWM67//舵机中心值
//注意,舵机打角过大会打在底盘上,请立即断电,以免损害舵机
#defineERROR_HISTORY_NUM3//历史偏差记录个数
#defineMAX_ERROR_SUM120//积分幅值
sbitLEFT_MOTOR_PWM_PORT=P3^7;
//电机PWM控制端口
sbitRIGHT_MOTOR_PWM_PORT=P3^6;
sbitSERVO_PWM_PORT=P3^5;
//舵机PWM控制端口
sbitBOMA1=P1^0;
//拨码开关输入端口
sbitBOMA2=P1^1;
sbitBOMA3=P1^2;
sbitBOMA4=P1^3;
sbitBOMA5=P1^4;
sbitBOMA6=P1^5;
sbitBOMA7=P1^6;
sbitBOMA8=P1^7;
//--------------------------
bitcontrol_period_finished=0;
//控制周期结束标志位,控制周期选择20ms
//也可自己确定控制周期,但是要保证主程序在控制周期内可以运行完
charmotor_PWM_counter=0;
//生成电机PWM的计数器
charleft_motor_PWM=0;
//左右电机的PWM//由于数值在128以内,所以定义为char
charright_motor_PWM=0;
intservo_PWM_counter=0;
//生成舵机PWM的计数器
charservo_PWM=0;
//舵机PWM//由于数值在128以内,所以定义为char
//注意数据类型的选择,如果实际的值大于128,就不能使用char型
interror=0;
//本次偏差
interror_history[ERROR_HISTORY_NUM]={0};
//小车相对于黑线的偏差
interror_sum=0;
//偏差的积分
intservo_P=10;
//PID系数
intservo_I=2;
intservo_D=25;
intPID_out=0;
//PID输出
charspeed_expect=40;
//给定速度
//-----------------------------------------------------------------------
voiddelay(unsignedinti)//延时函数
{
unsignedcharj;
for(;
i>
0;
i--)
for(j=0;
j<
250;
j++);
}
intABS(inti)//绝对值函数
if(i>
=0)returni;
elsereturn-i;
voidsys_init(void)
//------IO口设置------------
P0=0xff;
//指示灯,共阳极,设置为高电平,全灭
P1=0xff;
//拨码开关,设置为高电平,检测输入
P2=0xff;
//红外管状态输入,设置为高电平,检测输入
P3=0x00;
//PWM输出口,需要外加上拉电阻,否则无法驱动
LEFT_MOTOR_PWM_PORT=0;
//PWM口设为低电平,电机不转
RIGHT_MOTOR_PWM_PORT=0;
left_motor_PWM=0;
//占空比设置为0
right_motor_PWM=0;
servo_PWM=SERVO_MID_PWM;
//舵机打角到中心
//------定时器设置------------
TMOD=0x11;
//定时器0方式1
TH0=T0_HIGH;
//定时器赋初值
TL0=T0_LOW;
TR0=1;
//定时器运行
ET0=1;
//开定时器中断
EA=1;
//开总中断
voidBOMA_chioce(void)//拨码开关调节参数//使用51单片机IO口需要初始化为高电平
{
if(BOMA1==0){servo_P=servo_P+5;
}
if(BOMA2==0){servo_P=servo_P+5;
if(BOMA3==0){servo_P=servo_P+10;
}
if(BOMA4==0){servo_D=servo_D+5;
if(BOMA5==0){servo_D=servo_D+5;
if(BOMA6==0){servo_D=servo_D+10;
if(BOMA7==0){speed_expect=speed_expect+20;
if(BOMA8==0){speed_expect=speed_expect+30;
voidget_black_position(void)//寻找黑线位置
switch(P2&
0x7f)//使用了7个红外管,屏蔽无用的一位,根据硬件电路设计编写
{//case表示红外管的状态,最多会有两个红外管在黑线上(根据硬件红外管焊接的距离而定,黑线宽度2.5cm)
case0x01:
error=6;
break;
//000000010x01//右
case0x03:
error=5;
//000000110x03
case0x02:
error=4;
//000000100x02
case0x06:
error=3;
//000001100x06
case0x04:
error=2;
//000001000x04
case0x0c:
error=1;
//000011000x0c
case0x08:
error=0;
//000010000x08
case0x18:
error=-1;
//00011