智能小车分析方案智能小车分析方案

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

电子设计大赛设计报告
题目名称_____智能搬运小车__
学生学院___物理与光电工程学院 _
队员庄伟林林鉴杰陈奕利
2009年 5月 1日
智能搬运小车设计报告
一、 总体框架
<1)、本搬动小车通过单片机AT89S52,用三个373分时输入外部信号,通过分析处理,再用一个573芯片输出步进电机驱动信号,成功地实现了取放黑铁,寻找右光源和左光源的功能。

<2)、电路方框图。

<3)系统总框图。

系统总框图
主控芯片
AT89S52
LM2003
四相六线步进电机
二、硬件实现及单元电路设计。

1、主控芯片AT89S52。

AT89S52 主要性能;
与MCS-51单片机产品兼容、8K字节在系统可编程Flash存储器、 1000次擦写周期、全静态操作:0Hz~33Hz 、三级加密程序存储器、 32个可编程I/O口线、三个16位定时器/计数器八个中断源、全双工UART串行通道、低功耗空闲和掉电模式、掉电后中断可唤醒、看门狗定时器、双数据指针、掉电标识符。

功能特性描述
At89s52 是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。

使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。

片上Flash 允许程序存储器在系统可编程,亦适于常规编程器。

在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。

AT89S52具有以下标准功能: 8k字节Flash,256字节RAM, 32 位I/O 口线,看门狗定时器,2 个数据指针,三个16 位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。

另外,AT89S52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。

空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。

掉电保护方式下,RAM内容被保存,振荡器
被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。

8 位微控制器 8K 字节在系统可编程 Flash AT89S52。

2、直流电机驱动取放铁片。

考虑到电磁铁耗电很大,所以我们选择用直流电机机械方式实现铁片的取放。

通过L298芯片驱动,用直流电机实现磁铁的磁铁上升<放下铁块)或下降<吸上铁片)。

我们考虑了几种方案实现直流电机的驱动;
L298电路图如下。

L298电路图
直流电机驱动电路图
放铁片原理图
取铁片原理图
3、探测黑白铁片与边界。

以下为我们考虑的方案;
我们使用PRP光电对管实现对黑白铁以及边界的探测。

光电对管实物图
信号处理实物图
PRP光电一体化对管原理图
R2
1M
光电对管检测电路图
4、步进电机与驱动。

方案选择;由于本系统为智能电动车,其驱动轮的驱动电机
的选择就显得十分重要。

由于小车要实现对路径的准确定位和精确
测量,我们综合考虑了一下两种方案:
方案1;采用步进电机作为该系统的驱动电机。

由于其转过
的角度可以精确地定位,可以实现小车前进路程和位置的精确确定位。

方案2:采用直流减速电机。

直流减速电机转动力矩大,体
积小,重量轻,装配方便,但是不能做到很好的定位。

权衡利弊,我们选择了第一方案。

小车驱动部份我们选择用二相六线步进电机。

因为步进电机
可以很好地实现同步与精确控制功能,但是缺点是耗电大,震动大。

但权衡利弊,与直流电机相双,步进电机驱动力强大,所以我们选
择用步进电机。

步进电机作为执行元件,是机电一体化的关键产品之一, 广
泛应用在各种自动化控制系统中。

随着微电子和计算机技术的发展,步进电机的需求量与日俱增,在各个国民经济领域都有应用。

步进电机是一种将电脉冲转化为角位移的执行机构。

当步进
驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动
一个固定的角度(称为“步距角”>,它的旋转是以固定的角度一步
一步运行的。

可以通过控制脉冲个数来控制角位移量,从而达到准
确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度
和加速度,从而达到调速的目的。

步进电机可以作为一种控制用的
特种电机,利用其没有积累误差(精度为100%>的特点,广泛应用于
各种开环控制。

现在比较常用的步进电机包括反应式步进电机<vr)、永磁
式步进电机<pm)、混合式步进电机<hb)和单相式步进电机等。

永磁式步进电机一般为两相,转矩和体积较小,步进角一般
为7.5度或15度;
反应式步进电机一般为三相,可实现大转矩输出,步进角一
般为1.5度,但噪声和振动都很大。

反应式步进电机的转子磁路由
软磁材料制成,定子上有多相励磁绕组,利用磁导的变化产生转矩。

混合式步进电机是指混合了永磁式和反应式的优点。

它又分
为两相和五相:两相步进角一般为1.8度而五相步进角一般为 0.72度。

这种步进电机的应用最为广泛,也是本次细分驱动方案所选用
的步进电机。

我们的步进电机使用的驱动芯片是lm2003。

步进电机驱动芯片LM2003实物图
LM2003芯片原理图
步进电机实物图
LM2003
步进电机驱动相图
二相六线步进电机接线图
5、寻找光源。

当光敏二极管正对光源时,电阻变小,经过电压比较器向单片机输入信号。

6、电路板。

我们通过Protel dxp绘制电路图后,采用热转印方法制成PCB
双面板。

主电路板实物图<正面)
主电路板实物图<反面)
主电路板pcb图主电路板各部分原理图如下:
6智能小车程序框图。

寻找左光源,返回A停车Array
区。

7、智能小车源程序。

#include<at89x52.h>
unsigned int minute=0。

second=0,sum=0。

unsigned char idata minute1=0,second1=0。

sum1=0。

unsigned char idata
recordminute1=0,recordsecond1=0,recordsum1=0。

unsigned char idata
recordminute2=0,recordsecond2=0,recordsum2=0。

unsigned char bdata status=0。

unsigned char bdata status1=0。

unsigned char bdata status2=0。

unsigned char bdata prpflagd。

unsigned char bdata prpflage。

unsigned int idata time0=0。

unsigned long int idata time2=0。

unsigned long int idata time2_1。

unsigned int idata time2_2。

unsigned char data motor=0。

unsigned char bdata d=0。

unsigned char bdata e=0。

unsigned char bdata d1=0。

unsigned char bdata e1=0。

unsigned char lightcount=0。

unsigned char v0。

unsigned char vb。

sbit prp5_0=d1^6。

sbit prp5_1=d1^7。

sbit prp1_0=d1^4。

sbit prp1_1=d1^5。

sbit prp6_0=d1^2。

sbit prp6_1=d1^3。

sbit prp2_0=d1^0。

sbit prp2_1=d1^1。

sbit prp7_0=e1^6。

sbit prp3_0=e1^4。

sbit prp3_1=e1^5。

sbit prp8_0=e1^2。

sbit prp8_1=e1^3。

sbit prp4_0=e1^0。

sbit prp4_1=e1^1。

sbit prp5_000=prpflagd^6。

sbit prp5_001=prpflagd^7。

sbit prp1_000=prpflagd^4。

sbit prp1_001=prpflagd^5。

sbit prp6_000=prpflagd^2。

sbit prp6_001=prpflagd^3。

sbit prp2_000=prpflagd^0。

sbit prp2_001=prpflagd^1。

sbit prp7_000=prpflage^6。

sbit prp7_001=prpflage^7。

sbit prp3_000=prpflage^4。

sbit prp3_001=prpflage^5。

sbit prp8_000=prpflage^2。

sbit prp8_001=prpflage^3。

sbit prp4_000=prpflage^0。

sbit prp4_001=prpflage^1。

sbit prp5_00=d^6。

sbit prp5_01=d^7。

sbit prp1_00=d^4。

sbit prp1_01=d^5。

sbit prp6_00=d^2。

sbit prp6_01=d^3。

sbit prp2_00=d^0。

sbit prp2_01=d^1。

sbit prp7_00=e^6。

sbit prp7_01=e^7。

sbit prp3_00=e^4。

sbit prp3_01=e^5。

sbit prp8_01=e^3。

sbit prp4_00=e^0。

sbit prp4_01=e^1。

sbit forward=status^0。

sbit backward=status^1。

sbit turnleft=status^3。

sbit turnright=status^2。

sbit rightforward=status^5。

sbit rightbackward=status^4。

sbit leftforward=status^6。

sbit leftbackward=status^7。

sbit flag=status1^5。

sbit whiteiron=status1^6。

sbit blackiron=status2^0。

sbit searchiron=status1^0。

sbit searchrightlight=status1^1。

sbit seachleftlight=status1^2。

unsigned char interfere。

unsigned char uninterfere。

sbit rightorleft=status1^4。

sbit unflag=status2^3。

sbit foundblack=status2^4。

sbit foundwhite=status2^5。

sbit foundboundary=status2^6。

unsigned char whiteironcount=0。

unsigned char blackironcount=0。

unsigned char ironcount=0。

void timer0initializtion(>。

void timer2initializtion(>。

void turnright90degree(>。

void turnleft90degree(>。

void putdown(>。

void goforwardaccelerat(>。

void gobackwardaccelerat(>。

void putup(>。

void foundblackiron(>。

void foundwhiteiron(>。

void turnright180degree(>。

void backwardalign(>。

void forwardalign(>。

void estimate(>。

void boundaryturnright90degree(>。

void boundaryturnright180degree(>。

void boundaryturnleft180degree(>。

void searchlightblackiron(>。

void oneturnleft80degree(>。

void oneturnright80degree(>。

void oneturnright180degree(>。

void oneturnleft80degree(>。

void searchlightwhiteiron(>。

void searchlightwhiteiron(>。

void scan(>。

void main(>
{
timer0initializtion(>。

timer2initializtion(>。

time2=0。

while(time2<=50>。

rightorleft=0。

status=0。

goforwardaccelerat(>。

flag=0。

while(flag==0>。

estimate(>。

if(foundboundary==1>
{
boundaryturnright90degree(>。

scan(>。

estimate(>。

if(foundwhite==1>
{
putdown(>。

searchlightwhiteiron(>。

}
else
{
putdown(>。

searchlightblackiron(>。

}
scan(>。

estimate(>。

if(foundwhite==1>
{
putdown(>。

searchlightwhiteiron(>。

}
else
{
putdown(>。

searchlightblackiron(>。

}
scan(>。

estimate(>。

if(foundwhite==1>
{
putdown(>。

searchlightwhiteiron(>。

}
else
{
putdown(>。

searchlightblackiron(>。

}
scan(>。

estimate(>。

if(foundwhite==1>
{
putdown(>。

searchlightwhiteiron(>。

}
else
{
putdown(>。

searchlightblackiron(>。

}
goto end0200。

}
else
{
if(foundblack==1>
{
putdown(>。

searchlightblackiron(>。

scan(>。

estimate(>。

if(foundwhite==1>
{
putdown(>。

searchlightwhiteiron(>。

}
else
{
putdown(>。

searchlightblackiron(>。

}
scan(>。

estimate(>。

if(foundwhite==1>
{
putdown(>。

searchlightwhiteiron(>。

}
else
{
putdown(>。

searchlightblackiron(>。

}
scan(>。

estimate(>。

if(foundwhite==1>
{
putdown(>。

searchlightwhiteiron(>。

}
else
{
putdown(>。

searchlightblackiron(>。

}
goto end0200。

}
else
{
if(foundwhite==1>
{
putdown(>。

searchlightwhiteiron(>。

scan(>。

estimate(>。

if(foundwhite==1>
{
putdown(>。

searchlightwhiteiron(>。

}
else
{
putdown(>。

searchlightblackiron(>。

}
scan(>。

estimate(>。

if(foundwhite==1>
{
putdown(>。

searchlightwhiteiron(>。

}
else
{
putdown(>。

searchlightblackiron(>。

}
scan(>。

estimate(>。

if(foundwhite==1>
{
putdown(>。

searchlightwhiteiron(>。

}
else
{
putdown(>。

searchlightblackiron(>。

}
}
}
}
end0200:while(1>。

}
void goforwardaccelerat(> {
status=0。

forward=1。

vb=5。

time2=0。

while(time2<=8>。

vb=4。

time2=0。

while(time2<=8>。

vb=3。

time2=0。

while(time2<=8>。

vb=2。

time2=0。

while(time2<=8>。

vb=1。

}
void gobackwardaccelerat(> {
status=0。

backward=1。

vb=5。

time2=0。

while(time2<=8>。

vb=4。

time2=0。

while(time2<=8>。

vb=3。

time2=0。

while(time2<=8>。

vb=2。

time2=0。

while(time2<=8>。

vb=1。

}
void scan(>
{
status=0。

while((foundblack!=1>&&(foundwhite!=1>> {
goforwardaccelerat(>。

flag=0。

while(flag==0>。

status=0。

estimate(>。

if(foundboundary==1>
{
foundboundary=0。

if(rightorleft==1>
{
rightorleft=0。

boundaryturnleft180degree(>。

time2=0。

while(time2<=8>。

status=0。

}
else
{
rightorleft=1。

boundaryturnright180degree(>。

time2=0。

while(time2<=8>。

status=0。

}
}
}
}
void searchlightblackiron(>
{
unsigned long int lightdalign。

rightorleft=0。

vb=4。

turnright=1。

while(prp8_01==1>。

status=0。

time2=0。

while(time2<=20>。

turnright=1。

time2=0。

while(time2<=30>。

time2=0。

while(prp8_01==1>。

status=0。

if(time2<=180>
goto b0173。

status=0。

turnright=1。

time2=0。

while(time2<=20>。

while(prp8_01==1>。

time2=0。

while(time2<=10>。

status=0。

time2=0。

while(time2<=20>。

b0173:
time2_1=0。

goforwardaccelerat(>。

time2=0。

while(time2<=40>。

flag=0。

while(flag==0>。

time2=0。

while(time2<=40>。

status=0。

putup(>。

time2=0。

while(time2<=8>。

turnright180degree(>。

goforwardaccelerat(>。

time2=0。

while(time2<=90>。

b0294:
status=0。

forward=1。

flag=0。

while(flag==0>。

estimate(>。

if(foundboundary==0> goto b0294。

status=0。

time2=0。

while(time2<=8>。

gobackwardaccelerat(>。

forwardalign(>。

status=0。

相关文档
最新文档