单片机控制直流电机正反转
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录
第1章总体设计方案 (1)
1.1 总体设计方案 (1)
1.2 软硬件功能分析 (1)
第2章硬件电路设计 (2)
2.1 单片机最小系统电路设计 (2)
2.2直流电机驱动电路设计 (2)
2.3 数码管显示电路设计 (4)
2.4 独立按键电路设计 (5)
2.5 系统供电电源电路设计 (5)
2.5.1直流稳压电路中整流二极管的选取: (6)
2.5.2直流稳压电路中滤波电容的选取: (6)
第3章系统软件设计 (7)
3.1 软件总体设计思路 (7)
3.2 主程序流程设计 (7)
附录1 总体电路图 (10)
附录2 实物照片 (11)
附录3 C语言源程序 .......................................
12
实习报告
第1章总体设计方案
1.1 总体设计方案
早期直流传动的控制系统采用模拟分离器件构成,由于模拟器件有其固有的缺点,如存在温漂、零漂电压,构成系统的器件较多,使得模拟直流传动系统的控制精度及可靠性较低。
随着计算机控制技术的发展,微处理器已经广泛使用于直流传动系统,实现了全数字化控制。
由于微处理器以数字信号工作,控制手段灵活方便,抗干扰能力强。
所以,全数字直流调速控制精度、可靠性和稳定性比模拟直流调速系统大大提高。
所以,本次实习采用了驱动芯片来驱动直流电机,并运用单片机编程控制加以实现。
系统设计采用驱动芯片来控制的,所以控制精度和可靠性有了大幅度的提高,并且驱动芯片具有集成度高、功能完善的特点,从而极的大简化了硬件电路的设计。
图1.1 直流电机定时正反转方案
1.2 软硬件功能分析
本次实习直流电机控制系统以STC89C52单片机为控制核心,由按键输入模块、LED显示模块及电机驱动模块组成。
采用带中断的独立式键盘作为命令的输入,单片机在程序控制下,定时不断给L293D直流电机驱动芯片发送PWM波形,H 型驱动电路完成电机正,反转控制;同时单片机不停的将变化的定时时间送到LED数码管完成实时显示。
第页 1
实习报告第2章硬件电路设计
单片机最小系统电路设计2.1
单片机最小系统设计是单片机应用系统设计的基础。
STC89C52单片机最小系统2.1电路如图所示。
单片机最小系统图2.1
直流电机驱动电路设计2.2
图2.2 直流电机驱动电路
提供L293D的;36 V至4.5 V,电压是从1 A是提供双向驱动电流高达L293D 的。
两个设备是专为驱动等感至4.5 V36 V毫安,电压是从双向驱动电流高达600高电压提供电性负载继电器,电磁阀,直流双极步进和马达,也可以给其他高电流/
第页 2
实习报告
源负载。
兼容所有的TTL输入。
每个输出都是推拉式驱动电路,与达林顿三极管和伪达林源。
启用1,2 EN驱动器和3,4 EN驱动器。
当使能输入为高电平时,相关联的驱动器被启用和他们的输出处于活动状态,并在其输入端的同相。
当使能输入为低,这些驱动器被禁用其输出关闭,在高阻抗状态。
【PS:1,2EN为1和2的使能端(高电平使能);3,4EN同理】用适当的数据输入端,每对驱动程序的形式一个完整的H桥可逆驱动器适用于电磁阀或电机应用。
L293D外部输出为高速钳位二极管,应使用电感的瞬态抑制。
VCC1和VCC2分开,提供逻辑输入,以尽量减少设备功耗。
L293D的工作温度是从0°C至70°C
外部引脚排列图L293D2.3 图
在热关断模式下,输出的是高阻态,而不管输入电平。
页第 3
实习报告
图2.4 逻辑图
电机驱动电路组要是由L293D芯片组成,单片机P3.4,P3.6,P3.7输出的信号经过L293D芯片后直接与直流电机相连,从而控制直流电机的运行。
其中VCC1接+5V电源,VCC2接+12V电源。
2.3 数码管显示电路设计
本设计利用数码管作为显示单元,采用动态显示技术,电路如图2.5所示。
图2.5 显示电路
电路的接法决定了必须采用逐位扫描显示方式。
即从段选口送出某位LED的字型码,然后选通该位LED,并保持一段延时时间。
然后选通下一位,直到所有位扫描完。
第页 4
实习报告
2.4 独立按键电路设计
独立式键盘的按键相互独立,每个按键接一根I/O口线,一根I/O口线上的按键
工作状态不会影响其它I/O口线的工作状态。
因此,通过检测I/O口线的电平状态,即可判断键盘上哪个键被按下。
独立按键电路图2.6
系统供电电源电路设计2.5
电源,所采用的电源电路是由整流电路和三端+12V+5V电源和本系统需要采用稳压器组成的。
电路输出电压和最大输出电流决定于所选三端稳压器。
其电源电路所示。
如图2.7
+12V电源供电电路2.7 +5V和图
页第 5
实习报告
直流稳压电路中整流二极管的选取:2.5.1
1)2?1(????t)sin Utd(2U20(AV)?π0U为副边其中电压2解得
220.9U?U2?U)2?2(20(AV)πU的实现了全波整流电路,他将由于整流桥电
路2负半周也利用起来,所以在变压器副边电压有效值相同的情况下,输出电压的平均值是半波整流电路的两倍。
输出电流的平均值(即负载电阻中的电流平
均值)0.9UUo2(AV)?Io?(AV))32?(RR LL在单相桥
式整流电路中,因为每只二极管只在变压器副边电压的半个周期通过电流,所以每只二极管的平均电流只有负载电阻上的电流的平均值的一半,即
0.45UUo2(AV))(2?4?Io?(AV)RR LL与半波整流电路中的平均电流相同。
二极管所能承受的最大反向电压)52?(22UU?max R
%10?的余考虑到电网电压的波动范围为_x0010_,在实际选用二极管时,应至少有U和最高反向工作电压分别为量,选择最大整流电流I RMF2(A V)11.IoI.1U1 ??F2)?6(2?R2L)(2?7U21U.1 2RM? 2.5.2直流稳压电路中滤波电容的选取:U U O(AV)?R:输出电压的平均值)VO(A L
I L(AV)I负载:电流的平均值L(AV)T
T5)~C?(3?。
.12U时,当C?(3~5)U?2O(A V)2R R2L L%?10点解电容的耐压值应,由于采用电解电容,考虑到电网电压的波动范围为U121.。
大于2
第页 6
实习报告第3章系统软件设计
3.1 软件总体设计思路
经过前几章的设计工作,系统的硬件电路设计已经完成了。
然而,对于一个完整的设计系统来说,只有硬件电路的设计完成是不够的,它必须通过软件编程来实现系统工作的控制功能,从而才能实现电路应有的系统功能。
单片机系统的软件设计主要使用汇编语言或高级语言。
汇编语言与系统硬件的关系密切,可方便地实现诸如中断管理以及模拟/数字量的输入/输出等功能,具有
占用系统资源小、执行速度快的特点,但是,对复杂的大型应用系统,其代码可读性差,并不利于升级和维护。
高级语言的代码效率和长度都不如汇编语言,但其结构清晰、可读性好、开发周期短、有极强的可移植性,在多数应用方面执行效率与汇编语言的差距也不大,近年来得到了极为广泛的应用。
而C语言既有高级语言的各种特点,又可对硬件进行操作,并可进行结构化程序设计。
用C
语言编写的程序较容易移植,可生成简洁、可靠的目标代码,用C语言进行单片机计算机开发已经是必然的发展趋势。
本设计的整体思路为:主程序中循环的调用按键程序,通过按键从而使单片机输出变化的定时时间和控制电机正反转,从而控制直流电机达到不同的旋转效果,并通过数码管将变化的定时时间显示出来。
本设计以单片机作为系统的核心控制单元,运用C语言进行编程工作,按照工作流程来实现设计要求的控制直流电机的运行状态。
3.2 主程序流程设计
直接应用STC89C52的软件方法实现电机驱动和定时时间的设置与变化。
其流程图如图3.1所示。
开始时打开电源开关对电路供电,完成系统初始化和显示初始化,数码管显示0059,倒计时开始,按键循环扫描,设置键按下,倒计时停止,由加减键控制定时时间,确定键按下,进入中断,倒计时开始,电机启动,结束时,电机停止,显示恢复初始化。
第页7
实习报告
开始系统初始化显示初始化调用按键子中断处理程序定时中断10定时中断为是否有键按下无有、电机正反转系统定时键处理子程发送数据至中断返处理器
3.1 系统主单片机总程序框图图
第页8
实习报告实习总结
第页9
实习报告
附录1 总体电路图
第页10
实习报告附录2 实物照片
第页11
实习报告
附录3 C语言源程序
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit MOTOR_A2 = P3^6;
sbit MOTOR_A1 = P3^7;
sbit EN_MOTOR_A = P3^4 ;
//uchar code segcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uchar code segcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//0,1,2,3,4,5,6,7,8,9,
//uchar code dispbit[]={0x0e,0x0d,0x0b,0x07};
uchar code dispbit[]={0xef,0xdf,0xbf,0x7f};
//数码管位选位
uchar buffer[]={0,0,0,0};
uint min=59,sec=59;
uint status=0;
//函数声明
void delayMS(uint t) ;
void keyprocess(uchar key);
void display();
void timer0();
void MotorStart();
void delayS(uint b);
main()
{
bit keyrelease;
uchar buf;
uchar keyinput;
keyrelease=1;
buf=0xff;
TMOD=0x01; //T0工作在方式1,16位计数器
TH0=0xFC; //定时器0设置延时1ms中断初始值
TL0=0x18;
第页12
实习报告TR0=1;
IE=0x82; //开定时器0中断
status=0;
while(1) //键扫描程序
{
keyinput=P1&0x0f;
if(keyinput!=0x0f)
{
delayMS(10);
if(keyinput!=0x0f)
{
buf=keyinput;
P1=0xff;
while(P1!=0xff)
P1=0xff;
调用按键处理函数keyprocess(buf); //
buf=0xff;
}
}
display();
}
}
//延时程序
void delayMS(uint t) //晶振频率12MHZ
{
uint i;
while(t--)
for(i=0;i<125;i++);
}
//按键处理函数
void keyprocess(unsigned char key) //键值处理,正常计时,设置时分秒{
switch (key)
{
第页13
实习报告case 0x0e:
status++; //按下设置键
TR0=0;
if (status>=3) status = 0;
break;
case 0x0d:
1 1 switch(status) //按下加键,3种模式下加{
case 0x01:
if(min<59) min++;
else min=0;
break;
case 0x02:
if(sec<59) sec++;
else sec=0;
break;
}
break;
case 0x0b:
1// switch(status) 按下减键
{
min--; case 0x01:if(min>0)
else min=59;
break;
sec--; case 0x02:if(sec>0)
else sec=59;
break;
}
break;
case 0x07: TR0=1;MotorStart();
default:break;
}
}
第页14
实习报告//数码管显示函数
void display()
{
uchar i; //正常计时显示
{
buffer[0]=min/10; // 显示分的十位
buffer[1]=min_x0010_; // 显示分的个位
buffer[2]=sec/10; // 显示秒的十位
buffer[3]=sec_x0010_; // 显示秒的个位
for(i=0;i<4;i++)
{
P0=segcode[buffer[i]];
P2=dispbit[i];
delayMS(1); //防止数码管显示的时候闪动
P2=0xff;
}
}
}
//定时器0中断函数
void timer0() interrupt 1 using 2 中断服务函数,第二组工作寄存器//T0 {
static uint count;
// 定时器0设置初始值1ms中断初始值TH0=0xFC;
TL0=0x18;
TR0=1;
//正常计时count++;
到,以下为时钟的正常走钟逻辑定时1S if(count>=1000) //
{
count=0;
sec--;
if(sec==0)
{
页第15
实习报告sec=59;
min--;
if(min==0&&sec==0)
{
P2=0xff;
}
}
}
}
void MotorStart()
{
EN_MOTOR_A = 1;
MOTOR_A2 = 1;
MOTOR_A1 = 0;
delayS(60);
EN_MOTOR_A = 0;
delayS(60);
EN_MOTOR_A = 1;
MOTOR_A2 = 0;
MOTOR_A1 = 1;
delayS(60);
}
12MHZ //晶振频率void delayS(uint b)
{
uint j;
while(b--)
for(j=0;j<2000;j++);
}
第页16。