步进电机驱动
前言
- 本文介绍28BYJ-48步进电机驱动原理及实验,主要内容有:
- 1、介绍28BYJ-48步进电机;
- 2、介绍ULN2003驱动板;
- 3、自编程序控制步进电机正转;
- 4、调用库函数控制电机正反转。
一、28BYJ-48步进电机
1、步进电机
-
(1)工作原理
-
步进电机通过一系列离散的步进动作来实现旋转。每个电脉冲信号驱动电机转动一个固定的角度,称为步距角。步进电机的控制通常通过一个驱动器(步进驱动器)来完成,该驱动器接受来自控制器的脉冲信号,并将其转换为步进电机的相位信号,从而驱动电机按预定的步进角度转动。
-
简单来说:就是给步进电机不同的相轮流通电,在电磁感应的作用下,每次产生一个很小的角位移,连贯起来就带动了电机的转动,从而驱动负载。
-
步进电机是数字控制电机,它将脉冲信号转变成角位移,即给一个脉冲信号,步进电机就转动一个角度,因此非常适合于单片机控制。步进电机可分为反应式步进电机(简称VR)、永磁式步进电机(简称PM)和混合式步进电机(简称HB),后两种常用。
-
步进电机控制特点:
-
① 它是通过输入脉冲信号来进行控制的。
-
② 电机的总转动角度由输入脉冲数决定。
-
③ 电机的转速由脉冲信号频率决定。
-
(2)步进电机控制的基本概念
2、28BYJ-48
-
28BYJ-48是一种常见的单极性五线四相步进电机.
-
“单极性”指线圈中电流的方向是确定的,不可翻转;对应的,“双极性”指线圈冲存在两种不同地电流方向。
-
五线:电机外部引出五条线。
-
四相:电机内部的定子上有8个齿,正对着的2个齿上的绕组又是串联在一起的,也就是说正对着的2个绕组总是会同时导通或关断的,如此就形成了4相。
-
(1)基本参数:
型号 | 28BYJ48 |
---|---|
相数 | 4相 |
驱动方式 | 1-2 相励磁单极驱动,本文选用ULN2003驱动芯片 |
步距角 | 5.625°/64 (输出轴),减速比1/64 |
工作电压 | 5VDC(电机端子) |
线圈电阻 | 50Ω±7%/相 25℃ |
最大空载牵出频率 | >900pps |
最大空载牵入频率 | >900pps |
牵入转距 | >300gf.cm / 5VDC 100pps |
绝缘电阻 | 在引接线和外壳之间施加500VDC,测得绝缘电阻大于10MΩ。 |
电气强度 | 在引接线和外壳之间施加50/60Hz 500VAC,时间1分钟,泄漏电流设置为1mA,(或50/60Hz 600VAC,时间1秒钟,泄漏电流设置为1mA),应无击穿或闪络。 |
电机绕阻温升 | 电机在5VDC 100HZ,空载运行条件下,电机温升达到稳定状态时,用电阻法测量电机温升应不大于60K。 |
-
关键参数解释如下:
-
① 相数:4,可独立通电的定子电磁线圈数为4个。
-
② 驱动方式:1-2相励磁单极驱动,采用一相励磁与二相励磁交替导通的方式。
-
1相励的意思是,在工作瞬间,只能有1个线圈通电。比如上图,我们依次对A、B、C、D相圈通电。完成一轮以后,中间永磁体转子转动一定的角度。
-
2相励的意思是,在工作瞬间,只能有2个线圈通电。
-
1-2相励的意思就是工作时,1个线圈、2个线圈交替通电。
-
这里有个关于这个过程的单位定义,对某相线圈通电,我们叫做一拍,也叫做一步。
-
③ 步距角:5.625°/64,减速比1/64。
这里要解释一下,也就是一步转子转动的角度为5.625°。但这里为什么要除以64呢?这是因为28BTYJ-48电极带有减速齿轮箱,可以理解为28BTYJ-48电极是两部分组成,一个步进电机加一个减速部件。这个减速部件将步进电机的转速减慢至1/64。所以最终从转轴上看,每一步转动5.625°/64=0.089°,也就是每一步轴转0.089°。
- (2)28BYJ48结构:
-
(3)28BYJ-48工作原理
-
(4)工作方式:
-
① 四拍驱动:这是最简单的步进电机驱动方式。这种方式,电机在每个瞬间只有一个线圈导通。
通俗解释:按顺序给相应引脚拉高(1)拉低(0)。 一个拉高,其他三个拉低。 -
② 八拍驱动:就是在上述四拍切换过程中穿插两个线圈同时拉高的情况。
-
(5)八拍模式绕组控制顺序表(28BYJ-48电机)
线 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|---|
P1-红 | VCC | VCC | VCC | VCC | VCC | VCC | VCC | VCC |
P2-橙 | GND | GND | GND | |||||
P3-黄 | GND | GND | GND | |||||
P4-粉 | GND | GND | GND | |||||
P5-蓝 | GND | GND | GND |
- ① 四拍驱动:1→3→5→7
- ② 八拍驱动:1→2→3→4→5→6→7→8
- 注意:实际使用时,上表中空白格默认填充高电平。
二、ULN2003驱动板
- 由于28BYJ-48步进电机消耗大量功率,因此无法直接由Arduino等微控制器控制。为了控制电机,需要使用ULN2003等驱动IC;因此,该电机通常配备基于 ULN2003 的驱动板。
- ULN2003是一个单片高电压(最高可达50V)、高电流(单个额定输出500mA)的达林顿晶体管阵列集成电路。 它是由7对NPN达林顿晶体管组成的,它的高电压输出特性和阴极钳位二极管可以转换感应负载。每个晶体管对可驱动高达 500mA 和 50V 的负载,达林顿管并联可以承受更大的电流。
- ULN2003可以作为继电器驱动器,字锤驱动器、灯驱动器、显示驱动器(LED气体放电),线路驱动器和逻辑缓冲器。ULN2003的每一对达林顿晶体管的基极都有一个2.7k的串联电阻,可以直接和TTL或者5V的CMOS装置连接。它实际上就是一个功率放大器,输出端具有较大的驱动能力(电流较大)。
- ULN2003内部原理图和引脚定义如下所示:
-
该驱动板使用7对NPN达林顿晶体管中的四对,并且有四个控制输入和一个电源连接。
-
此外,还有一个与电机上的连接器兼容的 Molex 连接器,允许将电机直接插入其中。
-
该板包括四个 LED,用于指示四个控制输入线上的活动。它们在行走时提供良好的视觉指示。
-
板上有一个开/关跳线,用于在需要时禁用步进电机。
1、驱动模块介绍
- 上图是五线四相步进电机驱动模块也叫ULN20003驱动板,该模块使用ULN2003大功率达林顿芯片驱动步进电机。A、B、C、D发光二极管指示四相步进电机工作状态,配有步进电机的标准接口,使用时可直接插拔。驱动板基本参数如下:
2、硬件电路连线
Arduino开发板引脚 | ULN2003驱动板 | 功能 |
---|---|---|
GND | GND(黑色) | 负极 |
5V | VCC(红色) | 正极 |
D4 | IN1 | 驱动信号1 |
D5 | IN2 | 驱动信号2 |
D6 | IN3 | 驱动信号3 |
D7 | IN4 | 驱动信号4 |
3、steper库常用函数
steper库函数 | 说明 | 语法 | 参数 |
---|---|---|---|
Stepper mystepper() | 输入参数步数,引脚 | Stepper mystepper(STEPS,pin1,pin2,pin3,pin4) | STEPS: 电机旋转一周的步数(整数型);pin1, pin2: 连接电机的引脚编号(整数型);pin3, pin4: (可选参数)连接电机的引脚编号(整数型) |
mystepper.setSpeed() | 设定步进电机速度为SPEED rpm | mystepper.setSpeed(SPEED) | 设定转速,单位为rpm,比如setSpeed(200),就是转速为200转每分钟。但这里的转速是不带减速比的。 |
mystepper.step() | 步进电机走steps步 | mystepper.step(steps) | steps: 电机运行的步数(整数型)。 |
- 注意:
- (1) arduino自带的steper驱动库,查看stepper函数的源代码,使用的是2相励驱动,而规格书中,是1-2相励驱动,所以不可以直接使用。
- (2)修改Stepper.cpp源代码,支持1-2相励模式,Stepper.cpp改动后另存为Stepper_28BYJ48.cpp和Stepper_28BYJ48.h文件。
- (3)库文件百度网盘下载链接:Stepper_28BYJ48。
- (4)Ardunio安装自定义库文件方法,CSDN链接:ardunio中自定义的库文件。
三、步进电机实验
- 28BYJ-48 步进电机空载耗电在50mA 以下,带64 倍减速器,输出力矩比较大,可以驱动重负载,适合开发板使用。注意:此款步进电机带有64倍减速器,与不带减速器的步进电机相比,转速显得较慢,为方便观察,可在输出轴处粘上一片小纸板。其中红色线为VCC,其余4个为4个相位。
- 使用 ULN2003 达林顿驱动芯片驱动步进电机,板载4个LED,可以指示相位状态。
- 步进电机相位控制,如果选择相位A,单片机给驱动板D4引脚高电平,其它D5/D6/D7引脚低电平,达林顿管对应引脚输出电平会翻转,达林顿管输出低电平时候配合VCC,可以驱动A相位。
1、步进电机正转
- (1)本实验采用Arduino UNO R3开发板及自主搭建电路的方式,实现预设功能。
- (2)步进电机正转的电路图,如下图所示:
- (3)实现功能:步进电机正向转动,可改变电机转速。
- ① 四拍驱动
代码实现:
//步进电机正向转动,可改变电机转速(四拍驱动)
#include <Arduino.h>
#define A1 4 //引脚命名
#define B1 5
#define C1 6
#define D1 7
void setup()
{
pinMode(A1,OUTPUT); //设置引脚为输出引脚
pinMode(B1,OUTPUT);
pinMode(C1,OUTPUT);
pinMode(D1,OUTPUT);
}
void loop()
{
Phase_A(); //设置A相位
delay(5); //改变延时可改变旋转速度
Phase_B(); //设置B相位
delay(5);
Phase_C(); //设置C相位
delay(5);
Phase_D(); //设置D相位
delay(5);
}
void Phase_A()
{
digitalWrite(A1,HIGH); //A1引脚高电平
digitalWrite(B1,LOW);
digitalWrite(C1,LOW);
digitalWrite(D1,LOW);
}
void Phase_B()
{
digitalWrite(A1,LOW);
digitalWrite(B1,HIGH); //B1引脚高电平
digitalWrite(C1,LOW);
digitalWrite(D1,LOW);
}
void Phase_C()
{
digitalWrite(A1,LOW);
digitalWrite(B1,LOW);
digitalWrite(C1,HIGH); //C1引脚高电平
digitalWrite(D1,LOW);
}
void Phase_D()
{
digitalWrite(A1,LOW);
digitalWrite(B1,LOW);
digitalWrite(C1,LOW);
digitalWrite(D1,HIGH); //D1引脚高电平
}
- ② 八拍驱动
代码实现:
//控制28BYJ48电机,八拍驱动,正转一圈
#include <Arduino.h>
#define A1 4 //引脚命名
#define B1 5
#define C1 6
#define D1 7
void setup()
{
pinMode(A1,OUTPUT); //设置引脚为输出引脚
pinMode(B1,OUTPUT);
pinMode(C1,OUTPUT);
pinMode(D1,OUTPUT);
}
void loop()
{
Phase_A(); //设置A相位
delay(2); //改变延时可改变旋转速度
Phase_AB();
delay(2);
Phase_B(); //设置B相位
delay(2);
Phase_BC();
delay(2);
Phase_C(); //设置C相位
delay(2);
Phase_CD();
delay(2);
Phase_D(); //设置D相位
delay(2);
Phase_DA();
delay(2);
}
void Phase_A()
{
digitalWrite(A1,HIGH); //A1引脚高电平
digitalWrite(B1,LOW);
digitalWrite(C1,LOW);
digitalWrite(D1,LOW);
}
void Phase_AB()
{
digitalWrite(A1,HIGH); //A1引脚高电平
digitalWrite(B1,HIGH); //B1引脚高电平
digitalWrite(C1,LOW);
digitalWrite(D1,LOW);
}
void Phase_B()
{
digitalWrite(A1,LOW);
digitalWrite(B1,HIGH); //B1引脚高电平
digitalWrite(C1,LOW);
digitalWrite(D1,LOW);
}
void Phase_BC()
{
digitalWrite(A1,LOW);
digitalWrite(B1,HIGH); //B1引脚高电平
digitalWrite(C1,HIGH); //C1引脚高电平
digitalWrite(D1,LOW);
}
void Phase_C()
{
digitalWrite(A1,LOW);
digitalWrite(B1,LOW);
digitalWrite(C1,HIGH); //C1引脚高电平
digitalWrite(D1,LOW);
}
void Phase_CD()
{
digitalWrite(A1,LOW);
digitalWrite(B1,LOW);
digitalWrite(C1,HIGH); //C1引脚高电平
digitalWrite(D1,HIGH); //D1引脚高电平
}
void Phase_D()
{
digitalWrite(A1,LOW);
digitalWrite(B1,LOW);
digitalWrite(C1,LOW);
digitalWrite(D1,HIGH); //D1引脚高电平
}
void Phase_DA()
{
digitalWrite(A1,HIGH); //A1引脚高电平
digitalWrite(B1,LOW);
digitalWrite(C1,LOW);
digitalWrite(D1,HIGH); //D1引脚高电平
}
- (4)实现现象(部分显示):
2、步进电机正反转
- (1)本实验采用Arduino UNO R3开发板及自主搭建电路的方式,实现预设功能。
- (2)步进电机正反转的电路图,如下图所示:
-
(3)实现功能:八拍驱动,步进电机正转一圈,反转一圈。
-
(4)注意:编译代码前,需要下载安装自定义的 Stepper28BYJ48 库文件,并在程序中添加 #include <Stepper28BYJ48.h> 头文件 。
代码实现:
//控制28BYJ48电机,八拍驱动,正转一圈,反转一圈
#include <Stepper_28BYJ48.h>
const int stepsPerRevolution = 4096; //28BYJ48电机旋转一周需要的步数
// 电机接在引脚4 ~ 7: 电机线依次为蓝,粉,黄,橙
Stepper myStepper(stepsPerRevolution, 4, 5, 6, 7);
int stepCount = 0; // number of steps the motor has taken
void setup() {
// initialize the serial port:
Serial.begin(9600);
//设置电机转速r/min
myStepper.setSpeed(5);
}
void loop() {
// 正转一圈
myStepper.step(stepsPerRevolution);
Serial.print("steps:" );
Serial.println(stepsPerRevolution);
delay(1000);
// 反转一圈
myStepper.step(-stepsPerRevolution);
Serial.print("steps:" );
Serial.println(-stepsPerRevolution);
delay(1000);
}
- (5)实现现象(部分显示):
总结
- 本文主要介绍28BYJ-48步进电机的工作原理及两个步进电机驱动实验,通过上述学习,掌握使用Arduino库函数控制28BYJ-48步进电机,实现预设功能。
参考资料1: 使用 ULN2003 驱动器和 Arduino 控制 28BYJ-48 步进电机
参考资料2: 初学51单片机基础知识与步进电机28BYJ-48详解
参考资料3: 28BYJ-48步进电机详解(五线四相 STM32)
参考资料4: 28BYJ-48步进电机详述
参考资料5: STM32驱动步进电机(原理、程序、解决电机只震动不转动问题)
参考资料6: 【STM32】步进电机及其驱动(ULN2003驱动28BYJ-48丨按键控制电机旋转)
参考资料7: 步进电机28BYJ-48的驱动(arduino,STM32平台),最全的驱动详细原理,驱动电路分析,驱动代码解释)
参考资料8: Arduino 控制 28BYJ-48 步进电机详解