如何使用 A4988 驱动器和 Arduino 控制步进电机
在本 Arduino 教程中,我们将学习如何使用 A4988 步进驱动器控制步进电机。您可以观看以下视频或阅读下面的书面教程。
A4988 是一款微步进驱动器,用于控制双极步进电机,内置转换器,便于操作。这意味着我们可以通过控制器的 2 个引脚来控制步进电机,或者一个用于控制旋转方向,另一个用于控制步进。
Driver 提供五种不同的步进分辨率:全步、半步、四分之一步、八步和十六步。此外,它还带有一个电位器,用于调节电流输出、过温热关断和交叉电流保护。
其逻辑电压为 3 至 5.5 V,如果提供良好的附加冷却,则每相的最大电流为 2A,或者在没有散热器或冷却的情况下每相的最大电流为 1A。
现在让我们仔细看看驱动器的引脚排列并将其与步进电机和控制器连接起来。因此,我们将从按钮右侧的 2 个引脚开始为驱动器供电,VDD 和接地引脚,我们需要将它们连接到 3 到 5.5 V 的电源,在我们的例子中,这将是我们的控制器,Arduino板将提供 5 V。以下 4 个引脚用于连接电机。 1A 和 1B 引脚将连接到电机的一个线圈,2A 和 2B 引脚将连接到电机的另一个线圈。为了给电机供电,我们使用接下来的 2 个引脚,接地和 VMOT,我们需要将它们连接到 8 到 35 V 的电源,我们还需要使用至少 47 µF 的去耦电容器来保护驱动板免受电压尖峰的影响。
接下来的两个 2 引脚,Step 和 Direction 是我们实际用于控制电机运动的引脚。方向引脚控制电机的旋转方向,我们需要将其连接到微控制器上的一个数字引脚,或者在我们的例子中,我将其连接到我的 Arduino 板的 4 号引脚。
使用 Step 引脚,我们控制电机的微步,每个脉冲发送到该引脚,电机移动一步。这意味着我们不需要任何复杂的编程、相序表、频率控制线等,因为 A4988 驱动器的内置转换器可以处理一切。这里还需要提一下,这两个引脚内部没有拉到任何电压,所以我们不应该让它们在我们的程序中悬空。
接下来是 SLEEP 引脚,逻辑低电平使电路板进入睡眠模式,以便在电机不使用时最大限度地降低功耗。
接下来,RESET 引脚将转换器设置为预定义的 Home 状态。从 A4988 数据表中的这些图中可以看到该起始状态或起始微步位置。所以这些是电机启动的初始位置,它们根据微步分辨率而有所不同。如果该引脚的输入状态为逻辑低电平,则所有 STEP 输入都将被忽略。 Reset 引脚是一个浮动引脚,因此如果我们不打算在程序中控制它,我们需要将其连接到 SLEEP 引脚,以便将其拉高并启用电路板。
接下来的 3 个引脚(MS1、MS2 和 MS3)用于根据上述真值表选择五个步进分辨率之一。这些引脚具有内部下拉电阻,因此如果我们将它们断开,电路板将在全步模式下运行。
最后一个,ENABLE 引脚用于打开或关闭 FET 输出。所以逻辑高电平将使输出保持禁用状态。
您可以从以下任何网站获取组件:
这是完整的电路原理图。我将在全步模式下使用驱动器,因此我将断开 3 个 MS 引脚,并将驱动器的方向和步进引脚连接到 Arduino 板上的引脚 3 和 4,以及接地和 5 V为电路板供电的引脚。此外,我将使用 100µF 电容器进行去耦,并使用 12V、1.5A 适配器为电机供电。我将使用 NEMA 17 双极步进电机,其线 A 和 C 将连接到引脚 1A 和 1B,B 和 D 线连接到 2A 和 2B 引脚。
在我们连接电机之前,我们应该调整驱动器的电流限制,以确保电流在电机的电流限制范围内。我们可以通过使用板上的电位器调整参考电压并考虑以下等式来做到这一点:
然而,这个等式并不总是正确的,因为 A4988 驱动板有不同的制造商。这是我的案例的演示:我调整了电位器并测量了 0.6V 参考电压。所以限流应该是0.6*2的那个值,等于1.2A。
现在因为我在全步模式下使用驱动器,并且根据 A4988 数据表在此模式下绕组电流只能达到电流限制的 70%,所以 1.2A*0.7 将等于 0.84A。为了检查这一点,我上传了一个简单的代码,它将连续逻辑高电平发送到 Step 引脚(以便我们更好地注意到电流)并将我的仪表与电机的一个绕组串联并通电。我得到的是 0.5A,这意味着该等式不适合我的情况。
这是一个示例代码。首先,我们必须定义 Step 和 Direction 引脚。在我们的例子中,它们是 Arduino 板上的 3 号和 4 号引脚,它们被命名为 stepPin 和 dirPin,我们必须在设置部分将它们定义为输出。
在循环部分,我们首先将方向引脚设置为高状态,这将使电机能够沿特定方向移动。现在使用这个 for 循环,我们将使电机旋转一整圈。由于驱动器设置为全步模式,而我们的步进电机有 1.8 度的步距角,或 200 步,我们需要向步长引脚发送 200 个脉冲以进行一个完整的循环旋转。因此 for 循环将进行 200 次迭代,每次它会将 Step 引脚设置为高电平,然后设置为低电平以产生脉冲。在每个 digitalWrite 之间,我们需要添加一些延迟,这将取决于电机的速度。
在这个完整的循环旋转之后,我们将延迟一秒钟,然后通过将 dirPin 设置为低状态来改变旋转方向,现在使用这个 400 次迭代的循环进行 2 个完整的循环旋转。最后还有一秒钟的延迟。现在让我们上传代码,看看它是如何工作的。
我为本教程又做了一个例子,我使用电位器控制电机的速度。这是该示例的源代码:概览
A4988 步进驱动器引脚
本 Arduino 教程所需的组件
电路原理图
A4988 电流限制
Arduino 和 A4988 代码
/* Simple Stepper Motor Control Exaple Code
*
* by Dejan Nedelkovski, www.HowToMechatronics.com
*
*/
// defines pins numbers
const int stepPin = 3;
const int dirPin = 4;
void setup() {
// Sets the two pins as Outputs
pinMode(stepPin,OUTPUT);
pinMode(dirPin,OUTPUT);
}
void loop() {
digitalWrite(dirPin,HIGH); // Enables the motor to move in a particular direction
// Makes 200 pulses for making one full cycle rotation
for(int x = 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(int x = 0; x < 400; x++) {
digitalWrite(stepPin,HIGH);
delayMicroseconds(500);
digitalWrite(stepPin,LOW);
delayMicroseconds(500);
}
delay(1000);
}
Code language: Arduino (arduino)/* Simple Stepper Motor Control Exaple Code
*
* by Dejan Nedelkovski, www.HowToMechatronics.com
*
*/
// Defines pins numbers
const int stepPin = 3;
const int dirPin = 4;
int customDelay,customDelayMapped; // Defines variables
void setup() {
// Sets the two pins as Outputs
pinMode(stepPin,OUTPUT);
pinMode(dirPin,OUTPUT);
digitalWrite(dirPin,HIGH); //Enables the motor to move in a particular direction
}
void loop() {
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
int speedUp() {
int customDelay = analogRead(A0); // Reads the potentiometer
int newCustom = map(customDelay, 0, 1023, 300,4000); // Convrests the read values of the potentiometer from 0 to 1023 into desireded delay values (300 to 4000)
return newCustom;
}
Code language: Arduino (arduino)
制造工艺