风筝
发表于: 2022-8-26 17:58:12 | 显示全部楼层

如果你打算组装一台机器人,你最终会想学习如何控制直流电机。控制直流电机的最简单且经济实惠的方法是使用L298N电机驱动器和Arduino连接。它可以控制两个直流电机的速度和旋转方向。


控制直流电机

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

●    PWM - 控制速度

●    H桥 - 控制旋转方向


让我们了解一下。


PWM - 控制速度

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


PWM是一种通过发送一系列ON-OFF脉冲来调整输入电压平均值的技术。平均电压与称为占空比的脉冲宽度成正比。


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


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

Pulse-Width-Modulation-PWM-Technique-with-Duty-Cycles.jpg


H桥 – 控制旋转方向

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


H桥电路由四个开关组成,电机位于中心,形成H形排列。一次关闭两个特定开关会反转施加到电机的电压极性。这会导致电机的旋转方向发生变化。


以下动画显示了H桥电路的工作。

H-Bridge-Working-Motor-Direction-Control-Animation.gif


L298N电机驱动芯片

模块的中心是一个带有厚实散热器的黑色大芯片 - L298N


在L298N芯片内部,您会发现两个能够驱动一对直流电机的标准H桥。这意味着它最多可以单独驱动两个电机,非常适合构建两轮机器人平台。


L298N电机驱动器的电源范围为5V至35V,每个通道能够提供2A的连续电流,因此它与我们的大多数直流电机配合得非常好。


L298N电机驱动模块引脚排列

L298N模块共有11个引脚将其与外界连接。引脚如下:

L298N-Motor-Driver-Module-Pinout.jpg


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


电源引脚

L298N电机驱动模块通过3针3.5mm螺钉式接线端子供电。

L298N-Module-Power-Pins.jpg


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

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

VSS 用于驱动L298N IC内部的逻辑电路,其电压可以为5至7V。

GND 是公共接地引脚。


输出引脚

L298N电机驱动器的输出通道OUT1OUT2用于电机A,OUT3OUT4用于电机B,通过两个3.5mm螺钉式接线端子将其引出到模块边缘。您可以将两个5-12V直流电机连接到这些端子。

L298N-Module-Motor-Output-Connection-Pins.jpg


该模块的每个通道可以为直流电机提供高达2A的电流。然而,提供给电机的电流量取决于系统的电源。


方向控制引脚

通过使用方向控制引脚,您可以控制电机是正转还是反转。这些引脚实际上控制着L298N芯片内部H桥电路的开关。

L298N-Module-Direction-Control-Pins.jpg


该模块的每个通道都有两个方向控制引脚。IN1IN2引脚控制电机A的旋转方向;而IN3IN4控制电机B 旋转方向。


可以通过对这些输入应用逻辑高电平 (5V) 或逻辑低电平(接地)来控制电机的旋转方向。


速度控制引脚

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

L298N-Module-Speed-Control-Pins.jpg


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


该模块通常在这些引脚上带有一个跳线。当这个跳线就位时,电机以最大速度旋转。如果您想以编程方式控制电机的速度,您需要移除跳线并将它们连接到Arduino上启用PWM的引脚。


板载5V稳压器和跳线

该模块有一个板载5V稳压器 – 78M05。它可以通过跳线启用或禁用。

L298N-Module-5V-Regulator-and-Enable-Jumper.jpg


当这个跳线就位时,5V稳压器被启用,它从电机电源 (VS) 获得逻辑电源 (VSS)。在这种情况下,5V输入端作为输出引脚,提供5V 0.5A。您可以使用它为需要5V电源的Arduino或其他电路供电。


当跳线被移除时,5V稳压器被禁用,我们必须通过VSS引脚单独提供 5V。


L298N的电压降

L298N的压降约为2V。这是由于H桥电路中开关晶体管的内部电压降造成的。


因此,如果您将12V连接到电机电源端子,电机将收到大约10V的电压。这意味着12V直流电机永远不会以最大速度旋转。

L298N-Motor-Driver-Module-Internal-Voltage-Drop.jpg


为了从电机获得最大速度,电机电源的电压应略高于电机的实际电压要求(+2V)。考虑到2V的压降,如果您使用的是5V电机,则需要在电机电源端提供7V。如果您使用12V电机,那么您的电机电源电压应为14V。


将L298N电机驱动器模块连接到Arduino开发板

现在我们了解了有关模块的所有信息,可以开始将它连接到Arduino!


首先将电源连接到电机。在实验中,我们使用的是两轮驱动机器人中常见的直流变速箱电机(也称为“TT”电机)。它们的额定电压为3至12V。因此,我们将外部12V电源连接到VS端子。考虑到L298N IC的内部电压降,电机将接收10V电压并以略低的RPM旋转。


接下来,我们需要为L298N的逻辑电路提供5V电压。本文将使用板载5V稳压器从电机电源获得5V,因此请保留5V-EN跳线。


现在将L298N模块的输入和启用引脚(ENA、IN1、IN2、IN3、IN4 和 ENB)连接到六个Arduino数字输出引脚(9、8、7、5、4 和 3)。请注意,Arduino输出引脚9和3都启用了PWM。


最后将一台电机连接到端子A(OUT1和OUT2),将另一台电机连接到端子B(OUT3 和 OUT4)。完成后,您应该有一些类似于下图所示的内容。

Wiring-L298N-Motor-Driver-Module-with-DC-TT-motors-and-Arduino-UNO.jpg



跳转到指定楼层
风筝
发表于: 2022-8-26 18:04:26 | 显示全部楼层

Arduino示例代码

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

  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.         
  18.         // Turn off motors - Initial state
  19.         digitalWrite(in1, LOW);
  20.         digitalWrite(in2, LOW);
  21.         digitalWrite(in3, LOW);
  22.         digitalWrite(in4, LOW);
  23. }

  24. void loop() {
  25.         directionControl();
  26.         delay(1000);
  27.         speedControl();
  28.         delay(1000);
  29. }

  30. // This function lets you control spinning direction of motors
  31. void directionControl() {
  32.         // Set motors to maximum speed
  33.         // For PWM maximum possible values are 0 to 255
  34.         analogWrite(enA, 255);
  35.         analogWrite(enB, 255);

  36.         // Turn on motor A & B
  37.         digitalWrite(in1, HIGH);
  38.         digitalWrite(in2, LOW);
  39.         digitalWrite(in3, HIGH);
  40.         digitalWrite(in4, LOW);
  41.         delay(2000);
  42.         
  43.         // Now change motor directions
  44.         digitalWrite(in1, LOW);
  45.         digitalWrite(in2, HIGH);
  46.         digitalWrite(in3, LOW);
  47.         digitalWrite(in4, HIGH);
  48.         delay(2000);
  49.         
  50.         // Turn off motors
  51.         digitalWrite(in1, LOW);
  52.         digitalWrite(in2, LOW);
  53.         digitalWrite(in3, LOW);
  54.         digitalWrite(in4, LOW);
  55. }

  56. // This function lets you control speed of the motors
  57. void speedControl() {
  58.         // Turn on motors
  59.         digitalWrite(in1, LOW);
  60.         digitalWrite(in2, HIGH);
  61.         digitalWrite(in3, LOW);
  62.         digitalWrite(in4, HIGH);
  63.         
  64.         // Accelerate from zero to maximum speed
  65.         for (int i = 0; i < 256; i++) {
  66.                 analogWrite(enA, i);
  67.                 analogWrite(enB, i);
  68.                 delay(20);
  69.         }
  70.         
  71.         // Decelerate from maximum speed to zero
  72.         for (int i = 255; i >= 0; --i) {
  73.                 analogWrite(enA, i);
  74.                 analogWrite(enB, i);
  75.                 delay(20);
  76.         }
  77.         
  78.         // Now turn off motors
  79.         digitalWrite(in1, LOW);
  80.         digitalWrite(in2, LOW);
  81.         digitalWrite(in3, LOW);
  82.         digitalWrite(in4, LOW);
  83. }
复制代码

代码说明

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

  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;
复制代码

setup()函数中,所有电机控制引脚(方向和速度控制引脚)都被声明为数字输出,方向控制引脚被拉低以关闭两个电机。

  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.         
  10.         // Turn off motors - Initial state
  11.         digitalWrite(in1, LOW);
  12.         digitalWrite(in2, LOW);
  13.         digitalWrite(in3, LOW);
  14.         digitalWrite(in4, LOW);
  15. }
复制代码

loop()函数中,我们以一秒的间隔调用两个用户定义的函数。

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

这两个自定义函数分别是:

●    directionControl() - 此函数使两个电机以最大速度向前旋转两秒钟。 然后它会反转电机的旋转方向并旋转两秒钟。

●    speedControl() - 此函数通过使用analogWrite()函数产生PWM信号将两个电机从零加速到最大速度,然后将它们减速回零。


回复

使用道具 举报

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

本版积分规则

主题 700 | 回复: 1479



手机版|

GMT+8, 2024-3-28 18:44 , Processed in 0.100445 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

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

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