智能小车控制系统设计报告.docx
《智能小车控制系统设计报告.docx》由会员分享,可在线阅读,更多相关《智能小车控制系统设计报告.docx(22页珍藏版)》请在冰点文库上搜索。
智能小车控制系统设计报告
智能小车控制系统
一、方案论证比较……………………………………………………
1.车体模型的比较与选择………………………………………………
2.驱动电机的比较与选择………………………………………………
3.传感器的比较与选择…………………………………………………
4.电源的比较与选择……………………………………………………
二、系统设计……………………………………………………
三、系统调试…………………………………………………………
四、系统功能……………………………………………………
五、设计总结…………………………………………………
六、小车程序…………………………………………………………
摘要:
本系统采用AT89S52作为核心芯片,控制智能车的一系列动作。
小车采用ULN2803A芯片驱动两步进电机,能精确控制小车的转弯,前进,后退等动作;结合两个红外对射管,对边界黑线进行检测,从而判断小车的位置,然后对红外对管输出的信号处理后控制小车做出各种动作。
关键词:
超声波传感器红外线传感器
一、方案论证比较
1.车体模型的比较与选择
方案一、购买玩具电动车:
购买的玩具电动车具有组装完整的车架车轮。
依靠电机与相关齿轮一起驱动,装配紧凑,使得各种所需电路的安装十分方便,看起来也比较美观,但是市面上多是用于飞思卡尔之类的车,较难找到完全符合比赛要求,在大小,前轮可转向以及价格方面都兼顾的车。
方案二、自己组装车:
一般的说来,自己制作的车体比较粗糙简陋,主要由几块基板组成,但胜在适合改造,基板表面对称着钻有许多孔,方便安装电路板、电源、车轮以及固定电机,还可以根据需要进行钻孔、拼接,而且价格比较便宜。
通过比较,选用方案二。
2.驱动电机的比较与选择
方案一、直流电机+转向舵机:
直流电机应用了“通电导体在磁场中受力的作用”的原理,励磁线圈两个端线同有相反方向的电流,使整个线圈产生绕轴的扭力,使线圈转动。
直流电动机的调速范围宽广,调速特性平滑。
起动力矩大。
可以均匀而经济地实现转速调节。
但是由于使用直流电机难以控制左右速度差实现转弯,必须加上转向舵机使小车实现转弯,这使小车的结构制造复杂,价格较高。
方案二、步进电机+万向轮:
步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。
在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度,称为“步距角”,它的旋转是以固定的角度一步一步运行的。
由于每步的精度在3%-5%,而且不会将一步的误差积累到下一步因而有较好的位置精度和运动的重复性;优秀的起停和反转响应;仅仅将负载直接连接到电机的转轴上也可以极低速的同步旋转。
由于速度正比于脉冲频率,因而有比较宽的转速范围。
采用两个万向轮+两个步进电机驱动小车,可以通过左右两个电机的转速差容易实现左右原地转弯。
并且由于步进电机转动角度可以精确控制,使得小车能够精确控制左右转弯的角度以及前进后退的距离。
这给小车各种功能的实现带来了极大的方便。
基于以上分析,我们采用了方案二。
3.传感器的比较与选择:
方案一、发光二极管+光敏电阻:
采用发光二极管发光,用光敏光敏电阻配合判断。
当发光二极管发出的可见光照射到黑带时,光线被黑带吸收,光敏电阻没受到光照,呈现高阻态,输出端为低电平信号给单片机;当发光二极管发出的可见光照射到白底时,光线反射,光敏电阻受到光照,呈现低阻态,输出端为高电平信号给单片机。
通过这种方法来判断是否遇到黑线。
但是光敏电阻极易受环境影响,稳定性也很差。
方案二、红外对管:
利用红外线发射管发射红外线,红外线二极管进行接收。
采用四组红外对管发射和接受红外信号,外面可见光对接收信号的影响较小,接收的红外信号经LM324进行比较转换为电压信号,产生高电平或低电平返回给单片机。
同方案一的远离一样,当遇到黑线时,红外线被吸收,信号经过处理返回低电平给单片机;当遇到白底时,红外线被反射,信号经过处理返回高电平给单片机;此方案最大的优点是受外界环境干扰小。
通过比较,我们采用了受外界环境干扰小的方案二。
4.电源的比较与选择
方案一、采用双电源
为了确保单片机控制部分和后轮电机驱动的部分的电压不会互相影响,要把单片机的供电和驱动电路分开来,即:
12v来驱动步进电机,同时用7805稳压管将电压来稳成5V供给单片机,这样有助于消除电机干扰,提高系统的稳定性。
但采用双电源实现起来比较麻烦。
方案二、采用5v单电源
用10.8V的锂电池通过7805稳压到5v同时给单片机及步进电机供电。
这种接法比较简单,但小车的电路功耗过大会导致后轮电机动力不足。
由于我们的小车质量不大,而且速度要求不高,通过综合分析,我们采用了方案二。
二、系统设计
1.总体设计
本系统利用单片机AT89S52单片机作为本系统的控制核心,该单片机可以将从传感器的输出信号得到外界的信息,判断小车是否到达边界,然后在程序中控制步进电机转动的角度精确控制,从而实现电动车的前进距离的精确控制以及左右轮差速转动实现转弯等。
2.单元电路设计
2.1传感器模块
利用光的反射原理,当光线照射在白纸上,反射量比较大,反之,照在黑色物体上,由于黑色对光的吸收,反射回去的量比较少,这样就可以判断是否遇到黑带。
采用红外线发射,外面可见光对接收信号的影响较小,利用红外对管对黑线边界进行检测,再用LM324对检测信号进行比较,取反,送单片机进行处理。
电路原理如下所示
2.2单片机控制模块
本系统采用AT89S52单片机系统控制电路,主要由:
电源电路、晶振电路、复位电路,电路结构简单,性能稳定,是单片机系统控制普遍采用的硬件电路。
电路原理如下图
2.3步进电机驱动模块
本系统采用两个步进电机作为后轮驱动力。
两个步进电机通过ULN2803A芯片对单片机送来的脉冲信号进行取反放大,然后送到步进电机处,保证通过电机的电流足够大,使电机正常工作。
电路原理图如下电路原理图如下
2.4电源模块
电源模块采用10.8V锂电池组对单片机控制部分和电机驱动部分进行供电。
电源经7805稳压成5V稳定电压后给单片机控制部分及步进电机供电。
电路原理图如下
2.5倒车、刹车灯模块
为了使我们的小车更加接近现实,更加逼真,我们特意在小车后部加了六个LED灯,小车处在不同状态下,有不同的信号灯亮,比如前进的时候两个绿灯亮,后退的时候两个黄灯亮,前进过程中小于安全距离就亮红灯,左转、右转过程中小于安全距离就亮黄灯等等。
原理图如下:
3.各单元模块的联接
整个智能小车系统主要由四大模块组成,以AT89S52为核心的控制模块,传感器模块,电源模块以及步进电机模块。
四大模块构成了小车的主要框架。
附带一个提醒灯模块,主要是增加小车的真实性。
步进电机模块通过ULN2803A驱动芯片与单片机连接起来,驱动芯片主要功能是将单片机发送的脉冲指令放大取反。
传感器模块通过LM324电平比较芯片与单片机连接起来,芯片主要将红外对管采集到的模拟信号转换为数字信号发送给单片机,让单片机进行判断并执行相应的动作。
电源模块通过7805芯片将一个10.8V的锂电池組稳压到5V给单片机及步进电机供电。
三、系统调试
根据题目要求,我们对各要求进行排序并逐个设计制作和调试,我们通过多次试验,对比,调试,通过软硬件调试和磨合后,效果良好。
四、系统功能
1、模式1:
利用无线模块实现简单的遥控车,按A键为前进,按B键为右转,按C键为左转,按D键为后退,其中还用到超声波传感器来进行测距,从而使得小车不发生碰撞;
2、模式2:
实现自动入库
3、模式3:
按A键为走圆弧,按B键为走梯形,按C键为走S形,按D键为停止。
五、设计总结
通过各种方案的讨论及尝试,再经过多次的整体软硬件结合调试,不断地对系统进行优化,可能出现失误的就是受光线影响致使小车有时会检测不到黑线而跑出界或者接线不良导致的失误。
在本次设计过程中,我们深刻体会到共同协作的重要性。
通过对此课题的研究,我们体验到在实践中学习的显著效果,提高了自己解决问题的能力。
这次的比赛,我们从不懂地去摸索,到有了一点方向地去了解,学到了很多东西。
不管这次的成绩如何,这次比赛对我们有着特殊的意义,而在电子方面的启蒙将是我们最大的收获与成功。
附2:
小车程序
#include
#include
#defineucharunsignedchar//定义一下方便使用
#defineuintunsignedint
#defineulongunsignedlong
sbitTx=P3^3;//产生脉冲引脚
sbitRx=P3^2;//回波引脚
sbitK1=P1^4;
sbitK2=P1^5;
sbitK3=P1^6;
sbitK4=P1^7;
sbitled1=P3^0;//红灯
sbitled2=P3^1;//红灯
sbitled3=P3^4;//黄灯
sbitled4=P3^5;//黄灯
sbitled5=P3^6;//绿灯
sbitled6=P3^7;//绿灯
sbitg1=P2^4;
sbitg2=P2^5;
uintdistance[4];//测距接收缓冲区
uintdistance_data;
uchartemp,flag,outcomeH,outcomeL;//自定义寄存器
bitsucceed_flag;//测量成功标志
bitt_flag=0;
ucharcodeFFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9};//正转
ucharcodeREV[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1};//反转
ucharcodeCIRCLE[16]={0xf1,0xf1,0xf3,0xf3,0xf2,0xf2,0xf6,0xf6,0xf4,0xf4,0xfc,0xfc,0xf8,0xf8,0xf9,0xf9};
voiddelay1ms(uinti)
{
ucharj;
while(i--)
{
for(j=0;j<245;j++)//1ms基准延时程序
{}
}
}
voidmotor_ffw(intn)//两步进电机正转
{
uchari;
uintj;
for(j=0;j{
for(i=0;i<8;i++)//一个周期转45度
{
P0=REV[i];//取数据
P2=FFW[i];//取数据
delay1ms
(1);//调节转速
}
}
}
voidmotor_rev(intn)//两步进电机反转
{
uchari;
uintj;
for(j=0;j{
for(i=0;i<8;i++)//一个周期转45度
{
P0=FFW[i];//取数据
P2=REV[i];//取数据
delay1ms
(1);//调节转速
}
}
}
voidturn_left(intn)//左转
{
uchari;
uintj;
for(j=0;jfor(i=0;i<8;i++)//一个周期转45度
{
P0=REV[i];//取数据
delay1ms
(1);//调节转速
}
}
voidturn_right(intn)//右转
{
uchari;
uintj;
for(j=0;j{
for(i=0;i<8;i++)//一个周期转45度
{
P2=FFW[i];//取数据
delay1ms
(1);//调节转速
}
}
}
voidtui_you(intn)
{
uchari;
uintj;
for(j=0;jfor(i=0;i<8;i++)//一个周期转45度
{
P2=REV[i];//取数据
delay1ms
(1);//调节转速
}
}
voidtui_zuo(intn)
{
uchari;
uintj;
for(j=0;jfor(i=0;i<8;i++)//一个周期转45度
{
P0=FFW[i];//取数据
delay1ms
(1);//调节转速
}
}
voidSyou(intn)//走S型向左
{
ucharj,k1=0,z;
for(j=0;j{
for(z=0;z<8;z++)//一个周期转45度
{
P0=REV[z];//取数据
P2=CIRCLE[k1];//取数据
delay1ms
(1);//调节转速
k1++;
if(k1>15)
k1=0;
}
}
}
voidSzuo(intn)//走S型向右
{
ucharj,k2=0,z;
for(j=0;j{
for(z=0;z<8;z++)//一个周期转45度
{
P0=CIRCLE[15-k2];//取数据
P2=FFW[z];//取数据
delay1ms
(1);//调节转速
k2++;
if(k2>15)
k2=0;
}
}
}
voidstop()
{
P0=0xf0;//P2口设置为输入状态先全部写0
P2=0xf0;//P3口设置为输入状态先全部写0
}
voiddelay_20us()
{ucharbt;
for(bt=0;bt<60;bt++);
}
voidpai_xu()
{uintt;
if(distance[0]>distance[1])
{t=distance[0];distance[0]=distance[1];distance[1]=t;}
if(distance[0]>distance[2])
{t=distance[2];distance[2]=distance[0];distance[0]=t;}
if(distance[1]>distance[2])
{t=distance[1];distance[1]=distance[2];distance[2]=t;}
}
voidcejuinit()
{
flag=0;
Tx=0;//首先拉低脉冲输入引脚
TMOD=0x11;//定时器0,定时器1,16位工作方式
TR0=1;//启动定时器0
IT0=0;//由高电平变低电平,触发外部中断
EX0=0;//关闭外部中断
EA=1;//打开总中断0
}
voidceju()
{
inti;
i=0;
EA=0;
Tx=1;
delay_20us();
Tx=0;//产生一个20us的脉冲,在Tx引脚
while(Rx==0);//等待Rx回波引脚变高电平
succeed_flag=0;//清测量成功标志
EX0=1;//打开外部中断
TH1=0;//定时器1清零
TL1=0;//定时器1清零
TF1=0;//
TR1=1;//启动定时器1
EA=1;
while(TH1<30);//等待测量的结果,周期65.535毫秒(可用中断实现)
TR1=0;//关闭定时器1
EX0=0;//关闭外部中断
if(succeed_flag==1)
{
distance_data=outcomeH;//测量结果的高8位
distance_data<<=8;//放入16位的高8位
distance_data=distance_data|outcomeL;//与低8位合并成为16位结果数据
distance_data*=12;//因为定时器默认为12分频
distance_data/=58;//微秒的单位除以58等于厘米
}//为什么除以58等于厘米,Y米=(X秒*344)/2
//X秒=(2*Y米)/344==》X秒=0.0058*Y米==》厘米=微秒/58
if(succeed_flag==0)
{
distance_data=300;//没有回波则清零
}
}
voidmain()
{
while
(1)
{
led1=1;
led2=1;
led3=1;
led4=1;
led5=1;
led6=1;
stop();
cejuinit();
P1=0xff;
while(K1==0)//模式1
{
uchari;
ceju();
stop();
P1=0xff;//P1口设置为输入状态先全部写1
i=P1;//赋值给临时存贮变量
i=i&0x0f;//和0x0f相与屏蔽高四位,读取无线遥控码
if(i==0x04)//如果是0x04,则代表无线遥控器的按键A按下,执行显示
{
if(distance_data>=80)
{
motor_ffw(8);//前进
led5=0;
led6=0;
led1=1;
led2=1;
led3=1;
led4=1;
}
else
{
stop();
led5=1;
led6=1;
led1=0;
led2=0;
led3=1;
led4=1;
}
}
if(i==0x01)//如果是0x01,则代表无线遥控器的按键b按下,执行显示
{
if(distance_data>=100)
{
turn_right(8);//右转
led5=1;
led6=0;
led3=1;
led4=1;
led1=1;
led2=1;
}
else
{
led3=0;
led4=0;
led5=1;
led6=1;
led1=1;
led2=1;
stop();
}
}
if(i==0x08)//如果是0x08,则代表无线遥控器的按键C按下,执行显示
{
if(distance_data>=100)
{
turn_left(8);//左转
led5=0;
led6=1;
led3=1;
led4=1;
led1=1;
led2=1;
}
else
{
led3=0;
led4=0;
led5=1;
led6=1;
led1=1;
led2=1;
stop();
}
}
if(i==0x02)//如果是0x02,则代表无线遥控器的按键d按下,执行显示
{
motor_rev(8);//后退
led3=0;
led4=0;
led1=1;
led2=1;
led5=1;
led6=1;
}
}
while(K2==0)//模式2
{ceju();
led1=1;
led2=1;
led3=1;
led4=1;
led5=1;
led6=1;
tui_you(384);
stop();
delay1ms(50);
while(g2!
=0)//基础部分
{
motor_rev
(1);
}
stop();
led1=0;
led2=0;
delay1ms(500);
led1=1;
led2=1;
tui_you(384);
while(distance_data>=100)
{
motor_rev
(1);
ceju();
}
while(distance_data<100)
{
stop();
led1=0;
led2=0;
ceju();
}
while(K2==0);
}
while(K3==0)//模式3
{
uchari,j,k,z;
stop();
P1=0xff;//P1口设置为输入状态先全部写1
i=P1;
k=0;
i=i&0x0f;//和0x0f相与屏蔽高四位,读取无线遥控码
if(i==0x04)//如果是0x04,则代表无线遥控器的按键A按下,走圆圈
{
for(j=0;j<8;j++)//转1*n圈
{
for(z=0;z<8;z++)//一个周期转45度
{
P0=REV[z];//取数据
P2=CIRCLE[k];//取数据
delay1ms
(1);//调节转速
k++;
if(k>15)
k=0;
}
}
}
if(i==0x01)//如果是0x01,则代表无线遥控器的按键b按下,走梯形
{
motor_ffw(1024);
stop();
delay1ms(100);
turn_right(768);
motor_ffw(1024);
stop();
delay1ms(100);
turn_left(768);
}
if(i==0x08)//如果是0x08,则代表无线遥控器的按键C按下,走S形
{
if(t_flag==0)
{Syou(1