智能小车分析方案智能小车分析方案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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。