




已阅读5页,还剩13页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
二一四二一五 学年第 一 学期信息科学与工程学院技术报告书课程名称: 智能汽车设计与实践 班 级: 自动化1201 学 号: 姓 名: 指导教师: 章政 2014年12月24日基于红外寻迹型智能汽车设计与制作为了方便智能汽车的结构设计,在设计的初期我们就打算采取模块化的设计原理,对智能汽车实行模块化的设计。论文以智能汽车的设计与制作的实现流程进行模块化的介绍:第一节:制作技术的整体方案;第二节:设计的思路:硬件,软件设计与实现第三节:制作模块调试过程;第四节:总结与回顾一制作技术的整体方案: 在实现智能车的过程中我们采用了各种的方案比对,对所有电路进行模块化接口化处理,大大降低了电路在实现过程中出现的错误,分为:电源接口模块,传感器模块,电机驱动模块,数据传输与上位机模块等。然后通过接口连接在一起,实现工作稳定的智能车硬件电路。他使用了传感器,编码电机,无线模块,稳压管等作为重要的任务器件。实现了赛道识别,速度测控,赛车数据传输,电源稳压,速度控制等功能。 车模整体模型二.设计思路:1.硬件:图1 电路板 图2 前轮 图3 后轮 图4 舵机 图5 电池的安装 图6 传感器支架 图7 传感器2. 电路模块:1.单片机及接口是焊接的第一个步骤,主要包括晶振(下)和复位电路(上)。2.红外传感器:光电传感器一般有两个部分组成:发射管和接收管。发射管发射光线,光线经过赛道的反射,由接收管接受,用过不同的光强接收管的状态不同,实施赛道信息的采集,应为白色和黑色对于光线反射的系数不同,放射会傀儡的光线的强度不一样,被不同的接收单元接收后表现出不同的反应状态(电阻的变化,电流电压的变化等)3.电源:为了使智能汽车的系统正常的工作,需要对电源电池电压进行调节,其中单片机的路径识别传感器,测速模块需要5V的电压,用LM7805组成5V稳压电路。直流电机作在7.2V直接上电。因为电机,舵机要频繁接加速减速,所以电压波动较大,5V电压还要给51单片机供电,防止意外功能给点不足重启再LM7805两端加上大电解电容。4.舵机: 5.拨码开关 6.电机驱动模块:电机驱动使用专用电机的驱动芯片ULN2803,系统利用单片机的PWM控制电机转速,充分利用PWM模块资源。电机PWM的频率8KHz。3.软件:/晶振 12MHz 1T模式 总线频率12MHz,一个指令1/12us#include STC12C5A60S2.H /STC12C5A60S2的头文件#include nokia_5110.h#include key.h#define uchar unsigned char /宏定义#define uint unsigned int#define T0_HIGH 0xff /T0计时器寄存器初值#define T0_LOW 0x7f /溢出计数120个,120*(1/12)定时周期10us#define MOTOR_MAX_PWM_COUNT 100 /PWM计数器最大值 10us*100=1ms,1000Hz#define SERVO_MAX_PWM_COUNT 2000/10us*2000=20ms,50HZ /舵机控制高电平0.52.5ms对应PWM的50250 #define MOTOR_MAX_PWM 100 /电机PWM最大最小值#define MOTOR_MIN_PWM 0#define SERVO_LEFT_MAX_PWM 80 /min 90 /舵机左打最大角度时的PWM#define SERVO_RIGHT_MAX_PWM 160 /max 150 /这个值需要自己根据舵机实际角度调试#define SERVO_MID_PWM 120/舵机中心值#define ERROR_HISTORY_NUM 3 /历史偏差记录个数#define MAX_ERROR_SUM 200 /积分幅值sbit LEFT_MOTOR_PWM_PORT=P37; / 电机PWM控制端口sbit RIGHT_MOTOR_PWM_PORT=P36;sbit SERVO_PWM_PORT=P35; /舵机PWM控制端口sbit PHL=P17;sbit change_line = P10;/独立按键扫描sbit Add_1 = P14;sbit Sub_1 = P15;sbit KEY=P13; sbit Add_5 = P11;sbit Sub_5 = P12;sbit BOMA1=P07;bit control_period_finished=0; /控制周期结束标志位,控制周期选择20mschar motor_PWM_counter=0;/生成电机PWM的计数器char left_motor_PWM=0; /左右电机的PWM占空比 /由于数值在128以内,所以定义为charchar right_motor_PWM=0;int servo_PWM_counter=0;/生成舵机PWM的计数器int servo_PWM=0;/舵机PWM /超过char型变量的范围uchar infrared_state=0; /红外管状态uchar AD_value8; /红外管电压int error=0; /本次偏差int error_historyERROR_HISTORY_NUM=0; /历史偏差int error_sum=0; /偏差的积分servo_P=30; /PID系数servo_I=4;servo_D=85;servo_F=8;servo_L=65;int PID_out=0; /PID输出int P2H;int PH; speed_expect=95; /给定速度 int worse=0;/-void sys_init(void) /系统初始化 /-IO口设置- P0M1=0x00; /拨码,设置为输出, P0M0=0xff; P0=0xff; /初始化为高电平,拨码打开时为低电平 P1M1=0x00; /独立按键,设置为准双向口 P1M0=0x00; P1=0xff; P2M1=0x00; /指示灯,设置为准双向口 P2M0=0x00; P2=0xff; P3M1=0x00; /模拟PWM,设置为输出 P3M0=0xff; P3=0x00; 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;/舵机打角到中心 /-定时器设置- AUXR=AUXR | 0x80; /定时器0不分频 TMOD=0x11; /定时器方式1 TH0=T0_HIGH; /定时器赋初值 TL0=T0_LOW ; TR0=1; /定时器运行 ET0=1; /开定时器中断 EA=1; /开总中断/-int ABS(int i) /绝对值函数 if (i=0) return i; else return -i;/-void delay(unsigned int i) /延时函数 unsigned char j; for(;i0;i-) for(j=0;j250;j+);void get_black_position(void) /判断黑线位置 PH=PHL; P2H=P2; PH=PH120) /如果两次的偏差过大,则保持上一次的偏差 error=error_historyERROR_HISTORY_NUM-1; /防止不确定情况(如红外管冲出跑道)造成的偏差跳变 for(i=0;iERROR_HISTORY_NUM-1;i+) /记录偏差 error_historyi=error_historyi+1; error_historyERROR_HISTORY_NUM-1=error; /根据偏差计算舵机角度输出 PID_out = ( 28*error_historyERROR_HISTORY_NUM-1 /比例 + servo_D*(error_historyERROR_HISTORY_NUM-1-error_historyERROR_HISTORY_NUM-2)/微分 )/150; /这里使用乘以一个大的系数再除以一个数的方法 servo_PWM = SERVO_MID_PWM + PID_out; /控制舵机 if(servo_PWMSERVO_RIGHT_MAX_PWM) servo_PWM=SERVO_RIGHT_MAX_PWM;void motor_control(void) /电机控制 char SUM=0 ; /历次偏差和 char i=0; for(i=0;iERROR_HISTORY_NUM;i+) /对历次偏差绝对值求和 SUM=SUM+error_historyi; if(SUM =10) /向右拐 right_motor_PWM=speed_expect-2*servo_F*SUM/500; left_motor_PWM=speed_expect-servo_I*SUM/500; else if (SUM -25) /向左拐 right_motor_PWM=speed_expect+servo_I*SUM/500; left_motor_PWM=speed_expect+servo_F*SUM/500; else if (SUM -10) /直线上 right_motor_PWM=speed_expect; left_motor_PWM=speed_expect; else right_motor_PWM=servo_L; left_motor_PWM=servo_L; if(BOMA1&worse=10) right_motor_PWM=0; left_motor_PWM=0; if(left_motor_PWMMOTOR_MAX_PWM) /限幅 left_motor_PWM=MOTOR_MAX_PWM; if(left_motor_PWMMOTOR_MAX_PWM) right_motor_PWM=MOTOR_MAX_PWM; if(right_motor_PWMMOTOR_MAX_PWM_COUNT) /PWM比较、生成 motor_PWM_counter=1; /从1开始计数 if(servo_PWM_counterSERVO_MAX_PWM_COUNT) /PWM比较、生成 servo_PWM_counter=1; /从1开始计数 control_period_finished=1; /20ms控制周期到达,标志位置1,这里借用了舵机控制周期20ms(50Hz), /如果更改主程序控制周期,可定义一个类似于servo_PWM_counter的计数器计时 if(left_motor_PWM=motor_PWM_counter) /左右PWM LEFT_MOTOR_PWM_PORT=1; /端口输出高电平 else LEFT_MOTOR_PWM_PORT=0; /端口输出低电平 if(right_motor_PWM=motor_PWM_counter) RIGHT_MOTOR_PWM_PORT=1; else RIGHT_MOTOR_PWM_PORT=0; if(servo_PWM=servo_PWM_counter)/舵机PWM SERVO_PWM_PORT=1; else SERVO_PWM_PORT=0;3 问题与调试:在烧制程序后不是开始直接上赛道,而是分块的开始调试个个模块的功能,基本功能是否可以实现,检查硬件的焊接,接口的连接,在保证个个模块的基本性能是好的以后再开始满足测速和平稳性。改变算法或则改变机械组装的方式达到改善性能的目的。总之,小小的只智能汽车会有很多问题的出现,通过不断地调试次啊能不断地的调试方法不能一举。在这里我以自己出现的问题为例加以说明。里面涉及到的主要问题就是舵机,因为舵机自身的问题为此找过章政老师两次,当然有一次也麻烦到了孙平学长帮我检测。后来换上好的舵机以后就得考虑算法问题,最后还是采用的老师所给出的PID算法,不过考虑到积分时间与舵机的脉冲时间,发现I实际上是没有多大的作用分,于是最后直接采用的是PD算法。对于速度的测试,原本打算利用测速码盘采用闭环控制,后来由于感觉比赛临近来不及(当然后来推迟了几次),于是放弃了闭环控制。因此,只能依赖于硬件以及对传感器的控制上面。为了让传感器有很好的控制,能够灵敏的反应,于是之前利用一个板子上面有一条黑线的测试了好几次,确定在黑白不同位置舵机能够有所反应。但是当我把车子放到赛道上时,发现她并不能像之前想象的那样行驶,原因是由于传感器由于光线的原因无法做出正确的反应,当然这样舵机就无法得到正确的脉宽,于是出现不能做出正确的转向的问题。后来只能在跑道上,对每一个灯加上热缩管,改变其接受到的红外光强度,最后获得了最佳状态。随着速度的增加,或多或少传感器都会出现晃动,然而我们知道晃动会影响到接受红外光的强度,最终导致舵机无法正常的偏转。于是我又用胶枪把传感器那部分直接胶死,然后加了两个黑色支架对传感器支架进行了固定(利用三角形的稳定性)。或许正是因为我对传感器这样的设计,因此它的寿命以及抗干扰的能力提高了很多。当然这一点从平时练习跑时,不管事我撞别人还是别人撞我,以及意外的撞到墙上,传感器基本没有什么影响可以看出。针对车子会撞到墙上,也就是意外的冲出跑道,采取了未填学长的保护程序。这样的确有了很好的保护,不过发现有时候它会在全白的跑道减速甚至停止,尽管并没有冲出跑道,但是依然无法正常的比赛。后来为了防止在正式的比赛不会出现这种状况,我加了一个拨码开关,可以选择开或者关保护程序。赛车可以完整的跑完赛道以后,现在需要的就是如何让它稳定而且快速的跑完赛道。对于采用开环控制的我来说这就需要硬件达到更高的高度,还有就是参数得尽量达到完美。之前对传感器的改善让我对硬件有了很大的提高。剩下的就是参数得改变。为了让PD控制的更加精确,我增加了error得值,同时将PD控制除以得分母增加了。里面error的值是根据多次赛道试跑改变的。再就是加了一个弯度得判断,再她左拐时,左轮和右轮都减速,左轮比右轮减速更多。同理对右拐时也是如此。为了得到最佳的参数,我给出了I,F参数,其中F大于I,利用right_motor_PWM=speed_expect+servo_I*SUM/500;left_motor_PWM=speed_expect+servo_F*SUM/500;其中SUM是几次拐弯error的总和,根据SUM的正负判断是作怪还是右拐(上面以左拐为例,左轮的速度在原来的基础上减去的更多)。后来发现当SUM大到一定的值时这种控制并不科学,于是又给了一个参数L来判断弯度多大时用什么控制。再确定以后,又将L换成速度参数直接在当SUM太大时同时给定左右轮速度。因为里面的参数(包括PD)都是利用按键控制以及显示屏显示,因此在参数调节上有了很大的便利。最后当SUM的值小时,给它原来的速度,SUM大时利用差轮减速,然后SUM更大时直接给定一个比原来小的速度。里面所有参数都是通过实践印证。差轮减速尤其在小S弯道对它的衔接有了很大的改善,我想这或许也就是为什么我的车子在速度以及稳定性能够达到一个比较理想状态的原因。4 结束语: 通过对智能汽车设计的学习,让我了解到信息融合技术给智能汽车带来了更加光明的前景,信息融合技术使得车辆能够利用多传感器集成技术以及融合技术,结合环境信息、交通状况信息做出一个最优决策,实现车辆自动感知前方的障碍物,及时采取措施进行避让;通过对前方信号的识
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论