【常见直流电机驱动模块与arduino使用最全教程】

常见直流电机驱动模块与arduino使用最全教程

    • 介绍
    • 选择直流电机驱动器
    • 直流电机规格
      • 工作电压
      • 失速电流
    • H 桥电机驱动器
    • 带 PWM 的速度控制
    • 用微控制器控制速度和方向
    • 中小型电机驱动器
    • L298N 双 H 桥
      • 介绍
      • L298N Arduino 连接图
      • L298N Arduino 代码
    • TB6612FNG 双 H 桥
      • 介绍
      • TB6612FNG Arduino 连接
      • TB6612FNG Arduino 代码
    • DRV8871 单 H 桥
      • 介绍
      • DRV8871 Arduino 连接
      • DRV8871 Arduino 代码
    • MX1508 双 H 桥
      • 介绍
      • MX1508 Arduino 连接
      • MX1508 Arduino 代码
    • 大型电机驱动器
    • DBH-12 双 H 桥
      • 介绍
      • DBH-12 Arduino 连接
      • DBH-12 Arduino 代码
    • IBT-2 (BTS7960) 单 H 桥
      • 介绍
      • IBT-2 (BTS7960) Arduino 连接
      • IBT-2 (BTS7960) Arduino 代码
    • MD25HV 单 H 桥和控制器
      • 介绍
      • MD25HV Arduino 连接
    • 结论

介绍

驱动直流电机是基于微控制器设计的一种非常常见的应用,电机驱动器的选择可能非常重要。
如果您的唯一要求是在不考虑控制速度或方向的情况下打开和关闭电机,那么继电器或 MOSFET 就可以解决问题。但在大多数应用中,您会希望能够调整电机参数,为此,您需要一个电机驱动器。
我们今天将研究七种不同的电机驱动器,用于控制各种不同尺寸的电机。其中一些驱动器是双驱动器,换句话说,它们驱动一对电机,而其他驱动器仅用于单个电机。
所有这些驱动程序都可以由任何微控制器和可能是大多数微型计算机驱动。我们将要研究的驱动程序之一也有一个内置控制器,因此您甚至可能不需要微控制器。
我将使用 Arduino Uno 进行这些演示,但代码可以轻松移植到任何其他微控制器。

选择直流电机驱动器

许多 Arduino 设计都采用老式的忠实 L298N 双 H 桥模块。然而,这不一定是最好的解决方案,事实上,它很少是,因为更高效的驱动程序可以取代它。它也不适用于大型或非常小的电机。

但为您的项目挑选电机驱动器真的不应该那么难,您需要做的就是将驱动器与您的电机规格相匹配

直流电机规格

如果您足够幸运,拥有直流电机的数据表,您会注意到这些设备具有多种规格。我们可以将这些规格分为两大类:

机械的
电气
机械规格包括电机尺寸、安装方法、最大速度和扭矩。您将选择规格适合您的项目的电机,但此选择不会直接影响您的电机驱动器选择。

电气规格是您用来选择合适的直流电机驱动器的依据。与机械规格一样,有多种电气规格需要通过,但您真正需要的只是一些基本规格:

工作电压

这是运行电机的建议电压,也是测量所有其他规格的电压。请注意,我将其称为“建议”电压,因为直流电机实际上消耗的是电流,而不是电压。

您通常可以在工作电压的一半甚至更低的电压下运行直流电机。您不应超过 30% 以上,因为这可能会导致电机消耗过多电流以使其线圈无法处理。

当前的
这可以说是最重要的电气规格,至少在选择电机驱动器方面是这样。

平均电流是电机在正常负载下运行时消耗的电流量。

理想情况下,您将选择额定电流高于电机平均电流的电机驱动器,30 – 50% 的净空是完美的。

失速电流

失速电流是电机在轴被卡住时消耗的电流量。

选择电机驱动器时,这将对应于峰值电流。理想情况下,驱动器将能够处理该电流至少一分钟。

H 桥电机驱动器

反转直流电机只需反转施加在其上的电压的极性即可。最常见的方法是使用称为“H 桥”的设计。

可以使用以下配置中的四个开关来说明 H 桥的操作:

请注意,电机位于 H 桥的“桥”部分。如果所有开关都打开,如上图所示,则电机将没有电压并保持静止。

如果我们关闭其中两个开关,则允许直流电流流过电机。注意电流的极性,以这种方式连接电机会使其顺时针旋转。

如果我们现在打开这些开关并关闭另外两个,电机将接收相反极性的直流电压,使其逆时针旋转。

自然要注意不要把两个开关关错了,把电源短路了!

在现实世界中,我们很少为 H 桥使用开关,尽管您可以使用 DPDT 开关或继电器来完成所有切换。相反,我们使用晶体管。

较旧的 H 桥设计采用双极晶体管。虽然这使得设计简单且具有成本效益,但它也有使其效率相当低的缺点。

问题在于双极型晶体管在导通时在发射极和集电极之间存在压降。对于双极功率晶体管,该压降通常为 0.7 伏。由于我们同时使用两个开关,因此总压降约为 1.4 伏。

这意味着如果您向 H 桥施加 12 伏电压,电机实际上只会接收到 10.6 伏电压。“丢失”的电压在功率晶体管中转化为热量,这就是双极设计通常需要散热器的原因。

较新的设计使用 MOSFET 来提高性能。MOSFET 漏极和源极上的电压降非常小,通常为 0.1 伏或更低,因此这是一种效率更高的设计。此外,MOSFET 设计通常可以做得更小,而且很多都不需要散热器。

带 PWM 的速度控制

我们已经了解了如何控制直流电机的方向,但我们如何调整电机速度呢?

当给电机施加额定电压时,它会以最大速度旋转。似乎只是降低电压就会降低速度,但这并不是一个好的电机控制方法。虽然速度确实会下降,但扭矩也会成比例下降。

相反,更好的方法是使用脉冲宽度调制或 PWM。

顾名思义,PWM 系统会改变驱动电机的脉冲序列的宽度。脉冲宽度越宽,电机旋转得越快。

微控制器非常适合精确计时,因此可以成为出色的 PWM 控制器。许多微控制器的 PWM 引脚数量有限,例如,在 Arduino Uno 上有六个。

用微控制器控制速度和方向

所以我们知道我们可以用 PWM 控制电机的速度,我们可以打开几个晶体管来控制电机方向。我们如何将所有这些接口连接到我们的微控制器?

我们今天要使用的七款电机驱动器可以分为三种类型的接口:

PWM + 2 控制

PWM + 2 控制方法使用 PWM 的输入加上两个输入来控制方向。

查看真值表,我们可以看到两个控制引脚的状态决定了电机轴旋转的方向。我还可以停止电机或施加“制动”。

“制动”功能施加电流以将电机轴固定到位。它对于非齿轮设计很有用,但您应该谨慎使用,因为许多电机在启动前只能承受几分钟的制动
PWM + 1 控制
这可能是最简单的方案。

在这种安排中,您有两个电机驱动器输入。一种是PWM输入,它采用PWM脉冲来控制电机速度。另一个是 DIRECTION 或 DIR 输入,一个控制方向的逻辑信号。

改变方向就像改变 DIR 输入的状态一样简单。
2脉宽调制
通过这种安排,您将需要两个都支持 PWM 的 I/O 引脚。

使用 2 PWM 控制方法的电机驱动器有两个输入,通常称为 IN1 和 IN2。在将 IN2 保持为低电平的同时向 IN1 施加 PWM 信号将使电机沿一个方向旋转。将 IN1 保持在低电平并将 PWM 应用于 IN2 将导致它以相反的方向旋转。

这是我们今天将看到的最常见的速度和方向控制方法,因为七个模块中有四个使用它。

中小型电机驱动器

我们将通过查看一些用于中小型电机的较小模块来开始我们的电机驱动器冒险。

这些对于实验者来说很常见,因为这些电机价格低廉且易于获得。

此范围内的电机用于玩具和小家电。我们在车间的那些小型“机器人汽车”项目中使用它们。

L298N 双 H 桥

介绍

L298N 可以说是周围最受欢迎的 H 桥驱动器,至少有标记。它几乎随处可见,而且非常易于使用。

这是一种基于双极晶体管的旧设计,并且由于它的产量如此之大,因此价格非常实惠。事实上,它通常以 5 包或 10 包的形式出售。

这是一个双通道驱动模块,规格如下:

查看模块,您会注意到一些螺丝端子、杜邦连接器和一些用于跳线的地方。

电机输出有两组端子,另外还有一个用于接地、电机电压和 5 伏逻辑电压的 3 端子块。


如果您不想提供 5 伏电压,可以将 L298N 模块绑起来使用内部线性稳压器来提供自己的逻辑电源。如果这样做,则电机电压需要至少为 7.5 伏。

ENA和ENB线是 Enable 线,可以通过 PWM 切换来控制电机速度。如果只是想用模块控制电机方向,可以把ENA和ENB绑成HIGH。

IN1至IN4控制电机方向,如真值表所示。

L298N Arduino 连接图

您可以通过几种不同的方式将 L298N 连接到 Arduino(或任何其他微控制器),唯一的限制是ENA和ENB需要连接到启用 PWM 的引脚。

这是我如何连接我的:
请注意,我从 Arduino 为 L298N 逻辑电路提供 5 伏电压。您可以通过在模块上安装带子以使用内部稳压器来消除此连接。请记住,要做到这一点,您的电机电源电压至少需要 7.5 伏。

L298N Arduino 代码

如果有一百种连接 L298N 的方法,那么可能有大约一千种编码方法!

下面是一个简单的代码,可以使电机沿不同的方向旋转。对于每个方向,它都会增加和减少速度。



// Motor Connections (ENA & ENB must use PWM pins)
#define IN1 9
#define IN2 8
#define IN3 7
#define IN4 6
#define ENA 10
#define ENB 5

void motorAccel() {
  for (int i = 0; i < 256; i++) {
    analogWrite(ENA, i);
    analogWrite(ENB, i);
    delay(20);
  }
}

void motorDecel() {
  for (int i = 255; i >= 0; --i) {
    analogWrite(ENA, i);
    analogWrite(ENB, i);
    delay(20);
  }
}

void setup() {

  // Set motor connections as outputs
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
  pinMode(ENA, OUTPUT);
  pinMode(ENB, OUTPUT);

  // Start with motors off
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, LOW);

  analogWrite(ENA, 0);
  analogWrite(ENB, 0);
}

void loop() {

  // Set motors forward
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, HIGH);
  digitalWrite(IN4, LOW);

  // Accelerate & decelerate both motors forward
  motorAccel();
  motorDecel();

  delay(500);

  // Set motors reverse
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, HIGH);

  // Accelerate & decelerate both motors backward
  motorAccel();
  motorDecel();

  delay(500);

  // Set motors in opposite directions (full speed)
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, HIGH);

  analogWrite(ENA, 255);
  analogWrite(ENB, 255);

  delay(500);

  analogWrite(ENA, 0);
  analogWrite(ENB, 0);

  delay(500);
}

请注意,通过使用digitalWrite函数更改 IN1、IN2、IN3 和 IN4 引脚的状态来更改方向。使用analogWrite使用 ENA 和 ENB 线控制速度。

加载草图并观察您的电机。我开了一对那些黄色的“机器人汽车”马达,效果很好。

您可能会听到电机在低速时发出“呜呜”声,这在 PWM 中很常见。它可以通过改变 PWM 频率来消除,这超出了本文的范围。

TB6612FNG 双 H 桥

介绍

TB6612FNG 是一款基于 MOSFET 的双通道 H 桥,通常可用作 L298N 的引脚对引脚替代品。

该设备具有以下规格:
TB6612FNG 是一个微型模块,尤其是与 L298N 相比时。它适用于面包板,不需要散热器。其 MOSFET 设计使其比 L298N 更高效。

您会注意到真值表与 L298N 相同,它也实现了制动功能。这应该谨慎使用,因为它会导致一些电机过热。

该模块有一个 EN(使能)输入,必须达到逻辑电压;否则,该模块将被禁用且无法工作。您可以将它连接到 VCC 或使用 I/O 引脚控制它。

TB6612FNG Arduino 连接

我使用与 L298 相同的引脚连接了我的 TB6612FNG,说明了如何用这个模块代替它的老表弟。
请注意,我已将 5 伏电压连接到电机驱动器上的 EN 线上以启用它。不要忘记这种联系!

TB6612FNG Arduino 代码

由于这取代了 L298N,我们可以使用相同的代码来驱动模块。

您还可以使用 L298N 可用的众多库之一,因为任何 L298N 代码都适用于此模块。

Andrea Lombardo的L298N 库是一个文档齐全的库,您可以直接从 Arduino IDE 安装它。它具有多种功能,可以更轻松地与 L298N 一起使用,也可以与 TB6612FNG 一起使用。


// Include the (new) library
#include <L298NX2.h>

// Pin definition
const unsigned int EN_A = 10;
const unsigned int IN1_A = 9;
const unsigned int IN2_A = 8;

const unsigned int IN1_B = 7;
const unsigned int IN2_B = 6;
const unsigned int EN_B = 5;

// Initialize both motors
L298NX2 motors(EN_A, IN1_A, IN2_A, EN_B, IN1_B, IN2_B);

// Wait for Serial Monitor to be opened
while (!Serial) {
  //do nothing
}

// Set initial speed for both motors
motors.setSpeed(80);
}

void loop() {
  // Tell both motors to go forward (may depend by your wiring)
  motors.forward();

  // Alternative method:
  // motors.run(L298N::FORWARD);

  //print the motor status in the serial monitor
  printSomeInfo();digitalWrite(IN1, HIGH);

  motors.stop();

  // Alternative method:
  // motors.run(L298N::STOP);

  printSomeInfo();

  delay(3000);

  // Change individual speeds
  motors.setSpeedA(255);
  motors.setSpeedB(90);

  // Tell motor A to go back (may depend by your wiring)
  motors.backwardA();

  // Alternative method:
  // motors.runA(L298N::BACKWARD);

  // Tell motor B to go forward (may depend by your wiring)
  motors.backwardB();

  // Alternative method:
  // motors.runB(L298N::FORWARD);

  printSomeInfo();

  delay(3000);

  // Stop
  motors.stop();

  printSomeInfo();

  // Change individual speeds
  motors.setSpeedA(90);
  motors.setSpeedB(255);

  delay(3000);
}

/*
Print some informations in Serial Monitor
*/
void printSomeInfo() {
  Serial.print("Motor A is moving = ");
  Serial.print(motors.isMovingA() ? "YES" : "NO");
  Serial.print(" at speed = ");
  Serial.println(motors.getSpeedA());
  Serial.print("Motor B is moving = ");
  Serial.print(motors.isMovingB() ? "YES" : "NO");
  Serial.print(" at speed = ");
  Serial.println(motors.getSpeedB());
}

DRV8871 单 H 桥

介绍

DRV8871 是一款单通道 H 桥。考虑到其尺寸,这种基于 MOSFET 的设计具有非常宽的电机电压范围和相当可观的电流能力。
我使用的模块来自 Adafruit。它的一侧有螺丝端子,用于连接电源和电机。另一侧是四个引脚,一个用于接地,一个用于重复电机电压输入。

另外两个引脚 IN1 和 IN2 用于控制速度和方向。该设计使用“2 PWM”输入方案,其中一个输入保持低电平,而另一个输入接收 PWM。

请注意,没有逻辑电压连接,该模块有一个板载稳压器,它从电机电压中获取逻辑电压。最小电机电压为 6.5 伏。

DRV8871 Arduino 连接

将 DRV8871 连接到 Arduino 非常简单,因为只需三根电线即可将 Arduino 连接到驱动器。
请注意,两个 I/O 引脚都必须支持 PWM。

DRV8871 Arduino 代码

这是一个非常基本的代码,可用于练习连接到 DRV8871 的电机。

/*

*/

// Motor Connections (Both must use PWM pins)
#define IN1 9
#define IN2 10

void setup() {

  // Set motor connections as outputs
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);

  // Stop motor
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
}

void loop() {

  // Accelerate forward
  digitalWrite(IN1, LOW);
  for (int i = 0; i < 255; i++) {
    analogWrite(IN2, i);
    delay(20);
  }

  delay(500);

  // Decelerate forward
  for (int i = 255; i >= 0; i--) {
    analogWrite(IN2, i);
    delay(20);
  }

  delay(500);

  // Accelerate reverse
  digitalWrite(IN2, LOW);
  for (int i = 0; i < 255; i++) {
    analogWrite(IN1, i);
    delay(20);
  }

  delay(500);

  // Decelerate reverse
  for (int i = 255; i >= 0; i--) {
    analogWrite(IN1, i);
    delay(20);
  }

  delay(500);
}

这个代码的操作很像 L298N 代码,它设置电机方向,然后加速和减速电机。然后它反转方向并再次执行。

加载草图并观察电机。这是一个非常灵敏的电机驱动器,非常易于使用,而且它的小尺寸非常适合爱好者项目。

MX1508 双 H 桥

介绍

如果你想驱动非常小的电机,你肯定不想使用 L298N。它不仅具有最低 5 伏的电机电压,而且体积庞大!
MX1508 双 H 桥是微型电机的理想选择。该设备适用于仅需要 2 伏电压的电机。

模块本身有点奇怪。它非常小,并且有连接两个电机、输入(每个电机 2 个)和电机功率。逻辑电压没有输入,因为它来自电机功率。
然而,该电路板不适合无焊面包板,因为它的引脚未与 0.1 英寸网格对齐。负极电池连接也是唯一可用的接地引脚,并且板上只有一个安装螺钉。

尽管有其特殊性,但这是一块非常适合微型电机的电路板,而且非常便宜。

MX1508 Arduino 连接

这是我将 MX1508 连接到 Arduino 的方法。
请注意,所有四个输入引脚都必须使用支持 PWM 的引脚。

在我的实验中,我使用了一个 3 伏电机并用两节 AA 电池为其供电。尽管有 3 伏电源和 5 伏逻辑,但不需要逻辑电平转换器!

MX1508 Arduino 代码

MX1508 的控制方式与 DRV8871 相同,您可以简单地使用复制 DRV8871 代码并驱动两个通道的代码。

另一种方法是使用库,您可以从库管理器中安装专为 MX1508 制作的 Arduino 库。只需按“MX1508”过滤并选择Cheng Saetern 的 MX1508 库。

该库带有两个示例。我运行了MX1508Sample一个,它只操纵其中一个电机。

#include <MX1508.h>

#define PINA 9
#define PINB 10
#define PINC 5
#define PIND 6

#define NUMPWM 2
// MX1508 schematics(in Chinese) can be found here at: http://sales.dzsc.com/486222.html
/*
 * MX1508(uint8_t pinIN1, uint8_t pinIN2, DecayMode decayMode, NumOfPwmPins numPWM);
 * DecayMode must be FAST_DECAY or SLOW_DECAY,
 * NumOfPwmPins, either use 1 or 2 pwm. 
 * I recommend using 2 pwm pins per motor so spinning motor forward and backward gives similar response.
 * if using 1 pwm pin, make sure its pinIN1, then set pinIN2 to any digital pin. I dont recommend this setting because 
 * we need to use FAST_DECAY in one direction and SLOW_DECAY for the other direction.  
 */
MX1508 motorA(PINA,PINB, FAST_DECAY, NUMPWM);
MX1508 motorB(PINC,PIND, FAST_DECAY, NUMPWM);

void setup() {
  Serial.begin(115200);
}
/*
 * Ramp up to pwm = 100, by increasing pwm by 1 every 50 millisecond. 
 * then ramp down to pwm = -100, by decreasing pwm every 50 millisecond.
 * positive value pwm results in forward direction.
 * negative value pwm results in opposite direction. 
 */
void loop() {
  // put your main code here, to run repeatedly:
  static unsigned long lastMilli = 0;
  static bool cwDirection = true; // assume initial direction(positive pwm) is clockwise
  static int pwm = 1;
  
  if(millis()-lastMilli > 50){ // every 50 millisecond
      if (cwDirection && pwm++ > 200 ) {  
        cwDirection = false;
      } else if (!cwDirection && pwm-- < -200) {
        cwDirection =  true;
      } 
    motorA.motorGo(pwm);
    motorB.motorGo(pwm);
    lastMilli = millis();
    //Serial.println(motorA.getPWM()); // we can just print pwm but just showing that member function getPWM() works.
  }

}

我修改了我的以使用两个电机,它驱动我的 3 伏电机很好——我将在下面的资源部分的代码下载中包含一个修改后的副本。

大型电机驱动器

到目前为止,我们看到的电机驱动器是小型或中型电机的绝佳选择,例如我们在小型“机器人汽车”套件中使用的电机。

为了驱动更大的电机,我们需要具有更大电流能力的驱动器。我们现在就来看看其中的几个。

DBH-12 双 H 桥

介绍

DBH-12 是一款双 H 桥驱动器,非常受欢迎,而且价格合理。这是一个带有大散热器的更大模块。

它具有令人印象深刻的电流能力,尽管它仅支持最大 14.5 伏的电机。该驱动器是一系列驱动器的一部分,其中一些驱动器支持更高的电压。

该模块的一侧有一个 6 螺钉端子,用于连接两个电机和电机电源。

电路板的另一侧是一个双排杜邦连接器,用于两个电机的输入。还提供一个输出用作电流监视器。

该模块的文档数量很少,其中一些不准确。最严重的错误之一是一些图表将 V+ 引脚显示为逻辑电压输入。这是错误的,它是电机电压输出。混淆这两者可能会花费您一个微控制器!

该模块使用相同的“2 PWM”技术来调节电机速度和方向,并且两个电机通道都有输入。Enable线内部上拉,如果接地,将禁用模块。注意它被拉高到电机电压,所以如果你想用微控制器控制它要小心。在大多数应用中,您可以忽略此引脚。

使用该模块时的一个注意事项是不要长时间超过 98% 的速度。如果您像我们使用 Arduino Uno 一样使用 8 位 PWM,这意味着将最大 PWM 值保持为 250。

DBH-12 Arduino 连接

以下是我将 DBH-12 连接到 Arduino 的方法:

请注意,如果您想更改 I/O 引脚,您需要将自己限制在具有 PWM 功能的引脚上。除了 I/O 连接之外,与 Arduino 的唯一其他连接GND。

DBH-12 Arduino 代码

我们将用于控制 DBH-12 的草图与我们用于 DRV8871 单通道驱动器的代码基本相同。由于这是一款双通道设备,我们只是将一切都加倍。



// Motor Connections (All must use PWM pins)
#define IN1A 3
#define IN1B 5
#define IN2A 6
#define IN2B 9

// Define a fixed speed - do not exceed 250
int fixedSpeed = 80;

void setup() {

  // Set motor & enable connections as outputs
  pinMode(IN1A, OUTPUT);
  pinMode(IN1B, OUTPUT);
  pinMode(IN2A, OUTPUT);
  pinMode(IN2B, OUTPUT);

  // Stop motors
  analogWrite(IN1A, 0);
  analogWrite(IN1B, 0);
  analogWrite(IN2A, 0);
  analogWrite(IN2B, 0);
}

void loop() {

  // Accelerate both forward
  digitalWrite(IN1A, LOW);
  digitalWrite(IN1B, LOW);
  for (int i = 0; i < 200; i++) {
    analogWrite(IN2A, i);
    analogWrite(IN2B, i);
    delay(20);
  }

  delay(500);

  // Decelerate both forward
  for (int i = 200; i >= 0; i--) {
    analogWrite(IN2A, i);
    analogWrite(IN2B, i);
    delay(20);
  }

  delay(500);

  // Accelerate both reverse
  digitalWrite(IN2A, LOW);
  digitalWrite(IN2B, LOW);
  for (int i = 0; i < 200; i++) {
    analogWrite(IN1A, i);
    analogWrite(IN1B, i);
    delay(20);
  }

  delay(500);

  // Decelerate both reverse
  for (int i = 200; i >= 0; i--) {
    analogWrite(IN1A, i);
    analogWrite(IN1B, i);
    delay(20);
  }

  delay(500);

  // Move in opposite directions at fixed speed
  digitalWrite(IN1A, LOW);
  digitalWrite(IN2B, LOW);
  analogWrite(IN1B, fixedSpeed);
  analogWrite(IN2A, fixedSpeed);

  delay(3000); 

  // Stop
  analogWrite(IN1A, 0);
  analogWrite(IN1B, 0);
  analogWrite(IN2A, 0);
  analogWrite(IN2B, 0);

  delay(2000);
}

我在代码中添加了一个“固定速度”值,因此我们也可以以固定速度沿相反方向旋转电机。此值不要超过 250。

IBT-2 (BTS7960) 单 H 桥

介绍

IBT-2 是具有大电压和电流能力的单通道 H 桥。与 DBH-12 一样,它配备了大型散热器。该模块也称为 BTS7960。

这是另一种常用的设备,缺少一些文档,但它非常易于使用,并且有可用的规格表。

我们再次使用“2 PWM”速度控制方法。除了控制输入外,还有一条必须拉高的启用线。与 DHT-12 一样,该驱动器也有一个用于电流测量的输出。

驱动器需要电机和逻辑电源。电机功率和电机输出被带到一个 4 螺钉端子板。

IBT-2 (BTS7960) Arduino 连接

IBT-2 与微控制器的连接非常简单,两个 I/O 引脚都不需要支持 PWM:
Arduino 的 5 伏输出连接到 IBT-2 上的 VCC 和启用引脚。

IBT-2 (BTS7960) Arduino 代码

我们可以将用于 DRV8871 的相同代码与此模块一起使用,因为驱动程序要求是相同的。在这里,变量重命名并更改了一些时间常数,但其他方面相同:



// Motor Connections (Both must use PWM pins)
#define RPWM 5
#define LPWM 6

void setup() {

  // Set motor connections as outputs
  pinMode(RPWM, OUTPUT);
  pinMode(LPWM, OUTPUT);

  // Stop motors
  analogWrite(RPWM, 0);
  analogWrite(LPWM, 0);
}

void loop() {

  // Accelerate forward
  digitalWrite(RPWM, LOW);
  for (int i = 0; i < 255; i++) {
    analogWrite(LPWM, i);
    delay(20);
  }

  delay(1000);

  // Decelerate forward
  for (int i = 255; i >= 0; i--) {
    analogWrite(LPWM, i);
    delay(20);
  }

  delay(500);

  // Accelerate reverse
  digitalWrite(LPWM, LOW);
  for (int i = 0; i < 255; i++) {
    analogWrite(RPWM, i);
    delay(20);
  }

  delay(1000);

  // Decelerate reverse
  for (int i = 255; i >= 0; i--) {
    analogWrite(RPWM, i);
    delay(20);
  }

  delay(500);
}

将草图加载到模块并启动一切。

我用我的 12 伏汽车电机,效果很好。

MD25HV 单 H 桥和控制器

介绍

我们今天要看的最后一个模块是最强大的模块。它也与其他的有点不同。

MD25HV 是一款单通道 H 桥,是我们将要检查的最大模块,正如其规格所示,它可以容纳一些相当大的电机。

但这款驱动器与其他驱动器的不同之处在于它不仅仅是一个驱动器,它还有一个内置电机控制器。该设备附带一个电位器和一个三位开关,可以插入以控制电机速度和方向。

因此,如果您只想手动控制电机的速度和方向,那么您甚至可能不需要微控制器。
该驱动器使用最简单的控制方法——一个 PWM 输入和一个 DIR 输入,可以切换 LOW 或 HIGH 以改变方向。

该板还为几个测试开关提供了气体,一个使电机正转,另一个使电机反转。这对于测试接线很有用。

与电机和电源的连接位于一侧,还提供用于 PWM、DIR 和接地连接的螺丝端子。

还有一个 5 伏输出可用于为微控制器供电。

MD25HV Arduino 连接

将 MD25HV 电机驱动器连接到 Arduino 非常简单,因为只需要两条控制线。显然,您需要为 PWM 输入使用支持 PWM 的 I/O 引脚,DIR 可以使用任何 I/O 引脚。

MD25HV Arduino Sketch – Cytron 电机驱动程序库
MD25HV使用简单的控制方法,为它写代码是一件非常容易的事。

我没有这样做,而是决定寻找一个图书馆,我的搜索得到了回报,发现了Cytron 的电机驱动程序库。

这个库适用于每个 Cytron 电机驱动器,事实证明,它也将支持本文中审查的每个电机驱动器!它确实简化了编码,并允许您编写任何电机驱动程序都可以使用的代码。

我选择了 PWM 和 DIR 引脚模型的示例。该库使用一种方法setSpeed简化了编码。您提供如下速度值:

1 到 255 向前移动
-1 到 -255 向后移动
0 停止电机
示例草图只是来回移动电机。

我将它加载到我的 Arduino 并将一个大型(14 安培)电机连接到 MD25HV。它作为驱动程序和控制器都运行良好。

结论

微控制器是使机动设备自动化的好方法。借助范围广泛的电机驱动器,您可以使用像 Arduino 这样的微控制器来驱动几乎任何尺寸的直流电机。

Cytron 电机驱动程序库是一个很好的发现,因为您可以将它与任何电机一起使用,从而为您的代码增加灵活性。

即使您选择在没有库的情况下编写代码,您也应该没有问题,因为使用所有这些驱动程序都非常简单。

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
扎眼的阳光的头像扎眼的阳光普通用户
上一篇 2023年12月7日
下一篇 2023年12月7日

相关推荐