文末获取论文报告+原理图源文件+仿真源文件+程序代码+视频讲解等全套资料
由STC89C52单片机、LCD1602液晶显示屏、霍尔测速传感器、3V直流电机、按键模块构成。
具体功能:
1、采用霍尔传感器非接触式测电机转速。
2、LCD1602液晶显示当前的转速(单位为转/分(RPM))和当前的PWM占空比0~100%。
3、电机转速可以通过按键调整,也可以开始暂停,正转和反转。
4、按键可实现加速、减速、正转、反转、开始/暂停等功能。
1键:加速键,可以短按,占空比加1,也可长按,占空比连续加;
2键:减速键,可以短按,占空比减1,也可长按,占空比连续减;
3键:正转切换键,按下后电机正转;
4键:反转切换键,按下后电机反转;
5键:开始暂停键,按一下开始,再按一下暂停。
1 引言
(篇幅有限,详见文末获取)
2 系统硬件电路的设计
2.1 系统总体设计框图及单片机系统的设计
本系统采用STC89C51控制输出数据,由单片机IO口产生PWM信号,送到直流电机,直流电机通过测速电路将实时转速送回单片机,进行转速显示,从而实现对电机速度和转向的控制,达到直流电机调速的目的。
2.2 STC89C51单片机简介
2.2.1 STC89C51单片机的组成
STC89C51单片机由CPU和8个部件组成,它们都通过片内单一总线连接,其基本结构依然是通用CPU加上外围芯片的结构模式,但在功能单元的控制上采用了特殊功能寄存器的集中控制方法。其基本组成如下图所示:
(完整详见文末获取)
3 PWM信号发生电路设计
3.1 PWM的基本原理
调速采用PWM(Pulse Width Modulation)脉宽调制,工作原理:通过产生矩形波,改变占空比,以达到调整脉宽的目的。PWM的定义:脉宽调制(PWM)是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。模拟信号的值可以连续变化,其时间和幅度的分辨率都没有限制。
3.2 系统的硬件电路设计与分析
电动机PWM驱动模块的电路采用H桥驱动,设计与实现具体电路见下图。本电路采用的是基于PWM原理的驱动电路。
PWM电路由复合体管组成,两个输入端高低电平控制晶体管是否导通或截止。NPN的三极管高电平输入时导通,PNP的三极管低电平输入时导通,当Q1和Q2都导通时,Q3和Q6截止,Q4和Q5导通,电机两端都是GND,电机是不转的,当Q1和Q2都截止时,Q3和Q6导通,Q4和Q5截止,电机两端都是VCC,电机也是不转的,那么,当Q1导通,Q2截止时,Q4和Q6导通,电机右边是电源,左边是地,电机逆时针转动,此时保持Q2截止,PWM控制Q1的导通截止,就可以控制电机的速度,同理,当Q1截止,Q2导通时,Q3和Q5导通,电机的左边是电源,右边是地,电机顺时针转动,此时保持Q1截止,PWM控制Q2的导通截止就可以控制电机的转速。4个二极管在电路中的作用是防止晶体管产生不当反向电压,以及电机两端电流和晶体管上的电流过大保护。
3.3 H桥的驱动电路设计方案
H桥式电动机驱动电路包括4个三极管和一个电机,因为它的形状与字母H相似,故因此而得名。如下图 所示,要使电动机成功运转,须对对角线上的一对三极管通电。据不同的三极管对的导通通电的情况,电流会从右至左或相反方向流过电机,从而改变电机的转动方向。
因此要想使电动机运转,必须使对角线上两个三极管通电。例如,当Q2管与Q3管导通时,电流 从电源正极经Q2从左到右通过电机,再经 Q3到电源的负极。同样Q1与Q4亦是如此,由电流箭头可看,驱动电动机将顺时针转动。
5 主电路设计
5.1 单片机最小系统
5.2 液晶电路
液晶部分的电路图如下图所示:
5.4 霍尔元件电路
用于测量的A44E集成霍尔开关,磁钢用直径D=6.004mm,长度为L=3.032mm的钕铁硼磁钢。电源用直流,霍尔开关输出由四位半直流数字电压表测量,磁感应强度B用95A型集成霍尔元件测量。
(完整详见文末获取)
部分程序
/*
功能:基于51单片机的霍尔直流电机PWM调速设计
*/
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
void displaym();
sbit en=P2^5; //1602 6管脚
sbit rs=P2^7; //1602 4管脚
sbit rw=P2^6;//lcd1602控制端口 5管脚
sbit num1=P1^0; //占空比加1
sbit num2=P1^1; //占空比减1
sbit num3=P1^2; //正转
sbit num4=P1^3; //反转
sbit num5=P1^4; //开始/停止切换
sbit out=P3^4; //PWM输出正转
sbit out1=P3^7; //PWM输出反转
uint zhuansu,flag,z1,z2,m,flag_1,zheng,fan,kai;
void delay(uint z)//延时1ms
{
uint x,y;
for(x=0;x<z;x++)
for(y=0;y<110;y++);
}
void write_com(uchar com)//1602控制指令
{
rs=0;
P0=com;
delay(5);
en=0;
delay(10);
en=1;
}
void write_data(uchar date)//1602数据指令
{
rs=1;
P0=date;
delay(5);
en=0;
delay(5);
en=1;
}
void init()//初始化
{
en=0;
rw=0;
write_com(0x01); //lcd初始化
write_com(0x38); //5X7显示
write_com(0x0c); //关闭光标
TMOD=0x01; //定时器方式1
TH0=0xdc;
TL0=0x00; //定时器初值
EA=1; //开中断
ET0=1; //定时器0开中断
TR0=1;
EX1=1;
IT1=1; //定时器启动
TH1=0xfc;
TL1=0x66;//定时100us
ET1=1; //定时器1开中断
TR1=1;
write_com(0x80);
write_data('V');
write_data(':');
write_com(0x87); //第一行显示转数
write_data('r');
write_data('p');
write_data('m');
write_com(0xc0);
write_data('z');
write_data('h');
write_data('a');
write_data('n');
write_data('k');
write_data('o');
write_data('n');
write_data('g');
write_data('b');
write_data('i'); //第二行显示占空比:
write_data(':');
displaym();
}
void keyscan() //键盘扫描函数
{
if(num1==0)
{
delay(5); //消除抖动
if(num1==0)
{
if(m<=199)
m++;
displaym(); //占空比加一
}
}
if(num2==0)
{
delay(5);
if(num2==0)
{
if(m>=1)
m--;
displaym(); //占空比技跻?
}
}
if(num3==0)
{
delay(5);
if(num3==0)
{
zheng=1; //开始正转
fan=0; // 反转停止
}
}
if(num4==0)
{
delay(5);
if(num4==0)
{
zheng=0; //正转停止
fan=1; // 反转开始
}
}
if(num5==0)
{
delay(5);
if(num5==0)
{
while(num5==0) ;
kai=1-kai;
}
}
}