一板网电子技术论坛

风筝
发表于: 2022-8-23 17:41:08 | 显示全部楼层

如果您打算构建自己的3D打印机或CNC机器,那么您将需要控制大量步进电机。并且只有一个Arduino开发板来控制所有这些可能需要大量的处理时间,并且没有为其他任何事情留出空间;除非您使用独立的专用步进电机驱动器 - DRV8825。


它可以控制双极步进电机的速度和旋转方向,只需两个引脚。那是多么酷啊!


DRV8825步进电机驱动芯片

该模块的主要组件是德州仪器 (TI) 的微步进驱动芯片 - DRV8825。它的尺寸更小(只有0.8 英寸 × 0.6英寸),但仍然很有冲击力。

DRV8825-Stepper-Motor-Driver-Module.jpg


DRV8825步进电机驱动器具有高达45V的输出驱动能力。它可以让您以每个线圈高达2.5A的输出电流控制双极步进电机,例如NEMA 17。


驱动器内置翻译器,操作简单。这将控制引脚的数量减少到只有两个,一个用于控制步进速度,另一个用于控制旋转方向。


该驱动程序提供六种不同的步进分辨率,例如全步、半步、四分之一步、八分之一、十六分之一和三十分之一。


技术规格

以下是主要的规格参数:

电机输出电压
8.2V – 45V
逻辑电压
内置3.3V输出
每相连续电流
1A
每相最大电流
2.5A
微步分辨率
全、1/2、1/4、1/8 和 1/16

有关详细信息,请参阅下面的数据表:DRV8825数据手册


DRV8825电机驱动器引脚分配

DRV8825驱动器共有16个引脚将其连接到外界。连接如下:

DRV8825-Stepper-Motor-Driver-Pinout.jpg


让我们一一熟悉所有引脚。


电源引脚

与其他典型的步进电机驱动器不同,DRV8825只有一组电源连接。

DRV8825-Stepper-Motor-Driver-Motor-Power-Supply-Pins.jpg


VMOTGND MOT 为电机供电。您可以将8.2V至45V之间的任何输入电压连接到此引脚。


该模块没有任何逻辑电源引脚;因为DRV8825使用内部3V3稳压器从电机电源中获取电力。但是,您应该将微控制器的接地连接到GND LOGIC引脚。


根据数据表,电机电源需要一个合适的去耦电容器靠近电路板才能维持 4A。


微步选择引脚

DRV8825驱动器通过将单个步进分成更小的步进来实现微步进。这是通过用中等电流水平激励线圈来实现的。


例如,如果您选择以四分之一步模式驱动 NEMA 17(步距角为 1.8° 或 200 步/转),则电机每转将产生800微步。

DRV8825-Stepper-Motor-Driver-Microstep-Selection-Pins.jpg


DRV8825驱动器具有三个步长(分辨率)选择器输入,即M0M1M2。通过为这些引脚设置适当的逻辑电平,我们可以将电机设置为六步分辨率之一。


这三个微步选择引脚被内部下拉电阻拉低,因此如果不连接它们,电机将在全步模式下运行。


控制输入​​引脚

DRV8825有两个控制输入 - STEP 和 DIR。

DRV8825-Stepper-Motor-Driver-Motor-Control-Pins.jpg


STEP 输入控制电机的微步。发送到此引脚的每个 HIGH 脉冲根据微步选择引脚确定的微步数驱动电机。脉冲越快,电机旋转得越快。

DIR 输入控制电机的旋转方向。将其拉高驱动电机顺时针,拉低驱动电机逆时针。


如果您希望电机仅向一个方向旋转,您可以相应地将 DIR 直接连接到 VCC 或 GND。


用于控制电源状态的引脚

DRV8825 具有三个独立的输入来控制其电源状态 - EN、RST 和 SLP。

DRV8825-Stepper-Motor-Driver-Power-States-Control-Pins.jpg


EN 引脚为低电平有效输入。当该引脚被拉低时,DRV8825 驱动器被启用。默认情况下,此引脚被拉低,因此驱动器始终处于启用状态,除非您将其拉高。

SLP 引脚为低电平有效输入。将此引脚拉低会使驱动器进入睡眠模式,从而最大限度地降低功耗。您可以使用它,特别是在不使用电机以节省电力时。

RST 也是低电平有效输入。当此引脚拉低时,所有 STEP 输入都将被忽略。它还通过将内部转换器设置为预定义的主状态来重置驱动程序。初始状态基本上是电机启动的初始位置,它根据微步分辨率而变化。


故障检测引脚

DRV8825还具有故障输出,只要H桥FET由于过流保护或热关断而被禁用,该输出就会驱动为低电平。

DRV8825-Stepper-Motor-Driver-Fault-Detection-Pins.jpg


实际上,Fault引脚与 SLEEP 引脚短路,因此,每当Fault引脚被驱动为低电平时,整个芯片都被禁用。并且它一直处于禁用状态,直到RESET或电机电压VMOT被移除并重新应用。


输出引脚

DRV8825 电机驱动器的输出通道通过引脚 B2、B1、A1 和 A2 引脚断开到模块的一侧。

DRV8825-Stepper-Motor-Driver-Motor-Connections.jpg


您可以将任何中小型双极步进电机连接到这些引脚。


模块上的每个输出引脚可为电机提供高达 2.5A 的电流。然而,提供给电机的电流量取决于系统的电源、冷却系统和电流限制设置。


冷却系统 - 散热器

DRV8825驱动器IC的过度功耗会导致温度升高,如果超出其容量,可能会损坏芯片。


尽管DRV8825驱动器的每个线圈的最大额定电流为2.5A,但该芯片只能提供每个线圈约1.5A的电流而不会过热。要使每个线圈获得超过1.5A的电流,需要使用散热器或其他冷却方法。

DRV8825-Stepper-Motor-Driver-Heatsink.jpg


DRV8825驱动器通常带有散热器。建议在使用前安装它。


电流极限

在运行电机之前,您必须进行小幅调整。您需要限制流过步进线圈的最大电流,并防止其超过电机的额定电流。

DRV8825-Stepper-Motor-Driver-Current-Limiting-Potentiometer.jpg


为了设置电流极限,DRV8825驱动器上提供了一个小型微调电位器。进行此调整有两种方法:

方法一:

在这种方法中,电流极限值是通过测量“ref”引脚上的电压 (Vref) 来确定的。

1.  查看步进电机的数据手册。记下它的额定电流。在我们的例子中,使用的是NEMA 17 200steps/rev,12V 350mA。

2.  断开三个微步选择引脚将驱动器置于全步模式。

3.  将电机保持在固定位置,无需计时STEP输入。

4.  调整时测量金属微调电位器上的电压 (Vref)。

5.  使用公式调整 Vref 电压:Vref = 电流限制 / 2


例如,如果您的电机额定电流为350mA,可以将参考电压调整为0.175V。

Measuring-Vref-Voltage-Setting-Current-Limit-for-DRV8825-with-Multimeter.jpg


方法二:

在这种方法中,电流极限值是通过测量流过线圈的电流来确定的。

1.  查看步进电机的数据手册。记下它的额定电流。在我们的例子中,使用的是NEMA 17 200steps/rev,12V 350mA。

2.  断开三个微步选择引脚将驱动器置于全步模式。

3.  将电机保持在固定位置,无需计时 STEP 输入。

4.  将电流表与步进电机上的一个线圈串联,并测量实际流动的电流。

5.  拿一把小螺丝刀,调整限流电位器,直到达到额定电流。

Measuring-Coil-Current-Setting-Current-Limit-for-DRV8825-with-Multimeter.jpg

跳转到指定楼层
风筝
发表于: 2022-8-23 17:48:25 | 显示全部楼层

将DRV8825步进电机驱动器连接到Arduino开发板

现在我们了解了有关驱动程序的所有信息,让我们将其连接到Arduino开发板。


连接非常简单。首先将RST引脚连接到相邻的SLP/SLEEP引脚,并将两者都连接到Arduino上的5V,以保持驱动器启用。


将GND LOGIC引脚连接到Arduino的接地引脚。 将DIR和STEP输入引脚连接到Arduino的#2和#3数字输出引脚。


将步进电机连接到B2、B1、A1和A2引脚。 实际上,DRV8825的布局很方便,可以匹配多个双极电机上的4针连接器,所以这应该不是问题。


请记住保持微步选择引脚断开连接,以便在全步模式下运行电机。


最后将电机电源连接到VMOT和GND MOT引脚。 请记住在电机电源引脚上放置一个100μF的大去耦电解电容,以避免出现较大的电压尖峰。

Wiring-Nema-17-Stepper-Motor-to-DRV8825-driver-Arduino.jpg



Arduino代码 - 不使用库

下面的草图将让您全面了解如何使用DRV8825步进电机驱动器控制双极步进电机的速度和旋转方向,并可作为更多实际实验和项目的基础。

  1. // Define pin connections & motor's steps per revolution
  2. const int dirPin = 2;
  3. const int stepPin = 3;
  4. const int stepsPerRevolution = 200;

  5. void setup()
  6. {
  7.         // Declare pins as Outputs
  8.         pinMode(stepPin, OUTPUT);
  9.         pinMode(dirPin, OUTPUT);
  10. }
  11. void loop()
  12. {
  13.         // Set motor direction clockwise
  14.         digitalWrite(dirPin, HIGH);

  15.         // Spin motor slowly
  16.         for(int x = 0; x < stepsPerRevolution; x++)
  17.         {
  18.                 digitalWrite(stepPin, HIGH);
  19.                 delayMicroseconds(2000);
  20.                 digitalWrite(stepPin, LOW);
  21.                 delayMicroseconds(2000);
  22.         }
  23.         delay(1000); // Wait a second
  24.         
  25.         // Set motor direction counterclockwise
  26.         digitalWrite(dirPin, LOW);

  27.         // Spin motor quickly
  28.         for(int x = 0; x < stepsPerRevolution; x++)
  29.         {
  30.                 digitalWrite(stepPin, HIGH);
  31.                 delayMicroseconds(1000);
  32.                 digitalWrite(stepPin, LOW);
  33.                 delayMicroseconds(1000);
  34.         }
  35.         delay(1000); // Wait a second
  36. }
复制代码

代码说明

草图首先定义DRV8825的STEP和DIR引脚连接到的Arduino引脚。还定义了一个名为stepsPerRevolution的变量。您可以设置它以匹配您的步进电机规格。

  1. const int dirPin = 2;
  2. const int stepPin = 3;
  3. const int stepsPerRevolution = 200;
复制代码

setup()函数中,所有电机控制引脚都声明为数字输出。

  1. pinMode(stepPin, OUTPUT);
  2. pinMode(dirPin, OUTPUT);
复制代码

loop()函数中,电机以一秒的间隔顺时针缓慢旋转,然后逆时针快速旋转。


控制旋转方向:将DIR引脚设置为HIGH或LOW以控制电机的旋转方向。高电平输入将使电机顺时针转动,低电平输入将使其逆时针转动。

  1. digitalWrite(dirPin, HIGH);
复制代码

控制速度:电机的速度由发送到STEP引脚的脉冲频率决定。脉冲越高,电机运行得越快。脉冲只不过是将输出拉高,稍等片刻,然后将其拉低并再次等待。通过更改两个脉冲之间的延迟,您可以更改这些脉冲的频率以及电机的速度。

  1. for(int x = 0; x < stepsPerRevolution; x++) {
  2.         digitalWrite(stepPin, HIGH);
  3.         delayMicroseconds(1000);
  4.         digitalWrite(stepPin, LOW);
  5.         delayMicroseconds(1000);
  6. }
复制代码

回复

使用道具 举报

风筝
发表于: 2022-8-23 17:51:19 | 显示全部楼层

Arduino代码 – 使用AccelStepper库

在没有库的情况下控制步进器非常适合简单的单电机应用。但是当你想控制多个步进器时,你需要一个库。


因此,对于我们的下一个实验,我们将使用一个名为AccelStepper库的高级步进电机库。它支持:

●    加速和减速。

●    多个同步步进器,每个步进器具有独立的并发步进。


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


安装

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

Manage-Libraries.jpg



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

Installing-AccelStepper-Library.jpg



Arduino代码

这是一个简单的草图,它在一个方向上加速步进电机,然后减速停止。电机转一圈后,它就会改变旋转方向并一遍又一遍地继续这样做。

  1. // Include the AccelStepper Library
  2. #include <AccelStepper.h>

  3. // Define pin connections
  4. const int dirPin = 2;
  5. const int stepPin = 3;

  6. // Define motor interface type
  7. #define motorInterfaceType 1

  8. // Creates an instance
  9. AccelStepper myStepper(motorInterfaceType, stepPin, dirPin);

  10. void setup() {
  11.         // set the maximum speed, acceleration factor,
  12.         // initial speed and the target position
  13.         myStepper.setMaxSpeed(1000);
  14.         myStepper.setAcceleration(50);
  15.         myStepper.setSpeed(200);
  16.         myStepper.moveTo(200);
  17. }

  18. void loop() {
  19.         // Change direction once the motor reaches target position
  20.         if (myStepper.distanceToGo() == 0)
  21.                 myStepper.moveTo(-myStepper.currentPosition());

  22.         // Move the motor one step
  23.         myStepper.run();
  24. }
复制代码

代码说明

草图首先包含新安装的AccelStepper库。

  1. #include <AccelStepper.h>
复制代码

首先定义DRV8825的STEP和DIR引脚连接到的Arduino引脚。 motorInterfaceType也设置为 1(1 表示带有步进和方向引脚的外部步进驱动器)。

  1. // Define pin connections
  2. const int dirPin = 2;
  3. const int stepPin = 3;

  4. // Define motor interface type
  5. #define motorInterfaceType 1
复制代码

在此之后,将创建一个名为myStepper的步进电机库实例。

  1. AccelStepper myStepper(motorInterfaceType, stepPin, dirPin);
复制代码

setup()函数中,首先将电机的最大速度设置为1000。然后为电机设置一个加速因子,为步进电机的运动添加加速和减速。


在此之后,常规速度设置为200。由于NEMA 17每转需要200步,因此电机的步数也设置为200。

  1. void setup() {
  2.         myStepper.setMaxSpeed(1000);
  3.         myStepper.setAcceleration(50);
  4.         myStepper.setSpeed(200);
  5.         myStepper.moveTo(200);
  6. }
复制代码

loop()函数中,If语句用于检查电机需要行驶多远(通过读取distanceToGo属性),直到它到达目标位置(由 moveTo 设置)。一旦 distanceToGo 达到零,通过将moveTo位置更改为当前位置的负值,电机将沿相反方向旋转。


现在在循环的底部,您将看到调用了run()函数。这是最重要的函数,因为在执行此函数之前步进器不会移动。

  1. void loop() {
  2.         if (myStepper.distanceToGo() == 0)
  3.                 myStepper.moveTo(-myStepper.currentPosition());

  4.         myStepper.run();
  5. }
复制代码

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 675 | 回复: 1398



手机版|

GMT+8, 2022-10-7 08:18 , Processed in 0.028628 second(s), 7 queries , Gzip On, MemCache On. Powered by Discuz! X3.4

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表