写在前面:在51单片机应用中,电机控制的应用十分多;本节我们学习使用通过PWM控制直流电机的使用;在实现直流电机之前,我们先软件模拟实现呼吸灯的实现,再去实现直流电机的使用;

本节实现的内容:

1、LED1进行呼吸灯方式点亮;

2、直流电机的控制(调速);

目录

 一、直流电机介绍

 二、ULN2003芯片介绍

三、PWM介绍

四、硬件设计 

五、软件设计

1、LED1进行呼吸灯方式点亮

2、直流电机的控制


 一、直流电机介绍

        直流电机是指能将直流电能转换成机械能(直流电动机)或将机械能转换成直流电能(直流发电机)的旋转电机。它是能实现直流电能和机械能互相转换的电机。

        直流电机的结构是有定子和转子组成。直流电机运动时,不动的部分称为定子,定子的主要作用是产生磁场,由机座、主磁极、 换向极、 端盖、 轴承和电刷装置等组成。运行时转动的部分称为转子,其主要作用是产生电磁转 矩和感应电动势,是直流电机进行能量转换的枢纽,所以通常又称为电枢,由转轴、电枢铁心、电枢绕组、换向器和风扇等组成。

        直流电机没有正负之分,在两端加上直流电就能工作。交换电极可以改变电机旋转的方向;

        电机的实物图为:

 二、ULN2003芯片介绍

         51单片机作为一个开发板,起到的主要作用是控制,而直流电机作为一个较大功率的器件,当然不能通过51单片机的IO引脚进行驱动,需要使用一些驱动电路或者芯片进行驱动;开发板上板载的驱动芯片是 ULN2003, 该芯片是一个单片高电压、高电流的达林顿晶体管阵列集成电路。不仅可以用来驱动直流电机,还可用来驱动五线四相步进电机。

        ULN2003 是一个单片高电压、高电流的达林顿晶体管阵列集成电路。它是由 7 对 NPN 达林顿管组成的,它的高电压输出特性和阴极二极管可以转换感应负载。单个达林顿对的集电极电流是 500mA。达林顿管并联可以承受更大的电流。

        其内部相当于非门电路,即输入高输出为低,输入为低输出是高。

        若使用该芯片驱动直流电机,只可实现单方向控制,电机一端接电源正极, 另一端接芯片的输出口

三、PWM介绍

        PWM(脉冲宽度调制),在具有惯性的系统中,可以通过对一系列脉冲进行调制来等效的获得所需要的模拟参量,常应用于电机控速,开关电源等领域。

        简单来说,PWM是一组脉冲(连续的高低),那如何通过这组脉冲来控制电机的速度呢?这就得说说电机是一个惯性系统,何为惯性系统?即在通电的时候电机就会转,断开电后,电机不会立马停下来。那这样的话,在一个很短的时间的内(一个周期)通过控制电机转的时间与电机不转的时间的比率,就可以控制电机的速度了。 

        在PWM波形中有几个重要的参数,分别是:频率、占空比以及精度;

频率:是指一个PWM波形周期的倒数;一个周期即为高低电平的总和;

占空比:即高电平占据整个周期的比值,占空比越大,高电平时间越长,其转速越高;

精度:即占空比变化的步距,占空比变化的步距越小,速度改变的每次就越小,其精度就越高;

产生PWM波形的方法:

        通过计数器计数的功能,使其同比较值进行比比较,大于比较值输出1,小于比较值输出0;即可产生PWM波形;调节计数器的计数范围可以改变PWM的周期频率(一般不变);调节比较值大小可以调节PWM的占空比(用于调节转速);精度是指:比较值的变化步距,每次最少调节多少;

四、硬件设计 

 本次所涉及的硬件主要包括:

1、步进电机驱动模块;

2、直流电机;

步进电机的驱动模块电路图如下所示:

        从上图可知,ULN2003D 的输入口与单片机的 P1.0-P1.3 连接,对应输出则是 OUT1-OUT4,而 J47 则是提供给外部连接电机的接口,可以支持直流电机、五线四相步进电机 28BYJ-48 连接。本实验使用的是直流电机,电机的一根线连接在 VCC 上,另一根连接在 OUT1 上,因此可通过单片机 P1.0 口输出高电平来控制电机旋转,输出低电源控制电机停止. 输入高输出为低,输入为低输出是高。

五、软件设计

1、LED1进行呼吸灯方式点亮

实验要求:LED1进行呼吸灯的方式点亮;

实验思路:led并不属于惯性系统,可以通过点亮和点灭的时间(模拟PWM波形)来控制亮灭,而亮灭周期较短,人眼就能实现呼吸灯模式;

源码:

#include <REGX52.H>//包含51头文件
sbit LED=P2^0;//设置对应的端口
unsigned char time,j;//定义需要的变量
//延时函数
void Delay10us(unsigned char t)		//@11.0592MHz
{
	while(t--)
	{
		unsigned char i;
	i = 2;
	while (--i);
	}
	
}

void main()
{

		while(1)
	{	
			for(time=0;time<100;time++)//由暗到亮
		{
			for(j=0;j<20;j++)//每种状态停留一会
			{
				LED=0;
			Delay10us(time);
				LED=1;
			Delay10us(100-time);
			}
		}
						
			for(time=100;time>0;time--)//由亮到暗
		{
			for(j=0;j<20;j++)//每种状态停留一会
			{
				LED=0;
			Delay10us(time);
				LED=1;
			Delay10us(100-time);
					}
			}
					}
}

实验现象:

呼吸灯

2、直流电机的控制

实验要求:通过单片机控制直流电机的转速,并且速度可调;

实验思路:通过单片机的定时器/计数产生计数,设置比较值,计数值同比较值进行比较产生PWM波形,通过按键控制计数值的大小,从而改变电机的旋转速度;

实验源码:

main.c文件

#include <REGX52.H>
#include "shumaguan.h"
#include "key.h"
sbit DIANJI=P1^0;
unsigned char key,count,speed,compare;

void time0_init()//定时计数器初始化
{
TMOD=0X01;
TR0=1;
TL0 = 0xAE;	//设置定时计数器初值
TH0 = 0xFB;
ET0=1;
EA=1;
}

void main()//主函数
{
 SHUZI(1,1);//数码管显示档位
 time0_init();
	compare=10;//设置比较值初值
	while(1)
	{
		key=key_scan();	//调用按键函数
		if(key==1)//通过按键改变比较值
		{
				count++;
				count%=4;
				if(count==0){compare=0;}
				if(count==1){compare=50;}
				if(count==2){compare=75;}
				if(count==3){compare=100;}
				SHUZI(1,count+1);
			}
		}
	
	}

	void time0() interrupt 1//进行中断
{
  
    TL0 = 0xAE;	//设置定时计数器初值
    TH0 = 0xFB ;
	speed++;//定时计数器的计数值
	speed%=100;
	if(speed<compare)//计数值与比较值进行比较
	{DIANJI=1;}
		else
	{	DIANJI=0;}
	}

key.c文件

#include <REGX52.H>
#include <intrins.h>
//定义端口
sbit  K1=P3^1;
sbit  K2=P3^0;
sbit  K3=P3^2;
sbit  K4=P3^3;

/**
   *@breaf 延时函数@11.0592MHz,延时单位ms
   *@param t延时时间
   *@retval 无
   */
void Delay1m(unsigned char t)		//@11.0592MHz
{
	unsigned char i, j;
while(t--)
	{
	_nop_();
	i = 2;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
}
}

/**
   *@breaf 按键按下函数
   *@param无
   *@retval key按键按下后,返回对应按键的数值
   */
unsigned char key_scan()
{
	unsigned char key =0;
	if(K1==0)
	   {
								Delay1m(20)	;
									while(K1==0);
								Delay1m(20)	;
										key=1;
		}
		 
	if(K2==0)
			{
								Delay1m(20)	;
									while(K2==0);
								Delay1m(20)	;
										key=2;
			}
if(K3==0)
			{
								Delay1m(20)	;
									while(K3==0);
								Delay1m(20)	;
										key=3;
			}
	if(K4==0)
			{
							Delay1m(20)	;
								while(K4==0);
							Delay1m(20)	;
									key=4;
				}
		return key;
}

shumaguan.c文件

#include <REGX52.H>

unsigned char i;

void SHUZI(unsigned int x,y)
	{
		 switch(x)
		 {
		case 1:	P2_4=1;	P2_3=1;	P2_2=1;break;
		case 2:	P2_4=1;	P2_3=1;	P2_2=0;break;
		case 3:	P2_4=1;	P2_3=0;	P2_2=1;break;
		case 4:	P2_4=1;	P2_3=0;	P2_2=0;break;
		case 5:	P2_4=0;	P2_3=1;	P2_2=1;break;
		case 6:	P2_4=0;	P2_3=1;	P2_2=0;break;
		case 7:	P2_4=0;	P2_3=0;	P2_2=1;break;
		case 8:	P2_4=0;	P2_3=0;	P2_2=0;break; 
		 }
		switch(y)
		{
		case 1:	P0=0x06; break;
		case 2:	P0=0x5b; break;
		case 3:	P0=0x4f; break;
		case 4:	P0=0x66; break;
		case 5:	P0=0x6d; break;
		case 6:	P0=0x7d; break;
		case 7:	P0=0x07; break;
		case 8:	P0=0x7f; break;
		}
			i = 20;
	while (--i);
		
		}

 

实验现象:

PWM直流电机调节转速

 百度网盘(源码文件):

链接:https://pan.baidu.com/s/1pd_4vqp50MwLw86iaPET6w 
提取码:1022

总结:本节我们学习了直流电机的使用,其中重点是PWM波形的产生,主要内容包括:直流电机的介绍、驱动芯片的介绍,PWM的产生与介绍、相关电路的学习;实现了呼吸灯,以及直流电机的调速; 大家在学习完后尽量自己动手多加练习,内容不难。

创作不易,希望大家多多点赞支持!!!

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐