【常见直流电机驱动模块与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(
  • 18
    点赞
  • 177
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值