Arduino程序设计(十五)步进电机驱动(28BYJ-48)


前言

  • 本文介绍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电机)

线12345678
P1-红VCCVCCVCCVCCVCCVCCVCCVCC
P2-橙GNDGNDGND
P3-黄GNDGNDGND
P4-粉GNDGNDGND
P5-蓝GNDGNDGND
  • 四拍驱动: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驱动板功能
GNDGND(黑色)负极
5VVCC(红色)正极
D4IN1驱动信号1
D5IN2驱动信号2
D6IN3驱动信号3
D7IN4驱动信号4

3、steper库常用函数

steper库函数说明语法参数
Stepper mystepper()输入参数步数,引脚Stepper mystepper(STEPS,pin1,pin2,pin3,pin4)STEPS: 电机旋转一周的步数(整数型);pin1, pin2: 连接电机的引脚编号(整数型);pin3, pin4: (可选参数)连接电机的引脚编号(整数型)
mystepper.setSpeed()设定步进电机速度为SPEED rpmmystepper.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 步进电机详解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值