51单片机---直流电机(PWM)含源码、小白可入
写在前面:在51单片机应用中,电机控制的应用十分多;本节我们学习使用通过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的产生与介绍、相关电路的学习;实现了呼吸灯,以及直流电机的调速; 大家在学习完后尽量自己动手多加练习,内容不难。
创作不易,希望大家多多点赞支持!!!
更多推荐
所有评论(0)