单片机实现智能小车的方案报告.docx
《单片机实现智能小车的方案报告.docx》由会员分享,可在线阅读,更多相关《单片机实现智能小车的方案报告.docx(11页珍藏版)》请在冰豆网上搜索。
单片机实现智能小车的方案报告
简易智能小车的设计报告
小车智能控制系统任务书
1、任务
设计小车智能控制系统,设计实现小车的智能控制:
前进、后退、左转、右转等基本运动,以及以上运动的组合。
2、要求
2.1、基本要求:
(1)小车直线前进5m、直线后退5m、起点、终点误差不大于10cm;
(2)小车左转、右转运动;
(3)小车前进、后退、左转、右转等基本运动的组合;
2.2、发挥部分
(1)实现小车做半径为1米的圆周运动;
(2)300秒内完成
(1),误差不大于10秒。
摘要
本设计采用89c51单片机对步进电机进行控制,采用PWM脉宽调制方式实现对直流电机转速的控制,采用H型驱动电路控制电机转向。
并能以LED方式显示路程和时间。
通过IO口输出的具有时序的方波作为步进电机的控制信号,信号经过芯片L298N驱动步进电机实现智能小车的方向控制。
关键词:
步进电机直流电机单片机数码管
Abstract
Inthisdesign,ThecontrollerkernelofthiselectronicaldollyisbasedonMCU89c51.PWMcircuitisusedtocontroltherotationalspeedofelectronicengine;classHmotordrivecircuitisusedtocontroltherotationaldirectionofelectronicengine.
3系统设计总统框图
4模块方案比较与设计
4.1步进电机驱动电路选择与设计
方案1:
使用多个功率放大器件驱动电机
通过使用不同的放大电路和不同参数的器件,可以达到不同的放大的要求,放大后能够得到较大的功率。
但是由于使用的是三相的步进电机,就需要对三路信号分别进行放大,由于放大电路很难做到完全一致,当电机的功率较大时运行起来会不稳定,而且电路的制作也比较复杂。
方案2:
使用L298N芯片驱动步进电机
L298N芯片可以驱动两个二相电机(如图1-1),也可以驱动一个三相电机,输出电压最高可达50V,可以直接通过电源来调节输出电压;可以直接用单片机的IO口提供信号;而且电路简单,使用比较方便。
图
(1)
通过比较,使用L298N芯片充分发挥了它的功能,能稳定地驱动步进电机,且价格不高,故选用L298N驱动电机。
而使用L298N时,可以用L297来提供时序信号,可以节省单片机IO口的使用;也可以直接用单片机模拟出时序信号,由于控制并不复杂,故选用后者。
通过L298N构成步进电机的驱动电路,电路图如图3-2所示
4.2直流电机驱动电路的选择与设计
方案1.采用电阻网络分压法
或数字电位器调整电动机的分压,从而达到调速的目的,但电阻网络只能实现有级调速,而数字电阻的元件价格高,且可能存在干扰,更主要的问题是一般电动机的电阻比较小,但电流很大,分压不仅降低效率,而且实现困难。
方案2采用PWM驱动电路
直流电动机的驱动电路主要用来控制直流电动机的转动方向和转动速度。
改变直流电动机两端的电压可以控制电动机的转动方向。
在此可以采用由小功率三级管8050和8550组成的H型PWM电路。
在此我们采用方案2.
直流电动机PWM驱动电路如图所示,电路采用功率三级管8050和8550,以满足电动机启动瞬间的大电流要求。
当A输入为低电平,B输入为高电平时,晶体管放大器VT3,VT2导通,VT1,VT4截止。
VT3,VT2与电动机一起形成一个回路,驱动电动机正转。
当A输入为高电平,B输入为低电平时,晶体管VT3,VT2截止,VT1,VT4与直流电机形成回路,驱动电动机反转。
4个二级管起到保护晶体管的作用。
功率晶体管采用TP521光耦器驱动,将控制部分与电动机驱动部分隔离。
光耦器的电源为+5V,H型驱动电路中晶体管功率放大器VT3,VT1的发射极所加的电源为12V。
4.3路程计算模块的选择与设计
方案1:
采用霍尔集成片。
该器件内部有三片霍尔金属板组成,利用霍尔效应而产生电压,因此可以在车轮上安装磁片,而将霍尔元件固定在车架上,通过对脉冲的计数实现路程的测量。
方案2:
采用光电传感器
受鼠标工作原理的启发,采用断续式光电开关,由于开关是沟槽结构,可将其置于固定轴上,在车轮上安装多个遮光条,让其恰好通过沟槽,产生一个脉冲,对脉冲计数。
以上两种方案都是较可行的,但在本题中车轮较小,方案1安装困难,容易产生干扰,相反,方案2的精度高,故我们采用方案2。
当光敏二级管接收到光时,VT1和VT2导通,VT3不能导通,A点为高电平,此时MCU口收到的电平为高电平;当光敏二级管未接收到光源时,则VT1和VT2不导通,VT3导通,A点输出低电平。
,MCU口接收到方波计数。
4.4电机稳速的设计
高性能可变速度稳定器电路如图2所示。
它可用作宽范围速度可变的场合。
图中电机的电源是经过317K三端稳压器集成电路输出。
电机的电流经R5和RV2取样,把部份电压送到IC2和Q1组成的同相直流放大器。
Q1发射极电压正比于电机负载电流。
三端稳压器的输出电压等于本身的输出电压再加上Q1发射极上的电压。
因此,当电机负载增加时,电路输出电压将自动上升,增加电机的驱动能力,保持电机速度不变。
为了保持有负载与无负载时,电机的速度相同。
首先调节RVl使电机的转速为最大转速的三分之一。
然后调节RV2到额定转速。
5.系统的软件设计
智能小车的控制器采用ATMEL公司的AT89C51,因为在程序中不需要涉及精确的实时操作,所以使用C语言进行编写,这样可以大大提高效率。
5.1程序设计流程图
参考文献:
[1]谢自美《电子线路设计、实验、测试》[M]武汉:
华中理工大学出版社,2000.
附:
系统原程序
//定义头文件
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
//*******
#definedl50
ucharidataplus[7]={0x01,0x03,0x02,0x06,0x04,0x05,0x00};
ucharidataminu[7]={0x01,0x05,0x04,0x06,0x02,0x03,0x00};
Ucharcodetabe[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchark=0;
ucharidata*x;
uintdr;
sbitmotor1=P1^2;
sbitmotor2=P1^3;
sbitp1_7=P1^7;
//延时子程序
voiddelays(void)
{intj,k;
for(k=0;k<1000;k++)
for(j=0;j<1000;j++);
}
//步进电机控制
voidstp(cf,n)
{bitcf;
uintn;
uinti;
if(cf==0)x=&plus[0];
elsex=&minu[0];
TMOD=0x01;
TH0=(65536-dl*500)/256;
TL0=(65536-dl*500)%256;
TR0=1;
ET0=1;
EA=1;
for(i=0;i{while(k==0);
k=0;
}
}
voiddelay(void)interrupt1using1
{
P1=*x++;
if(*x==0)x=x-6;
TH0=(65536-dl*500)/256;
TL0=(65536-dl*500)%256;
k=1;
}
//直流电机控制
voiddc(void)
{uintz;
if(z==0){motor1=1;
motor2=0;}
else{motor1=0;
motor2=1;}
}
//计数子程序
voidcount(void)
{
{uchark=0;
IE0=1;
IT0=1;
EA=1;
EX0=1;
while(!
k);
k=0;
return;
}
timer0()interrupt0using0
{
count++;
}
}
//显示子程序
voiddelay(m);
voiddisplay(unchar*p)
{
uchari;
floatn;
uchardataBUFFER[4]={0,0,0,0};
unitj,k=0;
n=(1.9625)*(*p);
j=n;
BUFFER[0]=(j/1000);
BUFFER[1]=((j%1000)/100);
BUFFER[2]=((j%100)/10);
BUFFER[3]=(j%10);
SCON=0;
while
(1)
{
for(i=0;i<4;i++)
{
SBUF=tabe[BUFFER[k]];
k++;
while(!
TI);
TI=0;
if(k==4)k=0;
}
delay(100);
}
}
voiddelay(ucharm)
{
uchari;
for(i=m;i>0;i--)
{
TMOD=0x01;
TH0=0xd8;
TL0=0xf0;
TR0=1;
while(!
TF0);
TF0=0;
}
}
//停车子程序
voidstop(void)
{
asm{
MOV23H,#00H
CPLP3.6
CPLP3.7
LCALLDS50MS
LCALLDS50MS
SETBP1.0
}
}
//7ms延时
DS50MS:
LCALLDISP
LCALLDISP
LCALLDISP
//1ms延时
DL1MS:
MOVR6,#14H
DL1:
MOVR7,#19H
DL2:
DJNZR7,DL2
DJNZR6,DL1
RET
//系统主函数
main()
{if(count==0)dc(0);
elseif(count==5)dc
(1);
elseif(count==10)
{dc(0);
{if(dr==0)stp(0,10);
elsestp(1,10);}
}
display()
}