电子设计竞赛往返变速小车实验报告.docx
《电子设计竞赛往返变速小车实验报告.docx》由会员分享,可在线阅读,更多相关《电子设计竞赛往返变速小车实验报告.docx(13页珍藏版)》请在冰豆网上搜索。
电子设计竞赛往返变速小车实验报告
重庆邮电大学电子设计竞赛培训
智能小车设计报告
作者:
徐国英(2013211997)
曾鹏(2013212009)
生物信息学院
日期2015年4月5日
一方案论证与选择
1总体框图
选定自动往返小车的题目后,我们决定购买一台符合尺寸要求的玩具遥控小车,通过去掉其遥控部分,并直接利用上面的直流电机的方法实现要求。
根据设计任务要求,经过论证选择,最终确定的系统设计框图如下:
系统分为单片机控制模块、外部传感器模块、电机驱动模块、电源模块、显示模块。
2各模块方案选择
2.1控制模块
控制模块负责接收传感器的信息,并处理接收到的信息。
由于我们才接触到电子设计,所以选择了相对容易学会并且普遍应用的单片机作为主控制器。
在考虑到本系统无需复杂的逻辑功能,我们选择了**单片机。
2.2电源模块
采用电池作为电源直接输入直流后,用多个稳压器稳压得到理想的不同幅值直流电源。
这种方法获取电源方便,且电源输出电流能力大。
2.3外部传感器模块
方案1:
该方案用光敏电阻组成光敏探测器检测黑线,用霍耳传感器进行测速。
首先,光敏电阻的阻值可以跟随周围环境光线的变化而变化。
当光线照射到白线上面时,光线发射强烈,光线照射到黑线上面时,光线发射较弱。
因此光敏电阻在白线和黑线上方时,阻值会发生明显的变化,只要将阻值的变化值经过比较器就可以输出高低电平。
其次,使用利用霍耳效应的传感器。
当载流导体或半导体出于与电流相垂直的磁场中时,在其两端将产生电位差的这一现象称为霍尔效应。
如果在车轮的内侧装上一条细磁铁,把霍耳传感器同样装在车轮的内侧,测量霍尔传感器的输出就可以知道车轮转过的圈数。
方案2
使用光电对管进行检测黑线和测速,这是一种一体化反射型光电探测器,其发射器是一个砷化镓红外发光二极管,而接收器是一个高灵敏度,硅平面光电三极管。
该当经过黑线时接收器输出高电平。
测速时,在车轮的内侧贴上一个光电码盘,用光电对管对码盘进行检测。
光电对管照射到黑色和白色的边界时输出信号会有跳变,将跳变的输出信号送给单片机进行检测就可以得到轮子的转速。
经过论证比较,由于光电对管内置可见光过滤器能减小离散光的影响,同时光电对管调理电路简单,工作性能稳定。
因此,外部传感器模块选用方案二
2.4电机驱动模块
二系统硬件设计与实现
1各模块硬件设计
黑线检测,最小系统
电机驱动
1.1程序
#include
sbitsign=P0^0;
sbitresult=P0^1;
sbitbase1=P3^0;
sbitbase2=P3^1;
bitIndex=0;
unsignedcharT0RH=0;
unsignedcharT0RL=0;
unsignedcharRxdByte=0;
unsignedcharRxdBuff=0;
unsignedchartmr=0;
signedcharBlackLine=0;//初始的时候黑线会自动加1归零
signedcharLine;
unsignedchartimer1=0;
unsignedcharflag=0;
voidConfigms(unsignedcharms);
voidTime1Config();
voiddelay10ms(unsignedintc);
voidseekline();
voidmain()
{
EA=1;
result=1;
RxdByte=0x00;
sign=0;
base1=base2=1;
Configms
(1);
Time1Config();
while
(1)
{
while
(1)
{
if(BlackLine<=5)
{
while
(1)
{
if(timer1<=90)
{
base1=1;
base2=0;
}
else
{
base1=1;
base2=1;
}
if(Index)
{Index=0;
break;}
}
break;
}
elseif(BlackLine>=6)
{
while
(1)
{
if(timer1<=90)
{
base1=0;
base2=1;
}
else
{
base1=1;
base2=1;
}
if(Index)
{Index=0;
break;}
}
break;
}
}
if(BlackLine%3==0)
{
switch(BlackLine)
{
case3:
while
(1)
{
if(timer1<=70)
{
base1=1;
base2=0;
}
else
{
base1=1;
base2=1;
}
if(Index)
{Index=0;
break;}
}
break;
case6:
EA=0;
base1=base2=1;
delay10ms(1100);
EA=1;
while
(1)
{
if(timer1<=90)
{
base1=0;
base2=1;
}
else
{
base1=1;
base2=1;
}
if(Index)
{Index=0;
break;}
}
break;
case9:
while
(1)
{
if(timer1<=70)
{
base1=0;
base2=1;
}
else
{
base1=1;
base2=1;
}
if(Index)
{Index=0;
break;}
}
break;
case12:
base1=base2=1;
while
(1);
break;
default:
break;
}
}
}
}
voidseekline()
{
RxdBuff=RxdByte;
RxdByte<<=1;
RxdByte|=result;
if(RxdByte!
=RxdBuff)
{
if(RxdByte==0xFF)
{
flag=1;
}
elseif(RxdByte==0x00)
{
flag+=1;
};
if(flag==2)
{
BlackLine++;
Index=1;
flag=0;
}
}
}
voidConfigms(unsignedcharms)
{
unsignedlongtmp;
tmp=11059200/12;
tmp=(tmp*ms)/1000;
tmp=65536-tmp;
tmp=tmp+18;
T0RH=(unsignedchar)(tmp>>8);
T0RL=(unsignedchar)tmp;
TMOD&=0xF0;
TMOD|=0x01;
TH0=T0RH;
TL0=T0RL;
ET0=1;
TR0=1;
}
voidTime1Config()
{
TMOD&=0x0F;
TMOD|=0x10;
TH1=0xFE;
TL1=0x0C;
ET1=1;
TR1=1;
}
voiddelay10ms(unsignedintc)//10ms延时器
{
unsignedchara,b;
for(;c>0;c--)
{
for(b=38;b>0;b--)
{
for(a=130;a>0;a--);
}
}
}
voidInterruptTimer0()interrupt1
{
TH0=T0RH;
TL0=T0RL;
seekline();
}
voidTime1(void)interrupt3
{TH1=0xFE;
TL1=0x0C;
timer1++;
if(timer1>100)
timer1=0;
}
三:
心得体会
很开心