在这个Arduino教程中,我们将学习如何控制步进电动机使用A4988步进驱动程序。您可以阅读下面的书面教程。

概述

A4988是一个微步进驱动器,用于控制双极步进电机,它有内置的转换器,便于操作。这意味着我们可以用控制器的2个引脚来控制步进电机,或者一个用于控制旋转方向,另一个用于控制步进。

如何用4988驱动器和Arduino控制步进电机(如何用4988驱动器和Arduino控制步进电机)(1)

驱动程序提供五种不同的步进分辨率:全步、半轴步、四分之一步、八步和十六步。此外,它还有一个电位计,用于调节电流输出、过热关机和交叉电流保护。

其逻辑电压为3~5.5v,如果提供良好的附加冷却,则每相的最大电流为2A,或者在没有散热器或冷却的情况下,每相的最大电流为1A。

如何用4988驱动器和Arduino控制步进电机(如何用4988驱动器和Arduino控制步进电机)(2)

A4988步进驱动器引脚

现在让我们仔细看看驱动器的引脚,并将其与步进电机和控制器连接起来。因此,我们将从按钮右侧的2个引脚开始,为驱动器供电的VDD和接地引脚,我们需要将它们连接到3到5.5 V的电源上,在我们的情况下,这将是我们的控制器,Arduino板将提供5 V电压。以下4个引脚用于连接电机。1A和1B引脚将连接到电机的一个线圈,2A和2B引脚连接到电机的另一个线圈。为了给电机供电,我们使用接下来的2个引脚,接地和VMOT,我们需要将它们连接到8到35 V的电源上,我们还需要使用至少47µF的去耦电容器来保护驱动板免受电压尖峰的影响。

如何用4988驱动器和Arduino控制步进电机(如何用4988驱动器和Arduino控制步进电机)(3)

接下来的两个引脚:Step和Dir是我们实际用于控制电机运动的引脚。DIR引脚控制着电机的旋转方向,我们需要把它连接到微控制器上的一个数字管脚上,或者在我们的例子中,我将把它连接到我的Arduino板的4号管脚上。

我们用Step引脚控制马达,每发送一个脉冲到这个引脚,马达就移动一步。所以这意味着我们不需要任何复杂的编程,相序表,频率控制线等等,因为A4988驱动器的内置转换器处理一切。这里我们还需要指出,这2个引脚没有拉到任何电压内部,所以我们的程序里不应让这2个引脚浮空。

下一个是休眠引脚和逻辑低将电路板置于休眠模式,以便在电机不使用时将功耗降至最低。

接下来,复位引脚将转换器设置为预定义的主状态。从A4988数据表中的这些数据可以看出这种主状态或主微步位置。所以这些是马达启动的初始位置,它们根据微步分辨率的不同而不同。如果该引脚的输入状态为逻辑低,则所有阶跃输入将被忽略。复位引脚是一个浮动引脚,因此如果我们不打算在我们的程序中控制它,我们需要将其连接到休眠引脚,以使其处于高位并启用电路板。

如何用4988驱动器和Arduino控制步进电机(如何用4988驱动器和Arduino控制步进电机)(4)

接下来的3个引脚(MS1、MS2和MS3)用于根据上述真值表选择五步分辨率中的一个。这些引脚有内部下拉电阻,所以如果我们让它们断开,电路板将以全步进模式运行。

最后一个,使能管脚用于打开或关闭FET输出。所以逻辑高将保持输出关闭。

本Arduino教程所需的组件

步进电机(NEMA17)

A4988步进驱动器

12V 2A适配器

电源插座

Arduino板

试验板和跨接导线

电路原理图

这是完整的电路图。我将在全步进模式下使用驱动器,这样我将保持3个MS引脚断开连接,只需将驱动器的方向和步进引脚连接到Arduino板上的3号和4号引脚,以及接地和5伏引脚,为主板供电。此外,我将使用100µF电容器去耦,12V,1.5A适配器为电机供电。我将使用NEMA 17双极步进电机,其导线A和C将连接到插脚1A和1B,B和D导线连接到2A和2B引脚。

如何用4988驱动器和Arduino控制步进电机(如何用4988驱动器和Arduino控制步进电机)(5)

限流

在我们连接马达之前,我们应该调整驱动器的电流限制,这样我们就可以确定电流在马达的电流限制之内。我们可以通过使用板上的电位计调整参考电压,并考虑以下等式:

Current Limit = VRef x 2

如何用4988驱动器和Arduino控制步进电机(如何用4988驱动器和Arduino控制步进电机)(6)

然而,这个等式并不总是正确的,因为A4988驱动板有不同的制造商。在这里,我的例子是,调整了电位计的参考电压。所以电流限制值应该是0.6*2,等于1.2A。

如何用4988驱动器和Arduino控制步进电机(如何用4988驱动器和Arduino控制步进电机)(7)

因为我在全步进模式下使用驱动器,根据A4988数据表,在这种模式下,绕组电流只能达到电流极限的70%,1.2A*0.7等于0.84A,为了检查这一点,我上传了一个简单的代码,将连续逻辑高电平发送到步进管脚(以便我们更好地注意电流),并将我的仪表与电机的一个绕组串联并通电。我得到的是0.5A,这意味着这个方程对我的情况是不正确的。

如何用4988驱动器和Arduino控制步进电机(如何用4988驱动器和Arduino控制步进电机)(8)

Arduino和A4988代码

下面是一个示例代码。首先,我们必须定义步进和方向引脚。在我们的例子中,它们是Arduino板上的3号和4号管脚,它们被命名为stepPin和dirPin,设置部分我们必须将它们定义为输出。

/* Simple Stepper Motor Control Exaple Code

*

* by Dejan Nedelkovski, www.HowToMechatronics.com

*

*/

// defines pins numbers

constintstepPin = 3;

constintdirPin = 4;

voidsetup(){

// Sets the two pins as Outputs

pinMode(stepPin,OUTPUT);

pinMode(dirPin,OUTPUT);

}

voidloop(){

digitalWrite(dirPin,HIGH);// Enables the motor to move in a particular direction

// Makes 200 pulses for making one full cycle rotation

for(intx = 0; x<200; x ){

digitalWrite(stepPin,HIGH);

delayMicroseconds(500);

digitalWrite(stepPin,LOW);

delayMicroseconds(500);

}

delay(1000);// One second delay

digitalWrite(dirPin,LOW);//Changes the rotations direction

// Makes 400 pulses for making two full cycle rotation

for(intx = 0; x<400; x ){

digitalWrite(stepPin,HIGH);

delayMicroseconds(500);

digitalWrite(stepPin,LOW);

delayMicroseconds(500);

}

delay(1000);

}

在回路部分,我们首先将方向销设置为高状态,这将使电机朝特定方向移动。现在使用这个循环,我们将使电机进行一个完整的循环旋转。由于驱动器设置为全步进模式,我们的步进电机有1.8度的步进角,即200步,我们需要发送200个脉冲到步进引脚进行一个完整周期的旋转。因此for循环将有200次迭代,每次它都会将步进引脚设置为高,然后低状态,以产生脉冲。在每一次数字写入之间,我们需要增加一些延迟,这将决定电动机的速度。

在这个完整循环旋转之后,我们将延迟一秒钟,然后通过将dirPin设置为低状态来更改旋转方向,现在使用400次迭代的循环进行2次完整循环旋转。最后还有一秒钟的延迟。现在让我们上传代码,看看它将如何工作。

我在本教程中又举了一个例子,我用电位计控制电机的速度。以下是该示例的源代码:

/* Simple Stepper Motor Control Exaple Code

*

* by Dejan Nedelkovski, www.HowToMechatronics.com

*

*/

// Defines pins numbers

constintstepPin = 3;

constintdirPin = 4;

intcustomDelay,customDelayMapped;// Defines variables

voidsetup(){

// Sets the two pins as Outputs

pinMode(stepPin,OUTPUT);

pinMode(dirPin,OUTPUT);

digitalWrite(dirPin,HIGH);//Enables the motor to move in a particular direction

}

voidloop(){

customDelayMapped =speedUp();// Gets custom delay values from the custom speedUp function

// Makes pules with custom delay, depending on the Potentiometer, from which the speed of the motor depends

digitalWrite(stepPin, HIGH);

delayMicroseconds(customDelayMapped);

digitalWrite(stepPin, LOW);

delayMicroseconds(customDelayMapped);

}

// Function for reading the Potentiometer

intspeedUp(){

intcustomDelay =analogRead(A0);// Reads the potentiometer

intnewCustom =map(customDelay, 0, 1023, 300,4000);// Convrests the read values of the potentiometer from 0 to 1023 into desireded delay values (300 to 4000)

returnnewCustom;

}

,