大学论文单片机课程设计论文蓝牙控制小车WORD档P17Word文件下载.docx
《大学论文单片机课程设计论文蓝牙控制小车WORD档P17Word文件下载.docx》由会员分享,可在线阅读,更多相关《大学论文单片机课程设计论文蓝牙控制小车WORD档P17Word文件下载.docx(15页珍藏版)》请在冰点文库上搜索。
方案一:
使用直流电机,加上适当减速比的减速器。
直流电机具有良好的调速性能,控制起来也比较简单。
直流电机只要通上直流电源就可连续不断的转动,调节电压的大小就可以改变电机的速度。
直流电机的驱动电路实际上就是一个功率放大器。
常用的驱动方式是PWM方式,即脉冲宽度调制方式。
此方法性能较好,电路和控制都比较简单。
方案二:
使用步进电机。
步进电机具有良好的控制性能。
当给步进电机输入一个电脉冲信号时,步进电机的输出轴就转动一个角度,因此可以实现精确的位置控制。
与直流电机不同,要使步进电机连续的转动,需要连续不断的输入点脉冲信号,转速的大小由外加的脉冲频率决定。
去而且其转动不受电压波动和负载变化的影响,也不受温度、气压等环境因素的影响,仅与控制脉冲有关。
但步进电机的驱动相对较复杂,要由控制器和功率放大器组成。
具体差别见下表2-4。
表2-4电机控制方式对比
直流电机
步进电机
调速性能
较好
较差
位置控制精度
好
驱动
简单
复杂
稳定性
好,仅与控制脉冲有关
由上表可以看出步进电机和直流电机都有各自的优点。
步进电机能进行精确的位置控制,但驱动电路麻烦,鉴于本设计中小车的位置控制不要求十分精确,直流电机即可满足小车要求的精度。
且直流电机易于控制,驱动电路十分简单。
驱动电路
小车使用的是直流电机。
从单片机输出的信号功率很弱,即使在没有其它外在负载时也无法带动电机,所以在实际电路中我们加入了电机驱动芯片提高输入电机信号的功率,从而能够根据需要控制电机转动。
直流电机常用的PWM,及脉宽调制方式驱动。
本设计中电机驱动采用L298集成H桥芯片。
L298中有两套H桥电路,刚好可以控制两个电机。
它的使能端可以外接高低电平,也可以利用单片机进行软件控制,极大地满足各种复杂电路需要。
另外,L298的驱动功率较大,在6~46V的电压下,可以提供2A的额定电流,并且具有过热自动关断和电流反馈检测功能,安全可靠;
为了保证L298正常工作,我们另外安装了续流二极管。
电路如图3-4所示。
能根据输入电压的大小输出不同的电压和功率,解决了负载能力不够这个问题。
利用单片机调整出PWM脉冲和高低电平对直流电机进行驱动和控制。
图3-4电机驱动电路
L298集成H桥芯片。
其外形、管脚分布如图3-5所示。
图3-5L298管脚分布图
3.5PWM调速原理
脉冲宽度调制(PulseWidthModulation),简称PWM。
脉冲周期不变,只改变晶闸管的导通时间,即通过改变脉冲宽度来进行直流调速。
PWM的理论基础是:
冲量相等而形状不同的的窄脉冲加在具有惯性的环节上,其效果基本相同。
采用PWM进行电机的调速控制,实际是保持加在电机电机电枢上的脉冲电压频率不变,调节其脉冲宽度。
电机是一个惯性环节,它的电枢电流饿转速均不能突变,很高的频率的PWM加在电机上,效果相当于施加一个恒定电压的直流电。
如图3-6所示。
这个电压可以由脉冲的宽度调节。
图3-6PWM等效图示意图
使用PWM方式可以很容易的实现调速。
PWM信号由单片机软件产生,使用非常方便。
由于电路总体上并不复杂,驱动电路的控制输入端也可以不用经光耦合隔离,直接与单片机引脚相连。
前进时,驱动两个直流电机都正转,后退时,则两电机都反转。
左转时前进时,左电机不转而右电机正转,右转前进时,则右电机不转而左电机正转。
进入减速区时,由单片机控制进行PWM变频调速,通过软件改变脉冲调宽波形的占空比,实现调速。
所有这些都是通过软件编程实现控制。
3.6供电系统:
电机电压为7.2V,单片机及蓝牙模块供电电压为5V,通过稳压芯片将7.2V电压转换为5V电压给单片机和蓝牙供电。
3.7蓝牙串口通信系统:
将蓝牙模块的主机与电脑相连,从机与单片机2的串口相连。
传输电脑的控制命令。
3.8总体电路图:
4.程序设计:
4.1设计流程图:
4.2单片机2串口通信程序:
#include<
at89x51.h>
#defineleftP3_2
#definerightP3_3
#definegoP3_4
#definebackP3_5
#defineleftdata0x11;
左转控制命令
#definerightdata0x22;
右转控制命令
#definegodata0x33;
前进控制命令
#definebackdata0x44;
后退控制命令
unsignedchara,b,flag;
voiddelay1ms(unsignedintx)
{
unsignedinti,j;
for(j=x;
j>
0;
j--)
for(i=75;
i>
i--);
}
main()
TMOD=0x20;
//定时器工作在方式2
TH1=0xfd;
TL1=0xfd;
//9600波特率
TR1=1;
//开定时器计数
SM0=0;
SM1=1;
//串行工作方式1
REN=1;
//允许接收数据
EA=1;
//开中断总开关
ES=1;
//允许串行中断
while
(1)
if(flag==1)
{
flag=0;
if(b!
=a)
left=1;
right=1;
go=1;
back=1;
}
switch(b)
caseleftdata:
left=0;
break;
caserightdata:
right=0;
casegodata:
go=0;
casebackdata:
back=0;
a=b;
delay1ms(30);
else
voidserial()interrupt4//中断法
flag=1;
b=SBUF;
RI=0;
//中断标志
4.3单片机1电机控制程序:
#defineucharunsignedchar
#defineuintunsignedint
voidmotor_r_z(void);
//右边电动机正转
voidmotor_l_z(void);
//左边电动机正转
voidmotor_r_f(void);
//右边电动机反转
voidmotor_l_f(void);
//左边电动机反转
voidback(uchar,uchar);
//小车后退
voidgo(uchar,uchar);
//小车前进
voidstop(void);
//小车停止
voidleft(void);
//小车左转
voidright(void);
//小车右转
sbitPWM1=P2^5;
sbitPWM2=P2^4;
sbitPWM3=P2^1;
sbitPWM4=P2^2;
sbitEN1=P2^0;
sbitEN2=P2^3;
sbitleft_k=P0^2;
sbitback_k=P0^5;
sbitgo_k=P0^4;
sbitright_k=P0^3;
sbitsound=P2^7;
uchardatat_0;
//每产生一次T0定时器中断的时候t_0加1
uchardatamotor_r;
//motor_r用于存放右边电机转速和转向的数据
uchardatamotor_l;
//motor_l用于存放左边电机转速和转向的数据
uchardataValue;
uchardatamid;
/*******初始化函数***********/
voidini(void)
////T0初始化///
TMOD=0x01;
//T0工作在方式1
TH0=0xff;
//装入T0初值
TL0=0xf6;
TR0=1;
//开T0中断
ET0=1;
//T0允许中断
//////////////////////
t_0=0;
/////////////////////
P2=0;
sound=1;
voidgo(ucharleft_motor,ucharright_motor)//直行
Value=right_motor;
motor_r_z();
Value=left_motor;
motor_l_z();
voidback(ucharleft_motor,ucharright_motor)//后退
motor_r_f();
motor_l_f();
voidleft(void)//左转
Value=0x45;
voidright(void)//右转
voidmotor_r_z(void)//右边电动机正转
ACC=0x64+Value;
motor_r=ACC;
EN1=1;
voidmotor_l_z(void)//左边电动机正转
ACC=0x64-Value;
motor_l=ACC;
EN2=1;
voidmotor_r_f(void)//右边电动机反转
voidmotor_l_f(void)//左边电动机反转
voidstop(void)
EN2=0;
EN1=0;
/*********T0中断服务程序*****************/
/*********PWM产生***********************/
voidtime0(void)interrupt1using2
TR0=0;
++t_0;
ACC=t_0;
CY=0;
ACC-=motor_r;
if(CY==1)
PWM1=1;
PWM2=0;
gotoPWM_2;
PWM1=0;
PWM2=1;
PWM_2:
ACC-=motor_l;
PWM3=1;
PWM4=0;
gotoHIGHT;
PWM3=0;
PWM4=1;
HIGHT:
if(ACC!
=0xc9)
gotoEXIT;
ACC=0;
t_0=ACC;
EXIT:
}
voidmain(void)
ini();
aa:
while(left_k)//当左按键按下时,left_k等于1.
gotobb;
P1=0xff;
P1=P0;
left();
//向左转
while(!
left_k);
//如果left_k一直为一,小车便一直左转
stop();
////判断右键是否按下////
bb:
while(right_k)
gotodd;
right();
right_k);
////判断向前键是否按下////
dd:
while(go_k)
gotoee;
go(0x64,0x64);
go_k);
////判断后退键是否按下////
ee:
while(back_k)
gotoaa;
P1=0xff;
back(0x64,0x64);
back_k);
5.调试:
完成电路设计与焊接后进行调试,给单片机上点并接上蓝牙串口模块,打开串口调试助手,选择相应串口,将波特率设定为9600bps,数据位8位,停止位1,检验位0,然后将键盘按键绑定,即:
当按下A时,发送十六进制数据11H,为左转命令;
当按下D时,发送十六进制数据22H,为右转命令;
当按下W时,发送十六进制数据33H,为前进命令;
当按下S时,发送十六进制数据44H,为后退命令。
6.结论:
经过多次软件调试,可实现设计的基本要求,即:
可通过电脑按键控制小车的运动。