首页 > 编程知识 正文

步进电机驱动讲解,3相步进电机驱动接线

时间:2023-05-05 14:01:07 阅读:204446 作者:2442

步进电机是用于位置控制的出色电机。它们是一种特殊类型的无刷电机,它将完整的旋转分为多个相等的“步长”。它们通常在台式打印机,3D打印机,CNC铣床以及其他需要精确定位控制的设备中找到。

学习步进电动机的一种廉价方法是使用28BYJ-48步进电动机。它们通常带有基于ULN2003的驱动板,因此非常易于使用。

您知道这些步进电机如何工作吗?

这些步进电机使用带齿的轮(具有32个齿)和四个电磁体来使轮一次“一步”旋转。

发送的每个HIGH脉冲都会使线圈通电,吸引齿轮的最近齿,并一步步驱动电动机。

脉冲这些线圈的方式会极大地影响电动机的性能。

脉冲序列确定电动机的旋转方向。脉冲的频率决定了电动机的速度。脉冲数确定电动机将旋转多远。 28BYJ-48步进电机

28BYJ-48是5线单极5线步进电动机。

关于该电机的有趣之处在于,过去几十年来人们一直在无数应用中使用它。它用于空调,自动售货机和许多其他应用中。

这些电机最好的事情之一是它们可以一次一步地精确定位。

另一个优点是它们的运动相对精确,并且非常可靠,因为电动机不使用接触电刷。

它们即使在静止状态下也能提供良好的转矩,只要向电动机供电就可以保持转矩。

唯一的缺点是,即使它们不动,它们也有点耗电,会消耗电能。

28BYJ-48齿轮减速比

根据数据表,当28BYJ-48电动机以全步模式运行时,每一步对应于11.25°的旋转。这意味着每转有32步(360°/ 11.25°= 32)。

另外,电动机具有1/64减速齿轮组。(实际上是1 / 63.68395,但在大多数情况下,1/64是一个很好的近似值)

这意味着每转实际上有32 * 63.68395步= 2037.8864〜2038步!

28BYJ-48功耗

电机的功耗约为240mA。

因为电机消耗太多功率,所以最好直接从外部5V电源供电,而不是从Arduino汲取功率。

即使在静止状态下,电动机也会消耗功率以保持其位置。

ULN2003驱动板

电机通常带有基于ULN2003的驱动板。

ULN2003是最常见的电机驱动器IC之一,由7对达林顿晶体管对的阵列组成,每对能够驱动高达500mA和50V的负载。该板上使用了七对中的四对。

该板上有一个连接器,可以完美地匹配电动机的电线,这使得将电动机轻松连接到板上非常容易。还有用于四个控制输入的连接以及电源连接。

该板上有四个LED,它们在四根控制输入线上显示活动(以指示步进状态)。它们在电机运行时提供良好的视觉效果。

该板还带有一个ON / OFF跳线,用于隔离步进电机的电源。

ULN2003步进驱动器板的引脚排列

ULN2003步进驱动器板的引脚排列如下:

IN1 – IN4脚用于驱动电动机。将它们连接到Arduino上的数字输出引脚。

地线 是常见的接地引脚。

VDD引脚为电动机供电。将其连接到外部5V电源。由于电机消耗的功率过多,因此切勿使用Arduino的5V电源为步进电机供电。

马达接头,这是电机插入的地方。该连接器是带键的,因此只能以一种方式进入。

将28BYJ-48步进电机和ULN2003驱动程序连接到Arduino

既然我们了解了电动机的所有知识,就可以开始将其连接到Arduino了!

首先将电源连接到ULN2003驱动程序。

请注意,可以从Arduino直接为步进电机供电。但是,不建议这样做。因为电机可能会在其电源线上感应出电气噪声,这可能会损坏Arduino。

因此,请使用单独的5V电源为步进电机供电。

接下来,将电源的地连接到arduino的地。这非常重要,因此我们必须在两者之间建立相同的参考电压。

现在将驱动板的IN1,IN2,IN3,IN4分别连接到Arduino数字引脚8、9、10和11。

最后,将电动机电缆从步进电动机连接到驱动器板上。

完成后,您应该拥有与下图相似的外观。

Arduino代码–使用内置的步进器库

对于我们的第一个实验,我们将使用Arduino IDE随附的Arduino Stepper Library。

步进程序库负责执行步进序列,并使其直接控制各种单极和双极步进电机。

这是一个简单的草图,它使步进电动机顺时针缓慢移动,然后迅速逆时针移动。

//Includes the Arduino Stepper Library#include <Stepper.h>// Defines the number of steps per rotationconst int stepsPerRevolution = 2038;// Creates an instance of stepper class// Pins entered in sequence IN1-IN3-IN2-IN4 for proper step sequenceStepper myStepper = Stepper(stepsPerRevolution, 8, 10, 9, 11);void setup() {// Nothing to do (Stepper Library sets pins as outputs)}void loop() {// Rotate CW slowlymyStepper.setSpeed(100);myStepper.step(stepsPerRevolution);delay(1000);// Rotate CCW quicklymyStepper.setSpeed(700);myStepper.step(-stepsPerRevolution);delay(1000);} 代码说明:

草图首先包括Arduino Stepper库。

#include <Stepper.h>

接下来,我们定义一个常数stepsPerRevolution,该常数保存电动机完成一圈旋转所需的“步数”。在我们的例子中是2038。

const int stepsPerRevolution = 2038;

28BYJ-48单极步进电机的步进顺序为IN1-IN3-IN2-IN4。我们将通过创建一个步进库的实例来使用此信息来驱动电机,该实例myStepper的销序列为8、10、9、11。

确保正确无误,否则电动机将无法正常运行。

Stepper myStepper = Stepper(stepsPerRevolution, 8, 10, 9, 11);

设置功能没有设置任何内容,因为步进器库在内部将四个I / O引脚设置为输出。

void setup() { }

在循环功能中,我们使用该setSpeed()功能设置希望步进电机移动的速度,然后使用该step()功能告诉它旋转多少步。向该step()函数传递负数将使电动机的旋转方向反向。

第一个代码段将使电动机非常缓慢地顺时针旋转。第二个将以更快的速度逆时针旋转电动机。

void loop() {// Rotate CW slowlymyStepper.setSpeed(100);myStepper.step(stepsPerRevolution);delay(1000);// Rotate CCW quicklymyStepper.setSpeed(700);myStepper.step(-stepsPerRevolution);delay(1000);} Arduino代码–使用AccelStepper库

Arduino步进器库非常适合简单的单电机应用。但是,当您想控制多个步进电机时,就需要一个更好的库。

因此,在下一个实验中,我们将使用称为AccelStepper库的高级步进电机库。它通过以下几种方式大大改进了标准Arduino Stepper库:

它支持加速和减速。它支持半步行驶。它支持同时控制多个步进电机,每个步进电机具有独立的并发步进器。

该库未包含在Arduino IDE中,因此您需要首先安装它。

库安装

要安装库,请导航至“Sketch”>“Include Library”>“Manage Libraries...”,等待库管理器下载库索引并更新已安装库的列表。

输入“ accelstepper ” 过滤搜索。单击第一个条目,然后选择“安装”。

Arduino代码

这是一个简单的程序,它使步进电机沿一个方向加速,然后减速以使其静止。电动机旋转一圈后,它将改变旋转方向。而且它不断地重复做。

// Include the AccelStepper Library#include <AccelStepper.h>// Define step constant#define FULLSTEP 4// Creates an instance// Pins entered in sequence IN1-IN3-IN2-IN4 for proper step sequenceAccelStepper myStepper(FULLSTEP, 8, 10, 9, 11);void setup() {// set the maximum speed, acceleration factor,// initial speed and the target positionmyStepper.setMaxSpeed(1000.0);myStepper.setAcceleration(50.0);myStepper.setSpeed(200);myStepper.moveTo(2038);}void loop() {// Change direction once the motor reaches target positionif (myStepper.distanceToGo() == 0) myStepper.moveTo(-myStepper.currentPosition());// Move the motor one stepmyStepper.run(); 代码说明:

我们首先包括新安装的AccelStepper库。

#include <AccelStepper.h>

现在,当我们要全速驱动电动机时,我们将为此定义一个常数。如果要半步驱动电动机,请将常数设置为8。

#define FULLSTEP 4

接下来,我们创建一个名为8、10、9、11 myStepper的引脚序列的步进器库实例(请记住,这些电机的步进序列为IN1-IN3-IN2-IN4)。

同样,请确保您设置正确,否则电动机将无法正常运行。

AccelStepper myStepper(FULLSTEP, 8, 10, 9, 11);

在设置功能中,我们首先将电动机的最大速度设置为1000,这大约是这些电动机可以运行的最大速度。然后,我们为电动机设置一个加速因子,以将加速度和减速度添加到步进电动机的运动中。

接下来,我们将常规速度设置为200,并将其移动到2038的步数(您记得28BYJ-48的齿轮传动装置每转将移动2038步)。

void setup() {myStepper.setMaxSpeed(1000.0);myStepper.setAcceleration(50.0);myStepper.setSpeed(200);myStepper.moveTo(2038);}

在循环功能中,我们使用If语句检查电机distanceToGo到达目标位置(由设置)之前,需要行驶多远(通过读取属性moveTo)。一旦distanceToGo达到零,我们将通过将moveTo位置更改为当前位置的负值来沿相反方向移动电动机。

现在,在循环的底部,您会注意到我们已经调用了一个run()函数。这是最重要的功能,因为直到执行此功能,步进器才会运行。

void loop() {// Change direction once the motor reaches target positionif (myStepper.distanceToGo() == 0) myStepper.moveTo(-myStepper.currentPosition());// Move the motor one stepmyStepper.run();} 同时控制两个28BYJ-48步进电机

对于我们的下一个实验,我们将在Arduino中添加第二个28BYJ-48步进器和ULN2003驱动程序,以同时驱动两个电机。

接线

保留您之前建立的连接,并按以下步骤连接新设备:

我们将再次使用单独的5V电源为ULN2003驱动板供电。

现在,将第二个驱动器板的IN1,IN2,IN3,IN4分别连接到Arduino数字引脚4、5、6和7。

下图显示了接线。

Arduino代码

这是草图,其中一台电动机全速驱动,第二台电动机半速驱动。电动机旋转一圈时,其旋转方向将改变。还涉及一些加速和减速。

// Include the AccelStepper Library#include <AccelStepper.h>// Define step constants#define FULLSTEP 4#define HALFSTEP 8// Creates two instances// Pins entered in sequence IN1-IN3-IN2-IN4 for proper step sequenceAccelStepper stepper1(HALFSTEP, 8, 10, 9, 11);AccelStepper stepper2(FULLSTEP, 4, 6, 5, 7);void setup() {// set the maximum speed, acceleration factor,// initial speed and the target position for motor 1stepper1.setMaxSpeed(1000.0);stepper1.setAcceleration(50.0);stepper1.setSpeed(200);stepper1.moveTo(2038);// set the same for motor 2stepper2.setMaxSpeed(1000.0);stepper2.setAcceleration(50.0);stepper2.setSpeed(200);stepper2.moveTo(-2038);}void loop() {// Change direction once the motor reaches target positionif (stepper1.distanceToGo() == 0) stepper1.moveTo(-stepper1.currentPosition());if (stepper2.distanceToGo() == 0) stepper2.moveTo(-stepper2.currentPosition());// Move the motor one stepstepper1.run();stepper2.run();} 代码说明:

我们首先包括AccelStepper库。

#include <AccelStepper.h>

现在,我们要全速驱动一台电动机,而半速驱动第二台电动机。我们将为此定义两个常量。

#define FULLSTEP 4 #define HALFSTEP 8

接下来,我们创建两个马达对象,每个马达对象一个。我们使用引脚定义和步骤定义来进行设置。

AccelStepper stepper1(HALFSTEP, 8, 10, 9, 11);AccelStepper stepper2(FULLSTEP, 4, 6, 5, 7);

在设置功能中,我们首先将的最大速度设置stepper1为1000。然后,我们为电动机设置一个加速因子,以将加速度和减速度添加到步进电动机的运动中。

接下来,我们将常规速度设置为200,并将其移动到2038的步数(您记得28BYJ-48的齿轮传动装置每转将移动2038步)。

我们将做完全相同的事情,stepper2只是我们会指示它移至-2038,因为我们希望它逆时针移动。

void setup() {// settings for motor 1 stepper1.setMaxSpeed(1000.0); stepper1.setAcceleration(50.0); stepper1.setSpeed(200); stepper1.moveTo(2038);// settings for motor 2 stepper2.setMaxSpeed(1000.0); stepper2.setAcceleration(50.0); stepper2.setSpeed(200); stepper2.moveTo(-2038);}

在循环功能中,我们If statements对每个电动机使用两个(每个电动机一个),以检查电动机distanceToGo到达目标位置(由设置)之前需要行驶多远(通过读取属性moveTo)。一旦distanceToGo达到零,我们将其moveTo位置更改为当前位置的负值,以便它们开始向相反方向移动。

最后,我们通过调用run()函数使它们运动。

void loop() {// Change direction once the motor reaches target positionif (stepper1.distanceToGo() == 0) stepper1.moveTo(-stepper1.currentPosition());if (stepper2.distanceToGo() == 0) stepper2.moveTo(-stepper2.currentPosition());// Move the motor one stepstepper1.run();stepper2.run();}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。