跳到主要内容

8051 微控制器步进电机控制

步进电机是一种无刷同步电机,它将完整旋转分为若干步。每个步进电机都有固定的步进角,电机以该角度旋转。在本文中,我将向你展示如何使用两种不同驱动器 L293D 和 ULN2003 将步进电机与 8051 接口。此外,这里还讲解了使用 8051 微控制器的步进电机控制方法。

1. 8051 微控制器步进电机控制原理

这些电路的主要原理是以特定步进角逐步旋转步进电机。由于控制器无法提供电机所需的电流,因此使用 ULN2003 IC 和 L293D 电机驱动器来驱动步进电机。

2. 电路 1:使用 8051 微控制器 & L293D 的步进电机控制

项目中的第一个电路是使用 L293D 电机驱动器 IC 实现的。由于 L293D 电机驱动器提供四个输出引脚,因此仅能驱动双极步进电机。

2.1 电路图

下图显示了双极步进电机与 8051 微控制器及 L293D 电机驱动器的接口电路图。

alt text
8051 微控制器步进电机控制 L293D 电路图

2.2 所需元件

  • AT89C51 (8051 微控制器)
  • L293D 电机驱动器
  • 5V 双极步进电机
  • 16×2 LCD 显示屏
  • 11.0592 MHz 石英晶体
  • 10KΩ 电阻 × 2
  • 10KΩ 可变电阻
  • 8×1KΩ 电阻包
  • 33pF 陶瓷电容 × 2
  • 10μF/16V 电解电容
  • 按键 × 4
  • 330Ω 电阻
  • 5V 电源

2.3 电路设计

首先,将 LCD 的数据引脚连接到 8051 的 PORT0 引脚。由于 PORT0 没有内部上拉电阻,因此使用电阻包将 PORT0 上拉。LCD 的 RS 和 E 引脚分别连接到 8051 的 P2.0 和 P2.1。

RST 引脚通过 10KΩ 电阻下拉。按键和 10μF 电容组合用于复位微控制器。EA 引脚通过 10KΩ 电阻上拉。

振荡器由两个 33pF 电容和 11.0592 MHz 晶体构成,连接在 8051 的 XTAL1 和 XTAL2 引脚之间。

电机驱动器的两个使能引脚和两个电源引脚连接到 +5V 电源。四个输入引脚连接到 8051 的 PORT1,即 P1.0、P1.1、P1.2 和 P1.3。双极步进电机的四个引脚连接到 L293D 的四个输出引脚。

为了控制步进电机的旋转方向,三个按键连接到 PORT3 的 P3.0、P3.1 和 P3.2。

2.4 代码

#include<reg51.h> 
#define lcd P0
sbit rs=P2^0;
sbit e=P2^1;

sbit sw1=P1^2;
sbit sw2=P1^1;
sbit sw3=P1^3;
sbit sw4=P1^0;

sbit forward = P3^0;
sbit backward = P3^1;
sbit stop = P3^2;


void delay (int);
void cmd (unsigned char);
void display (unsigned char);
void string (char *);
void init (void);


void delay (int d)
{
unsigned char i;
for(;d>0;d--)
{
for(i=250;i>0;i--);
for(i=248;i>0;i--);
}
}
void cmd (unsigned char c)
{
lcd=c;
rs=0;
e=1;
delay(10);
e=0;
}
void display (unsigned char c)
{
lcd=c;
rs=1;
e=1;
delay(10);
e=0;
}
void string (char *p)
{
while(*p)
{
display(*p++);
}
}
void init (void)
{
cmd(0x38);
cmd(0x0c);
cmd(0x01);
cmd(0x80);
}

void main()i
{
int z=0;
init();
P3=0xff;
P1=0x00;
abc:
cmd(0x80);
while(stop==0);
string("Press Forward Or");
cmd(0xc0);
string("Backward To Run");
forward=1;
backward=1;
while(1)
{
if(forward==0)
{
cmd(0x01);
cmd(0x80);
string("Running Forward");
while(forward==0);
while(1)
{
z++;
if(z==1)
{
sw1=1;sw2=0;sw3=0;sw4=0;delay(30);
if(backward==0 || stop==0)
break;
}
else if(z==2)
{
sw1=1;sw2=1;sw3=0;sw4=0;delay(30);
if(backward==0 || stop==0)
break;
}
else if(z==3)
{
sw1=0;sw2=1;sw3=0;sw4=0;delay(30);
if(backward==0 || stop==0)
break;
}
else if(z==4)
{
sw1=0;sw2=1;sw3=1;sw4=0;delay(30);
if(backward==0 || stop==0)
break;
}
else if(z==5)
{
sw1=0;sw2=0;sw3=1;sw4=0;delay(30);
if(backward==0 || stop==0)
break;
}
else if(z==6)
{
sw1=0;sw2=0;sw3=1;sw4=1;delay(30);
if(backward==0 || stop==0)
break;
}
else if(z==7)
{
sw1=0;sw2=0;sw3=0;sw4=1;delay(30);
if(backward==0 || stop==0)
break;
}
else if(z==8)
{
z=0;
sw1=1;sw2=0;sw3=0;sw4=1;delay(30);
if(backward==0 || stop==0)
break;
}
}
}

if(backward==0)
{
cmd(0x01);
cmd(0x80);
string("Running Backward");
while(backward==0);
while(1)
{
z++;
if(z==1)
{
sw1=1;sw2=0;sw3=0;sw4=1;delay(30);
if(forward==0 || stop==0)
break;
}
else if(z==2)
{
sw1=0;sw2=0;sw3=0;sw4=1;delay(30);
if(forward==0 || stop==0)
break;
}
else if(z==3)
{
sw1=0;sw2=0;sw3=1;sw4=1;delay(30);
if(forward==0 || stop==0)
break;
}
else if(z==4)
{
sw1=0;sw2=0;sw3=1;sw4=0;delay(30);
if(forward==0 || stop==0)
break;
}
else if(z==5)
{
sw1=0;sw2=1;sw3=1;sw4=0;delay(30);
if(forward==0 || stop==0)
break;
}
else if(z==6)
{
sw1=0;sw2=1;sw3=0;sw4=0;delay(30);
if(forward==0 || stop==0)
break;
}
else if(z==7)
{
sw1=1;sw2=1;sw3=0;sw4=0;delay(30);
if(forward==0 || stop==0)
break;
}
else if(z==8)
{
z=0;
sw1=1;sw2=0;sw3=0;sw4=0;delay(30);
if(forward==0 || stop==0)
break;
}
}
}
if(stop==0)
goto abc;
}
}

2.5 工作原理

该电路的工作非常简单。程序中实现了一种称为半步驱动(Half-Stepping)的方法来旋转步进电机。当按下前进按钮时,步进电机顺时针旋转。

alt text
alt text

当按下后退按钮时,步进电机逆时针旋转。要完全停止旋转,可按下停止按钮。

3. 电路 2:使用 8051 微控制器 & ULN2003 的步进电机控制

项目中的第二个电路使用 8051 微控制器和 ULN2003 实现步进电机控制。由于 ULN2003 晶体管阵列有 7 个输出,可以控制单极和双极步进电机。

在本项目中,我将演示如何使用 8051 和 ULN2003 晶体管阵列控制 5 线单极步进电机。

3.1 电路图

下图显示了步进电机与 8051 和 ULN2003 的接口电路图。

alt text

3.2 电路元件

  • AT89C51 微控制器
  • ULN2003A
  • 步进电机
  • 晶体
  • 电阻
  • 电容

3.3 电路设计

电路由 AT89C51 微控制器、ULN2003A 和步进电机组成。AT89C51 是低功耗、高性能 CMOS 8 位 8051 系列微控制器,具有 32 个可编程 I/O 引脚和 4K 字节 Flash 可编程可擦写存储器。微控制器的 18 和 19 引脚连接外部晶体振荡器。电机通过驱动 IC 连接到 PORT2。

ULN2003A 是电流驱动 IC,用于驱动步进电机电流(大于 60mA)。它是达林顿对阵列,由 7 对达林顿对组成,公共发射极。IC 有 16 个引脚,其中 7 个输入、7 个输出,其余为 VCC 和 GND。前四个输入连接微控制器,四个输出连接步进电机。

步进电机有 6 个引脚,其中 2 个连接 12V 电源,其余连接步进电机输出。步进电机以固定步进角旋转,每步为完整周期的一部分,取决于机械结构和驱动方式。

步进电机与所有电机类似,具有定子和转子。转子为永磁体,定子有线圈。基本步进电机有 4 个线圈,每步旋转 90 度,四个线圈按顺序循环激活。

驱动方法

  • 全步驱动(Full Step Drive):一次激励两个线圈,即同时激励相对的两根线圈。
  • 半步驱动(Half Step Drive):线圈交替激励,以半步角旋转。可一次激励两个或单个线圈,从而增加每周期旋转次数。

3.4 如何操作步进电机驱动电路?

  • 打开电路开关

  • 微控制器开始驱动步进电机

  • 可以观察步进电机旋转

  • 步进电机有四根线:黄、蓝、红、白,按顺序交替激励

  • 全步驱动使用以下顺序

    alt text

  • 半步驱动使用以下顺序

    alt text

3.5 步进电机控制电路优点

  • 功耗低
  • 需要低工作电压

3.6 步进电机控制应用

  • 可用于机器人应用
  • 可用于机电一体化应用
  • 可用于磁盘驱动器、点阵打印机等设备。