• 使用 L293D 电机驱动器 IC 和 Arduino 控制直流电机


    使用 L293D 电机驱动器 IC 和 Arduino 控制直流电机的教程

    如果您打算组装新的机器人朋友,您最终会想要学习如何控制直流电机。控制直流电机最简单且经济的方法是将 L293D 电机驱动器 IC 与 Arduino 连接。它可以控制两个直流电机的速度和旋转方向。

    此外,它还可以控制单极步进电机(如 28BYJ-48)或双极步进电机(如 NEMA 17)。

    控制直流电机

    为了完全控制直流电机,我们必须控制它的速度和旋转方向。这可以通过结合这两种技术来实现。

    • PWM——控制速度
    • H-Bridge – 控制旋转方向

    PWM——控制速度

    直流电机的速度可以通过改变其输入电压来控制。实现此目的的常用技术是使用 PWM(脉冲宽度调制)。

    PWM 是一种通过发送一系列开关脉冲来调整输入电压平均值的技术。

    平均电压与称为占空比的脉冲宽度成正比。

    占空比越高,施加到直流电机的平均电压越高(导致速度越高),占空比越短,施加到直流电机的平均电压越低(导致速度较低)。

    下图显示了具有不同占空比和平均电压的 PWM 技术。

    具有占空比的脉宽调制 PWM 技术

    脉宽调制(PWM)技术

    H-Bridge – 控制旋转方向

    直流电机的旋转方向可以通过改变其输入电压的极性来控制。实现此目的的常用技术是使用 H 桥。

    H 桥电路由四个开关组成,电机位于中心,形成类似 H 的布置。

    同时闭合两个特定开关会反转施加到电机的电压的极性。这会导致电机旋转方向发生变化。

    下面的动画显示了 H 桥电路的工作情况。

    H桥工作电机方向控制动画

    H桥的工作

    L293D电机驱动IC

    L293D 是一款双通道 H 桥电机驱动器,能够驱动一对直流电机或单个步进电机。这意味着它可以单独驱动多达两个电机,这使其成为构建两轮机器人平台的理想选择。

    L293D集成电路

    L293D 最常用于驱动电机,但也可用于驱动任何感性负载,例如继电器螺线管或大型开关功率晶体管。

    它能够驱动四个螺线管、四个单向直流电机、两个双向直流电机或一个步进电机。

    L293D IC 的电源范围为 4.5V 至 36V,每通道能够提供 1.2A 峰值输出电流,因此它与我们的大多数电机配合良好。

    该 IC 还包括内置反冲二极管,以防止电机断电时损坏。

    技术规格

    以下是规格:

    电机输出电压4.5V – 36V
    逻辑输入电压5V
    每通道输出电流600毫安
    每个通道的峰值输出电流1.2A

    欲了解更多详细信息,请参阅下面的数据表。

    L293D 电机驱动器 IC 引脚排列

    L293D IC 共有 16 个引脚,用于将其与外界连接。引脚排列如下:

    l293d 双 H 桥电机驱动器 IC 引脚排列

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

    电源引脚

    l293d电源连接

    L293D 电机驱动器 IC 实际上有两个输入电源引脚 - VS 和 VSS。

    VS(Vcc2)引脚为 IC 的内部 H 桥供电以驱动电机。您可以将 4.5 至 36V 之间的任何输入电压连接到该引脚。

    VSS(Vcc1)用于驱动内部逻辑电路,电压应为5V。

    接地引脚是公共接地引脚。所有 4 个 GND 引脚均在内部连接,用于散发高负载条件下产生的热量。

    输出引脚

    l293d输出端子

    L293D 电机驱动器的电机 A 和 B 的输出通道引出至引脚输出1、输出2输出3、输出4分别。您可以将两个 5-36V 直流电机连接到这些引脚。

    IC 上的每个通道均可向直流电机提供高达 600mA 的电流。然而,提供给电机的电流量取决于系统的电源。

    方向控制引脚

    通过方向控制引脚可以控制电机正转还是反转。这些引脚实际上控制 L293D IC 内部 H 桥电路的开关。

    l293d方向控制输入

    该 IC 的每个通道都有两个方向控制引脚。这输入1输入2引脚控制电机A的旋转方向;尽管IN3IN4控制电机B的旋转方向。

    电机的旋转方向可以通过对这些输入施加逻辑高电平(5V)或逻辑低电平(接地)来控制。下图显示了这是如何完成的。

    输入1输入2旋转方向
    低(0)低(0)电机关闭
    高(1)低(0)向前
    低(0)高(1)落后
    高(1)高(1)电机关闭

    速度控制销

    l293d速度控制输入

    速度控制引脚EMAENB用于打开/关闭电机并控制其速度。

    将这些引脚拉高将导致电机旋转,而将其拉低将停止电机。但是,通过脉冲宽度调制 (PWM),您实际上可以控制电机的速度。

    将 L293D 电机驱动器 IC 连接到 Arduino

    现在我们已经了解了有关 IC 的一切,我们可以开始将它连接到我们的 Arduino 了!

    让我们从将电源连接到电机开始。在我们的实验中,我们使用两轮驱动机器人中常见的直流变速箱电机(也称为“TT”电机)。它们的额定电压为 3 至 12V。因此,我们将外部5V电源连接到VS(Vcc2)引脚。

    接下来,我们需要向 L293D 的逻辑电路提供 5V 电压。将 VSS (Vcc1) 引脚连接到 Arduino 上的 5V 输出。并确保您的电路和 Arduino 共享一个公共地。

    现在将 L293D IC 的输入和使能引脚(ENA、IN1、IN2、IN3、IN4 和 ENB)连接到 6 个 Arduino 数字输出引脚(9、8、7、5、4 和 3)。请注意,Arduino 输出引脚 9 和 3 均启用 PWM。

    最后,将一个电机连接到 OUT1 和 OUT2,将另一个电机连接到 OUT3 和 OUT4。您可以互换电机的连接。从技术上讲,没有正确或错误的方法。

    完成后,您应该看到类似于下图的内容。

    带直流电机arduino的l293d电机驱动器IC接线

    Arduino 示例代码

    下面的草图将让您全面了解如何使用L293D电机驱动IC来控制直流电机的速度和旋转方向,并将作为更多实际实验和项目的基础。

    1. // Motor A connections
    2. int enA = 9;
    3. int in1 = 8;
    4. int in2 = 7;
    5. // Motor B connections
    6. int enB = 3;
    7. int in3 = 5;
    8. int in4 = 4;
    9. void setup() {
    10. // Set all the motor control pins to outputs
    11. pinMode(enA, OUTPUT);
    12. pinMode(enB, OUTPUT);
    13. pinMode(in1, OUTPUT);
    14. pinMode(in2, OUTPUT);
    15. pinMode(in3, OUTPUT);
    16. pinMode(in4, OUTPUT);
    17. // Turn off motors - Initial state
    18. digitalWrite(in1, LOW);
    19. digitalWrite(in2, LOW);
    20. digitalWrite(in3, LOW);
    21. digitalWrite(in4, LOW);
    22. }
    23. void loop() {
    24. directionControl();
    25. delay(1000);
    26. speedControl();
    27. delay(1000);
    28. }
    29. // This function lets you control spinning direction of motors
    30. void directionControl() {
    31. // Set motors to maximum speed
    32. // For PWM maximum possible values are 0 to 255
    33. analogWrite(enA, 255);
    34. analogWrite(enB, 255);
    35. // Turn on motor A & B
    36. digitalWrite(in1, HIGH);
    37. digitalWrite(in2, LOW);
    38. digitalWrite(in3, HIGH);
    39. digitalWrite(in4, LOW);
    40. delay(2000);
    41. // Now change motor directions
    42. digitalWrite(in1, LOW);
    43. digitalWrite(in2, HIGH);
    44. digitalWrite(in3, LOW);
    45. digitalWrite(in4, HIGH);
    46. delay(2000);
    47. // Turn off motors
    48. digitalWrite(in1, LOW);
    49. digitalWrite(in2, LOW);
    50. digitalWrite(in3, LOW);
    51. digitalWrite(in4, LOW);
    52. }
    53. // This function lets you control speed of the motors
    54. void speedControl() {
    55. // Turn on motors
    56. digitalWrite(in1, LOW);
    57. digitalWrite(in2, HIGH);
    58. digitalWrite(in3, LOW);
    59. digitalWrite(in4, HIGH);
    60. // Accelerate from zero to maximum speed
    61. for (int i = 0; i < 256; i++) {
    62. analogWrite(enA, i);
    63. analogWrite(enB, i);
    64. delay(20);
    65. }
    66. // Decelerate from maximum speed to zero
    67. for (int i = 255; i >= 0; --i) {
    68. analogWrite(enA, i);
    69. analogWrite(enB, i);
    70. delay(20);
    71. }
    72. // Now turn off motors
    73. digitalWrite(in1, LOW);
    74. digitalWrite(in2, LOW);
    75. digitalWrite(in3, LOW);
    76. digitalWrite(in4, LOW);
    77. }

    代码说明:

    Arduino 代码非常简单。它不需要任何库即可工作。该草图首先声明 L293D 控制引脚所连接的 Arduino 引脚。

    // Motor A connections

    1. int enA = 9;
    2. int in1 = 8;
    3. int in2 = 7;
    4. // Motor B connections
    5. int enB = 3;
    6. int in3 = 5;
    7. int in4 = 4;

    在代码的设置部分,所有电机控制引脚(方向和速度控制引脚)都配置为数字输出,方向控制引脚被拉低以关闭两个电机。

    1. void setup() {
    2. // Set all the motor control pins to outputs
    3. pinMode(enA, OUTPUT);
    4. pinMode(enB, OUTPUT);
    5. pinMode(in1, OUTPUT);
    6. pinMode(in2, OUTPUT);
    7. pinMode(in3, OUTPUT);
    8. pinMode(in4, OUTPUT);
    9. // Turn off motors - Initial state
    10. digitalWrite(in1, LOW);
    11. digitalWrite(in2, LOW);
    12. digitalWrite(in3, LOW);
    13. digitalWrite(in4, LOW);
    14. }

    在代码的循环部分,我们以一秒的间隔调用两个用户定义的函数。

    1. void loop() {
    2. directionControl();
    3. delay(1000);
    4. speedControl();
    5. delay(1000);
    6. }

    这些功能是:

    • DirectionControl() – 此函数使两个电机以最大速度向前旋转两秒。然后它反转电机的旋转方向并旋转两秒钟。最后它关闭电机。

      1. void directionControl() {
      2. // Set motors to maximum speed
      3. // For PWM maximum possible values are 0 to 255
      4. analogWrite(enA, 255);
      5. analogWrite(enB, 255);
      6. // Turn on motor A & B
      7. digitalWrite(in1, HIGH);
      8. digitalWrite(in2, LOW);
      9. digitalWrite(in3, HIGH);
      10. digitalWrite(in4, LOW);
      11. delay(2000);
      12. // Now change motor directions
      13. digitalWrite(in1, LOW);
      14. digitalWrite(in2, HIGH);
      15. digitalWrite(in3, LOW);
      16. digitalWrite(in4, HIGH);
      17. delay(2000);
      18. // Turn off motors
      19. digitalWrite(in1, LOW);
      20. digitalWrite(in2, LOW);
      21. digitalWrite(in3, LOW);
      22. digitalWrite(in4, LOW);
      23. }
    • speedControl() – 该函数通过使用AnalogWrite()函数生成 PWM 信号将两个电机从零加速到最大速度,然后将它们减速回零。最后它关闭电机。

      1. void speedControl() {
      2. // Turn on motors
      3. digitalWrite(in1, LOW);
      4. digitalWrite(in2, HIGH);
      5. digitalWrite(in3, LOW);
      6. digitalWrite(in4, HIGH);
      7. // Accelerate from zero to maximum speed
      8. for (int i = 0; i < 256; i++) {
      9. analogWrite(enA, i);
      10. analogWrite(enB, i);
      11. delay(20);
      12. }
      13. // Decelerate from maximum speed to zero
      14. for (int i = 255; i >= 0; --i) {
      15. analogWrite(enA, i);
      16. analogWrite(enB, i);
      17. delay(20);
      18. }
      19. // Now turn off motors
      20. digitalWrite(in1, LOW);
      21. digitalWrite(in2, LOW);
      22. digitalWrite(in3, LOW);
      23. digitalWrite(in4, LOW);
      24. }
  • 相关阅读:
    能不能绕过c去学c++?
    数学——图形题
    vue3早已具备抛弃虚拟DOM的能力了
    MySQL日志及执行计划
    redis 重建主从记录
    手把手带你用Python和文心一言搭建《AI看图写诗》网页项目(附上完整项目源码)
    SpringBoot项目:Cannot find declaration to go to
    java面向对象的三大特性之封装和继承(配视频讲解)
    【前端逆向】社会主义核心价值观加密方法解析+python版复现
    【JavaSE】类和对象 【封装、static、代码块、对象的打印】(三)
  • 原文地址:https://blog.csdn.net/sxstj/article/details/133797999