|
在本篇文章中,我们将学习如何使用A4988步进驱动器和Arduino开发板控制步进电机。
概述 A4988是一款用于控制双极步进电机的微步进驱动器,内置转换器,易于操作。这意味着我们可以用控制器的2个引脚来控制步进电机,一个用于控制旋转方向,另一个用于控制步数。
驱动器提供五种不同的步数分辨率:全步、半步、四分之一步、八分之一步和十六分之一步。此外,它还有一个用于调节电流输出的电位器、过温热关断和交叉电流保护。
其逻辑电压为3至5.5 V,如果提供良好的额外冷却设备,则每相的最大电流为2A,如果没有散热器或冷却片,可以提供每相1A的连续电流。
A4988步进驱动器引脚 现在让我们仔细看看驱动器的引出引脚,以及将它与步进电机和控制器连接起来。因此,我们将从右侧按钮边上的驱动器供电的2个引脚开始 - VDD和接地引脚,我们需要将它们连接到3到5.5 V电源,本例中,指的是是我们的控制器,Arduino开发部提供5 V电源。以下4个引脚用于连接电机。 1A和1B引脚将连接到电机的一个线圈,2A和2B引脚连接到电机的另一个线圈。为了给电机供电,我们使用接下来的2个引脚,接地和VMOT,它们需要将它们连接到8到35 V的电源,我们还需要使用至少47μF的去耦电容来保护驱动板免受电压尖峰的影响。
接下来的两个引脚Step和Direction是我们实际用于控制电机运动的引脚。方向Direction引脚控制电机的旋转方向,我们需要将其连接到微控制器上的一个数字引脚,示例中,我将它连接到Arduino开发板的引脚4。
使用Step引脚,我们控制电机的微步,并且每个脉冲发送到该引脚,电机移动一步。这意味着我们不需要任何复杂的编程、相序、频率控制线等,因为A4988驱动器的内置转换器可以处理所有事情。在这里我们还需要提到的是,这两个引脚内部没有被拉到任何电压,因此我们不应该将它们悬浮在程序中。
接下来是SLEEP引脚,在不使用电机时,逻辑低电平使电路板处于休眠模式,以便将功耗降至最低。
接下来,RESET引脚将转换器设置为预定义的Home状态。从A4988数据手册的这些图中可以看到该Home状态或Home Microstep Position。因此,这些是电机启动位置的初始位置,它们根据微步分辨率而不同。如果该引脚的输入状态为逻辑低电平,则所有STEP输入都将被忽略。复位引脚是一个浮动引脚,因此如果我们无需在程序中对其进行控制,我们需要将其连接到SLEEP引脚,以使将其置为高电平并启用电路板。
接下来的3个引脚(MS1、MS2和MS3)用于根据上述真值表选择五步分辨率中的一个。这些引脚具有内部下拉电阻,因此如果我们将它们断开,则电路板将以全步模式工作。 最后一个,ENABLE引脚用于打开或关闭FET输出。因此逻辑高电平将使输出保持禁用状态。
所需的组件 本篇文章所需的组件如下: ● 步进电机(NEMA17) ● A4988步进驱动器 ● 12V 2A适配器 ● Arduino开发板 ● 面包板和跳线
电路原理图 以下是完整的电路原理图。我将在全步模式下使用驱动器,这样我就会断开3个MS引脚,只需将驱动器的Direction和Step引脚连接到Arduino板上的3号和4号引脚,以及用于为电路板供电的接地和5 V引脚。我还将使用一个100μF电容进行去耦,并使用12V/1.5A适配器为电机供电。我将使用NEMA 17双极步进电机,其导线A和C将连接到引脚1A和1B,B和D导线连接到2A和2B引脚。
电流极限 在连接电机之前,我们应该调整驱动器的电流极限值,以确保电流在电机的电流极限值范围内。我们可以通过使用电路板上的电位器调整参考电压并考虑以下公式来实现: 限制电流= VRef x 2
然而,这个等式并不总是正确的,因为A4988驱动板有不同的制造商。示例中:我调整了电位器并测量了0.6V参考电压。所以电流限制应该是0.6 * 2的值,等于1.2 A.
现在因为我在完全步进模式下使用驱动器,并且在此模式下根据A4988数据表,绕组电流仅可达到限制电流的70%,1.2A * 0.7将等于0.84A。为了检查这一点,我上传了一个简单的代码,它将连续逻辑高电平发送到Step引脚并将我的电表与电机的一个绕组串联连接并为其供电。我得到的是0.5A,这意味着我的示例不正确。
Arduino和A4988代码 以下是示例代码。首先,我们必须定义步进和方向引脚。在我们的例子中,它们是Arduino开发上的3号和4号引脚,它们被命名为stepPin和dirPin,我们必须将它们定义为输出。 - /* 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);
- }
复制代码
首先,在loop部分,我们将方向引脚设置为高电平,使电机能够沿特定方向移动。 现在使用这个for循环,我们将使电机进行一个完整的循环旋转。 由于驱动器设置为全步模式且我们的步进电机具有1.8度步进角或200步,我们需要向步进引脚发送200个脉冲以进行一个完整循环旋转。 因此,for循环将有200次迭代,每次将Step引脚设置为高电平然后为低电平状态以产生脉冲。 在每个digitalWrite之间我们需要添加一些延迟,电机的速度将取决于此延迟。
在完整循环旋转之后,我们将进行一秒延迟,然后通过将dirPin设置为低状态来改变旋转方向,现在使用400次迭代的循环进行2次完整循环旋转。 最后还有一个延迟。 现在让我们上传代码,看看它是如何工作的。 |