单片机控制直流电机正反转文档格式.docx

上传人:b****5 文档编号:16885939 上传时间:2022-11-26 格式:DOCX 页数:18 大小:539.09KB
下载 相关 举报
单片机控制直流电机正反转文档格式.docx_第1页
第1页 / 共18页
单片机控制直流电机正反转文档格式.docx_第2页
第2页 / 共18页
单片机控制直流电机正反转文档格式.docx_第3页
第3页 / 共18页
单片机控制直流电机正反转文档格式.docx_第4页
第4页 / 共18页
单片机控制直流电机正反转文档格式.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

单片机控制直流电机正反转文档格式.docx

《单片机控制直流电机正反转文档格式.docx》由会员分享,可在线阅读,更多相关《单片机控制直流电机正反转文档格式.docx(18页珍藏版)》请在冰豆网上搜索。

单片机控制直流电机正反转文档格式.docx

1.2软硬件功能分析

本次实习直流电机控制系统以STC89C52单片机为控制核心,由按键输入模块、LED显示模块及电机驱动模块组成。

采用带中断的独立式键盘作为命令的输入,单片机在程序控制下,定时不断给L293D直流电机驱动芯片发送PWM波形,H型驱动电路完成电机正,反转控制;

同时单片机不停的将变化的定时时间送到LED数码管完成实时显示。

第2章硬件电路设计

2.1单片机最小系统电路设计

单片机最小系统设计是单片机应用系统设计的基础。

STC89C52单片机最小系统电路如图2.1所示。

图2.1单片机最小系统

2.2直流电机驱动电路设计

图2.2直流电机驱动电路

L293D是提供双向驱动电流高达1A,电压是从4.5V至36V的;

L293D提供双向驱动电流高达600毫安,电压是从4.5V至36V的。

两个设备是专为驱动等感性负载继电器,电磁阀,直流双极步进和马达,也可以给其他高电流/高电压提供电源负载。

兼容所有的TTL输入。

每个输出都是推拉式驱动电路,与达林顿三极管和伪达林源。

启用1,2EN驱动器和3,4EN驱动器。

当使能输入为高电平时,相关联的驱动器被启用和他们的输出处于活动状态,并在其输入端的同相。

当使能输入为低,这些驱动器被禁用其输出关闭,在高阻抗状态。

【PS:

1,2EN为1和2的使能端(高电平使能);

3,4EN同理】用适当的数据输入端,每对驱动程序的形式一个完整的H桥可逆驱动器适用于电磁阀或电机应用。

L293D外部输出为高速钳位二极管,应使用电感的瞬态抑制。

VCC1和VCC2分开,提供逻辑输入,以尽量减少设备功耗。

L293D的工作温度是从0°

C至70°

C

图2.3L293D外部引脚排列图

表2.1真值表

输入

输出

Y

A

EN

H

L

X

Z

在热关断模式下,输出的是高阻态,而不管输入电平。

图2.4逻辑图

电机驱动电路组要是由L293D芯片组成,单片机P3.4,P3.6,P3.7输出的信号经过L293D芯片后直接与直流电机相连,从而控制直流电机的运行。

其中VCC1接+5V电源,VCC2接+12V电源。

2.3数码管显示电路设计

本设计利用数码管作为显示单元,采用动态显示技术,电路如图2.5所示。

图2.5显示电路

电路的接法决定了必须采用逐位扫描显示方式。

即从段选口送出某位LED的字型码,然后选通该位LED,并保持一段延时时间。

然后选通下一位,直到所有位扫描完。

2.4独立按键电路设计

独立式键盘的按键相互独立,每个按键接一根I/O口线,一根I/O口线上的按键工作状态不会影响其它I/O口线的工作状态。

因此,通过检测I/O口线的电平状态,即可判断键盘上哪个键被按下。

图2.6独立按键电路

2.5系统供电电源电路设计

本系统需要采用+5V电源和+12V电源,所采用的电源电路是由整流电路和三端稳压器组成的。

电路输出电压和最大输出电流决定于所选三端稳压器。

其电源电路如图2.7所示。

图2.7+5V和+12V电源供电电路

其中

为副边电压

解得

由于整流桥电路实现了全波整流电路,他将

的负半周也利用起来,所以在变压器副边电压有效值相同的情况下,输出电压的平均值是半波整流电路的两倍。

输出电流的平均值(即负载电阻中的电流平均值)

在单相桥式整流电路中,因为每只二极管只在变压器副边电压的半个周期通过电流,所以每只二极管的平均电流只有负载电阻上的电流的平均值的一半,即

与半波整流电路中的平均电流相同。

二极管所能承受的最大反向电压

考虑到电网电压的波动范围为

,在实际选用二极管时,应至少有%10的余量,选择最大整流电流

和最高反向工作电压

分别为

输出电压的平均值

负载电流的平均值

由于采用电解电容,考虑到电网电压的波动范围为

,点解电容的耐压值应大于

第3章系统软件设计

3.1软件总体设计思路

经过前几章的设计工作,系统的硬件电路设计已经完成了。

然而,对于一个完整的设计系统来说,只有硬件电路的设计完成是不够的,它必须通过软件编程来实现系统工作的控制功能,从而才能实现电路应有的系统功能。

单片机系统的软件设计主要使用汇编语言或高级语言。

汇编语言与系统硬件的关系密切,可方便地实现诸如中断管理以及模拟/数字量的输入/输出等功能,具有占用系统资源小、执行速度快的特点,但是,对复杂的大型应用系统,其代码可读性差,并不利于升级和维护。

高级语言的代码效率和长度都不如汇编语言,但其结构清晰、可读性好、开发周期短、有极强的可移植性,在多数应用方面执行效率与汇编语言的差距也不大,近年来得到了极为广泛的应用。

而C语言既有高级语言的各种特点,又可对硬件进行操作,并可进行结构化程序设计。

用C语言编写的程序较容易移植,可生成简洁、可靠的目标代码,用C语言进行单片机计算机开发已经是必然的发展趋势。

本设计的整体思路为:

主程序中循环的调用按键程序,通过按键从而使单片机输出变化的定时时间和控制电机正反转,从而控制直流电机达到不同的旋转效果,并通过数码管将变化的定时时间显示出来。

本设计以单片机作为系统的核心控制单元,运用C语言进行编程工作,按照工作流程来实现设计要求的控制直流电机的运行状态。

3.2主程序流程设计

直接应用STC89C52的软件方法实现电机驱动和定时时间的设置与变化。

其流程图如图3.1所示。

开始时打开电源开关对电路供电,完成系统初始化和显示初始化,数码管显示0059,倒计时开始,按键循环扫描,设置键按下,倒计时停止,由加减键控制定时时间,确定键按下,进入中断,倒计时开始,电机启动,结束时,电机停止,显示恢复初始化。

图3.1系统主单片机总程序框图

实习总结

(包括:

实习质量分析、待完善和改进之处和心得体会)

设计中单片机STC89C52在工作时,调整定时器TO来达到合适的定时时间。

通过调整L293D电机驱动芯片的A1A2引脚的电平高低切换,实现电机的正反转。

重复使用T0口定时功能,实现正常的走钟逻辑做倒计时用。

由于设计中使用的是单片机作为核心的控制元件,附以外围电路使本本设计具有功能强、性能可靠、电路简单、成本低的特点,加上经过优化的程序,使其有很高的智能化水平。

但是在我们设计和调试的过程中,也发现了一些问题,譬如程序设计水平有限,实际的电机正反转和倒计时同步很难确切控制,延时与定时冲突无法正常执行,其设计难度远超出我们的设计需求范围。

在做实习设计的初期阶段,难度很大,没有头绪。

通过求助于老师、理清了思路。

同时,在图书馆里、网上查阅资料,攻克了设计中的道道难题。

通过本次单片机应用实习,我学到了许多东西,知道光靠书本上的东西是不够的,需额外去查资料。

无论是在硬件还是软件设计上,我都遇到了不少的问题,在克服困难的过程中,我学到了许多,特别是在课堂上学不到的东西如(PWM)。

也锻炼了我的AltiumDesigner画图能力,以前学的时候元器件都是给定的只要到库里面找出名字就可以,只要连线就可以,而这次是根据自己的设计需要去画,感觉不同。

本次设计我能独立完成,算是有了很大的收获。

总的感受有以下几方面:

1、通过本次单片机应用实习,我不但对单片机有了更为深入的了解,对一个课题如何画流程图,编程序等有了一定的认识。

2、进一步加强了我的动手能力和运用专业知识的能力,从中学习到如何去思考和解决问题,以及如何灵活地改变方法去实现设计方案。

特别是深刻体会到了软件和硬件结合的重要性,以及两者的联系和配合作用。

3、让我了解到单片机技术对当今人们生活的重要性。

同时这次单片机应用实习的经历也使我受益匪浅,让我知道做任何事情都应脚踏实地,刻苦努力地去做,只有这样,才能做好。

附录1总体电路图

附录2实物照片

附录3C语言源程序

#include<

reg52.h>

#defineuintunsignedint

#defineucharunsignedchar

sbitMOTOR_A2=P3^6;

sbitMOTOR_A1=P3^7;

sbitEN_MOTOR_A=P3^4;

//ucharcodesegcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

ucharcodesegcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

//0,1,2,3,4,5,6,7,8,9,

//ucharcodedispbit[]={0x0e,0x0d,0x0b,0x07};

ucharcodedispbit[]={0xef,0xdf,0xbf,0x7f};

//数码管位选位

ucharbuffer[]={0,0,0,0};

uintmin=59,sec=59;

uintstatus=0;

//函数声明

voiddelayMS(uintt);

voidkeyprocess(ucharkey);

voiddisplay();

voidtimer0();

voidMotorStart();

voiddelayS(uintb);

main()

{

bitkeyrelease;

ucharbuf;

ucharkeyinput;

keyrelease=1;

buf=0xff;

TMOD=0x01;

//T0工作在方式1,16位计数器

TH0=0xFC;

//定时器0设置延时1ms中断初始值

TL0=0x18;

TR0=1;

IE=0x82;

//开定时器0中断

status=0;

while

(1)//键扫描程序

{

keyinput=P1&

0x0f;

if(keyinput!

=0x0f)

{

delayMS(10);

if(keyinput!

{

buf=keyinput;

P1=0xff;

while(P1!

=0xff)

keyprocess(buf);

//调用按键处理函数

buf=0xff;

}

}

display();

}

}

//延时程序

voiddelayMS(uintt)//晶振频率12MHZ

uinti;

while(t--)

for(i=0;

i<

125;

i++);

//按键处理函数

voidkeyprocess(unsignedcharkey)//键值处理,正常计时,设置时分秒

switch(key)

case0x0e:

status++;

//按下设置键

TR0=0;

if(status>

=3)status=0;

break;

case0x0d:

switch(status)//按下加1键,3种模式下加1

case0x01:

if(min<

59)min++;

elsemin=0;

break;

case0x02:

if(sec<

59)sec++;

elsesec=0;

case0x0b:

switch(status)//按下减1键

if(min>

0)min--;

elsemin=59;

case0x02:

if(sec>

0)sec--;

elsesec=59;

}

case0x07:

MotorStart();

default:

break;

//数码管显示函数

voiddisplay()

uchari;

//正常计时显示

buffer[0]=min/10;

//显示分的十位

buffer[1]=min%10;

//显示分的个位

buffer[2]=sec/10;

//显示秒的十位

buffer[3]=sec%10;

//显示秒的个位

4;

i++)

P0=segcode[buffer[i]];

P2=dispbit[i];

delayMS

(1);

//防止数码管显示的时候闪动

P2=0xff;

//定时器0中断函数

voidtimer0()interrupt1using2//T0中断服务函数,第二组工作寄存器

staticuintcount;

//定时器0设置初始值1ms中断初始值

count++;

//正常计时

if(count>

=1000)//定时1S到,以下为时钟的正常走钟逻辑

count=0;

sec--;

if(sec==0)

sec=59;

min--;

if(min==0&

&

sec==0)

P2=0xff;

voidMotorStart()

EN_MOTOR_A=1;

MOTOR_A2=1;

MOTOR_A1=0;

delayS(60);

EN_MOTOR_A=0;

MOTOR_A2=0;

MOTOR_A1=1;

voiddelayS(uintb)//晶振频率12MHZ

uintj;

while(b--)

for(j=0;

j<

2000;

j++);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1