直流电机实验
单片机使用GP I/O连接ULN2003驱动芯片(单片、高电压、高电流的达林顿晶体管集成电路)
来驱动直流电机和步进电机。
直流电机介绍
直流电机是指能将直流电能转换成机械能(直流电动机)或将机械能转换成直流电能(直流发电机)的旋转电机。它是能实现直流电能和机械能互相转换的电机。当它作电动机运行时是直流电动机,将电能转换为机械能;作发电机运行时是直流发电机,将机械能转换为电能。
直流电机的结构应由定子和转子两大部分组成。直流电机运行时静止不动的部分称为定子,定子的主要作用是产生磁场,由机座、主磁极、 换向极、 端盖、轴承和电刷装置等组成。运行时转动的部分称为转子,其主要作用是产生电磁转矩和感应电动势,是直流电机进行能量转换的枢纽,所以通常又称为电枢,由转轴、电枢铁心、电枢绕组、换向器和风扇等组成。
直流电机没有正负之分,在两端加上直流电就能工作。需要知道直流电机的额定电压和额定功率,不能使之长时间超负荷运作。 在交换接线后,可以形成正反转。转向为电流方向,即延正极方向向负极方向旋转。
开发板配置的直流电机为 5V 直流电机,其主要参数如下:
轴长:8mm
轴径:2mm
电压:1-6V
参考电流:0.35-0.4A
3V 转速:17000-18000 转每分钟
外观实物图如下:
其内部结构如下图所示:
如图电流方向为a–>d。则a为正极,d为负极。
ULN2003 芯片介绍
51 单片机主要是用来控制而非驱动,如果直接使用芯片的 GPIO管脚去驱动大功率器件,要么将芯片烧坏,要么就驱动不起来。所以要驱动大功率器件,比如电机。就必须搭建驱动电路,开发板上板载的驱动芯片是 ULN2003,该芯片是一个单片高电压、高电流的达林顿晶体管阵列集成电路。不仅可以用来驱动直流电机,还可用来驱动五线四相步进电机,比如单片机上本次使用的28BYJ-48 步进电机。
ULN2003 来驱动直流电机,下面来具体介绍下 ULN2003 芯片的使用。ULN2003 是一个单片高电压、高电流的达林顿晶体管阵列集成电路。它是由7 对 NPN 达林顿管组成的,它的高电压输出特性和阴极箝位二极管可以转换感应负载。单个达林顿对的集电极电流是 500mA。达林顿管并联可以承受更大的电流。此电路主要应用于继电器驱动器,字锤驱动器,灯驱动器,显示驱动器(LED 气体放电),线路驱动器和逻辑缓冲器。ULN2003 的每对达林顿管都有一个 2.7k串联电阻,可以直接和 TTL 或 5V CMOS 装置。
(1)主要特点
①500mA 额定集电极电流(单个输出)
②高电压输出:50V
③输入和各种逻辑类型兼容
④继电器驱动器
(2)逻辑框图
从上图可以很容易理解该芯片的使用方法,其内部相当于非门电路,即输入高输出为低,输入为低输出是高(B与C相通,E连接GND,COM连接电源),这里要注意:
因为 ULN2003 的输出是集电极开 路,ULN2003 要输出高电平,必须在输出口外接上拉电阻。这也就能解释在后面 连接直流电机时为什么不能直接将 ULN2003 的 2 个输出口接电机线,而必须一 根线接电源,另一个才接 ULN2003 输出口。而单片机没有自带上拉电阻,因此,只能COM连接电压输入高电平,而通过任意一个输出口C输出低电平,从而使电机旋转。但是旋转方向固定。
若使用该芯片驱动直流电机,只可实现单方向控制,电机一端接电源正极,另一端接芯片的输出口。若想控制五线四相步进电机,则可将四路输出接到步进电机的四相上,电机另一条线接电源正。
硬件电路设计
A2-A4开发板:输入管脚为P1^ 0到P1^ 3,P2 ^5连接蜂鸣器,本实验用不到。J47上1脚连接VCC,其它四个脚为输出口,通过一个输出口输出低电平,就可以实现电机的工作。而有四个输出口是为了与后面的步进电机兼容。
A5-A7开发板:从上图中可以看出,该电路是独立的,芯片的输入通过 J46 端子提供,芯片的输出由 J47 端子引出。J46 输入对应 J47 输出,而 J47 则是提供给外部连接电机的接口,可以支持直流电机、五线四相步进电机 28BYJ-48 连接。由于该模块电路是独立的,所以使用任意单片机管脚都可以,为了与我们例程程序配套,这里使用 P1.0 管脚来控制 ULN2003 输出,即将 P1.0 管脚连接到J46 的 IN1,直流电机的两根线接 J47 端子的 1、2 脚即 5V 和 O1。因此可通过单片机 P1.0 口输出高电平来控制电机旋转,输出低电源控制电机停止。注意:单片机 P1.0 输出低电平时,ULN2003 的 OUT1 并不会输出高电平导致停止,而是因为集电极开路,导致电机无电流流入致使停止。
软件编程
因为输入口接的是P1端口,而P1端口中有上拉电阻,所有就算不定义P0端口,从P0端口输出的默认的就是低电平。因此就算不定义,插上电机,电机也会选转。
#include"reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
#define DC_MOTOR_RUN_TIME 5000
sbit DC_Motor P1^0;
void delay_1ms(u16 ms)
{
u16 i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);//注意分号
}
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
void main()
{
DC_Motor=1;
delay_ms(DC_MOTOR_RUN_TIME);
DC_Motor=0;
}