实验介绍
通过独立按键控制带风扇叶的直流电机的转速,并在静态数码管上显示风扇的挡数,其中独立按键对应的挡数和关闭键如下:
对应的位置为
关 1挡 2挡 3挡
4挡 5挡
硬件设计
静态数码管介绍
数码管是一种半导体发光器件,其基本单元是发光二极管。按发光二极管单元连接方式可分为共阳极数码管和共阴极数码管。这里我使用的是共阳数码管,共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极 COM 接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮, 当某一字段的阴极为高电平时, 相应字段就不亮。具体原理可自行百度,网上资料详细。
不同位数的数码管实物图如下所示:
共阳数码管码表
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92,
0 1 2 3 4 5
0x82, 0xF8, 0x80, 0x90, 0x88, 0x83,
6 7 8 9 A B
0xC6, 0xA1, 0x86, 0x8E, 0xFF,
C D E F 无显示
独立按键介绍
按键是一种电子开关,使用时轻轻按开关按钮就可使开关接通,当松开手时,开关断开。我开发板上使用的按键及内部简易图如下图所示:
由于机械点的弹性作用,按键开关在闭合时不会马上稳定的接通,在断开时也不会一下子断开,因而在闭合和断开的瞬间均伴随着一连串的抖动。抖动时间的长短由按键的机械特性决定的,一般为 5ms 到 10ms。为了确报CPU 对按键的一次闭合仅作一次处理,必须进行消抖。按键消抖有两种方式,一种是硬件消抖,另一种是软件消抖。为了使电路更加简单,通常采用软件消抖。
独立按键检测原理
我们知道单片机的 IO 口既可作为输出也可作为输入使用,当检测按键时用得是它的输入功能,独立按键的一端接地,另一端与单片机的某个 I/O 口相连,开始时先给该 IO 口赋一高电平,然后让单片机不断地检测该 I/O 口是否变为低电平,当按键闭合时,即相当于该 I/O 口通过按键与地相连,变成低电平,程序一旦检测到 I/O 口变为低电平则说明按键被按下,然后执行相应的指令。
直流电机介绍
直流电机是指能将直流电能转换成机械能(直流电动机)或将机械能转换成直流电能(直流发电机)的旋转电机。它是能实现直流电能和机械能互相转换的电机。当它作电动机运行时是直流电动机,将电能转换为机械能;作发电机运行时是直流发电机,将机械能转换为电能。
直流电机没有正负之分,在两端加上直流电就能工作。需要知道直流电机的额定电压和额定功率,不能使之长时间超负荷运作。 在交换接线后,可以形成正反转(风扇向前吹或向后吹)。
开发板配置的直流电机为 5V 直流电机,其主要参数如下:
轴长:8mm
轴径:2mm
电压:1-6v
参考电流:0.35-0.4A
3v 转速:17000-18000 转每分钟
外观实物图如下:
ULN2003 芯片介绍
51 单片机主要是用来控制而非驱动,如果直接使用芯片的GPIO 管脚去驱动大功率器件,要么将芯片烧坏,要么就是驱动不起来。所以要驱动大功率器件,比如电机。就必须搭建外部驱动电路,我使用的驱动芯片是ULN2003,该芯片是一个单片高电压、高电流的达林顿晶体管阵列集成电路。不仅可以用来驱动直流电机,还可用来驱动五线四相步进电机,比如 28BYJ-48 步进电机。
ULN2003芯片内部实际上就相当于非门电路,即输入高输出为低,输入低输出高。使用该芯片驱动直流电机,只可实现单方向控制,电机一端接电源正极,另一端接芯片的输出口。具体原理可自行百度,网上资料详细。
硬件实物连接
直流电机连接
将 P1.0 管脚连接到J46 的 IN1,直流电机的两根线接 J47 端子的 1、2 脚即 5V 和 O1,注意:直流电机无方向,线接反只是转动方向不同而已。
按键、数码管连接
使用一根8Pin排线将单片机的P0管脚与J8端子连接。注意:连接不能交叉,否则数据就会错位。
将 P3.1、P3.2、P3.3、P3.4、P3.5、P3.6管脚分别连接到JP1 的 K1、K2、K3、K4、K5、K6。
以上有的杜邦线我没有分开,连接用到的线就是文字说明里面用到的线。
软件设计
接下来就是在keil uVision4里面实现编代码了。代码中会有相关注释和说明:
main.c
#include "reg52.h"
typedef unsigned int u16;
typedef unsigned char u8;
sbit k1=P3^1;//定义所需的管脚
sbit k2=P3^2;
sbit k3=P3^3;
sbit k4=P3^4;
sbit k5=P3^5;
sbit k6=P3^6;
sbit moto=P1^0;
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
void delay(u16 i)
{
while(i--);
}
void keypros()//按键处理函数
{
if(k2==0)//检测按键是否按下
{
delay(1000);//消除抖动
if(k2==0)
{
P0=~smgduan[1]; //显示挡数
while(1)
{
moto=1;
delay(10);//用延时函数产生pwm波
moto=0;
delay(10);
if(k1==0 || k3==0 || k4==0 || k5==0 || k6==0)//其他按键按下跳出循环
break;
}
}
while(!k2);//检测按键是否松开
}
if(k1==0)//按键按下就关
{
delay(1000);
if(k1==0)
{
P0=~smgduan[0];
moto=0;
}
while(!k1);
}
//按键操作类似,下面有的就不加以注释说明了
if(k3==0)
{
delay(1000);
if(k3==0)
{
P0=~smgduan[2];
while(1)
{
moto=1;
delay(20);//加长延时来提升直流电机的转速
moto=0;
delay(20);
if(k1==0 || k2==0 || k4==0 || k5==0 || k6==0)
break;
}
}
while(!k3);
}
if(k4==0)
{
delay(1000);
if(k4==0)
{
P0=~smgduan[3];
while(1)
{
moto=1;
delay(30);
moto=0;
delay(30);
if(k1==0 || k2==0 || k3==0 || k5==0 || k6==0)
break;
}
}
while(!k4);
}
if(k5==0)
{
delay(1000);
if(k5==0)
{
P0=~smgduan[4];
while(1)
{
moto=1;
delay(40);
moto=0;
delay(40);
if(k1==0 || k2==0 || k4==0 || k3==0 || k6==0)
break;
}
}
while(!k5);
}
if(k6==0)//按下最大挡
{
delay(1000);
if(k6==0)
{
P0=~smgduan[5];
moto=1;//最大档就不需要延时函数了,直接运转
}
while(!k6);
}
}
void main()
{
moto=0;//初始化不转
P0=~smgduan[0]; //静态数码管初始化显示为0
while(1)
{
keypros();//调用按键处理函数
}
}
实验现象
51单片机直流电机控制风扇调速
可以明显地听到马达声音的变化,大风扇叶实验效果更棒。
实验总结
上述产生pwm波的方法有明显的缺点,就是占用了大量的机器周期,会影响pwm的准确度。正确的做法是用定时器产生pwm,使用定时器产生占空比可调,频率f为100HZ的pwm波。运用这个实验就可以完成风扇的制作以及可以扩展到智能小车等实验领域。
最后觉得博主不错的可以关注,点赞,评论等,后期可以更新用定时器产生pwm来控制风扇调速哟,坐等各位大佬指点!