虽然您最终需要学习控制直流电机才能构建自己的机器人,但您可能需要一些更容易上手的东西 - 这就是 L298N 电机驱动器的用武之地。它可以控制速度和旋转两个直流电机的方向。此外,它还可以
控制直流电机
只有能够控制直流电机的速度和旋转方向,我们才能完全控制它。通过结合这两种技术可以实现这一点。
- PWM——控制速度
- H 桥– 控制旋转方向
让我们详细了解这些技术。
控制双极步进电机,例如 NEMA 17。如果您想了解更多信息,请查看本教程。
PWM——控制速度
直流电机的速度可以通过改变其输入电压来控制。实现此目的的一种广泛使用的技术是脉冲宽度调制 (PWM)。
PWM 是一种通过发送一系列开关脉冲来调整输入电压平均值的技术。该平均电压与脉冲宽度成正比,称为占空比。
占空比越高,施加到直流电机的平均电压就越高,从而导致电机速度增加。占空比越短,施加到直流电机的平均电压就越低,导致电机速度降低。
下图显示了具有各种占空比和平均电压的 PWM 技术。
脉宽调制(PWM)技术
H 桥 – 控制旋转方向
直流电机的旋转方向可以通过改变其输入电压的极性来控制。实现此目的的一种广泛使用的技术是使用 H 桥。
H桥电路由排列成H形的四个开关组成,电机位于中心。
同时闭合两个特定开关会反转施加到电机的电压的极性。这会导致电机旋转方向发生变化。
下面的动画显示了 H 桥电路的工作情况。
H桥的工作
L298N电机驱动芯片
模块的中心是一个带有厚实散热器的黑色大芯片——L298N。
L298N 芯片包含两个标准 H 桥,能够驱动一对直流电机,非常适合构建两轮机器人平台。
L298N 电机驱动器的电源范围为 5V 至 35V,每通道能够提供 2A 连续电流,因此它与我们的大多数直流电机配合得很好。
技术规格
以下是规格:
电机输出电压 | 5V – 35V |
电机输出电压(推荐) | 7V – 12V |
逻辑输入电压 | 5V – 7V |
每通道连续电流 | 2A |
最大功耗 | 25W |
欲了解更多详细信息,请参阅下面的数据表。
L298N 电机驱动器模块引脚分配
L298N 模块有 11 个引脚,可使其与外界通信。引脚排列如下:
让我们一一熟悉一下每个引脚。
电源引脚
L298N 电机驱动器模块从 3 针、3.5 毫米螺距螺丝端子接收电源。
L298N 电机驱动器有两个输入电源引脚:VS 和 VSS。
VS引脚为 IC 的内部 H 桥供电,用于驱动电机。该引脚接受 5 至 12V 的输入电压。
电压信号用于为 L298N IC 内的逻辑电路供电,电压范围为 5V 至 7V。
接地是公共接地引脚。
输出引脚
L298N电机驱动器的输出通道,输出1和输出2对于电机 A 和输出3和输出4对于电机 B,通过两个 3.5mm 螺距螺钉端子断开至模块边缘。您可以将两个 5-12V 直流电机连接到这些端子。
模块上的每个通道可为直流电机提供高达 2A 的电流。然而,提供给电机的电流量取决于电机电源的容量。
方向控制引脚
方向控制引脚允许您控制电机是向前还是向后旋转。这些引脚实际上控制 L298N 芯片内 H 桥电路的开关。
该模块有两个方向控制引脚。这IN1 和 IN2引脚控制电机A的旋转方向;尽管IN3 和 IN4控制电机B的旋转方向。
电机的旋转方向可以通过对这些输入施加逻辑高电平(5V)或逻辑低电平(接地)来控制。下图显示了各种组合及其结果。
输入1 | 输入2 | 旋转方向 |
低(0) | 低(0) | 电机关闭 |
高(1) | 低(0) | 向前 |
低(0) | 高(1) | 落后 |
高(1) | 高(1) | 电机关闭 |
速度控制销
速度控制引脚埃纳和环境局用于打开/关闭电机并控制其速度。
将这些引脚拉高将导致电机旋转,而将它们拉低将停止电机。然而,通过脉冲宽度调制(PWM),可以控制电机的速度。
当跳线被移除时,5V稳压器被禁用,我们必须通过VSS引脚单独提供5V电压。
警告:
如果电机电源低于12V,可以保留跳线。如果大于12V,必须去掉跳线,防止损坏板载5V稳压器。
另外,当跳线就位时,请勿同时向 VSS 和 VS 引脚供电。
L298N的电压降
L298N 的压降约为 2V。这是因为内部开关晶体管在正向偏置时具有大约 1V 的压降,并且由于 H 桥需要电流通过两个晶体管,因此总压降为 2V。
因此,如果将 12V 连接到电机电源端子,电机将接收大约 10V 的电压。这意味着 12V 直流电机永远不会全速旋转。
了使电机以最高速度运行,电机电源的电压应略高于电机实际电压要求(+2V)。
考虑到2V的压降,如果使用5V电机,则需要在电机电源端提供7V电压。如果您有 12V 电机,那么您的电机电源电压应为 14V。
这种过大的电压降会导致以热的形式产生大量的功率耗散。这就是基于 L298N 的电机驱动器需要大散热器的原因。
将 L298N 电机驱动器模块连接到 Arduino
现在我们已经了解了该模块的所有信息,我们可以开始将其连接到我们的 Arduino 了!
让我们从连接电机电源开始。在我们的实验中,我们使用直流变速箱电机,也称为“TT”电机,常见于两轮驱动机器人中。它们的额定电压为 3 至 12V。因此,我们将外部 12V 电源连接到 VS 端子。由于 L298N 的压降约为 2V,因此电机将接收 10V 电压并以稍低的 RPM 旋转。但没关系。
接下来,我们需要向 L298N 的逻辑电路提供 5V 电压。我们将使用板载 5V 稳压器从电机电源获取 5V 电压,因此请保留 5V-EN 跳线。
现在将 L298N 模块的输入和使能引脚(ENA、IN1、IN2、IN3、IN4 和 ENB)连接到 6 个 Arduino 数字输出引脚(9、8、7、5、4 和 3)。请注意,Arduino 输出引脚 9 和 3 均启用 PWM。
最后,将一个电机连接到端子 A(OUT1 和 OUT2),将另一个电机连接到端子 B(OUT3 和 OUT4)。您可以更换电机的连接。从技术上讲,没有正确或错误的方法。
Arduino 示例代码
下面的草图将向您展示如何使用 L298N 电机驱动器控制直流电机的速度和旋转方向,并可以作为更多实际实验和项目的基础。
该草图将电机朝一个方向移动一圈,然后朝相反方向移动一圈。还涉及一些加速和减速。
当电机加速或减速时,您可能会听到嗡嗡声,特别是在较低的 PWM 值下。这个是正常的; 没有什么可担心的。发生这种情况是因为直流电机需要最低电压才能运行。
// Motor A connections
int enA = 9;
int in1 = 8;
int in2 = 7;
// Motor B connections
int enB = 3;
int in3 = 5;
int in4 = 4;
void setup() {
// Set all the motor control pins to outputs
pinMode(enA, OUTPUT);
pinMode(enB, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
// Turn off motors - Initial state
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
void loop() {
directionControl();
delay(1000);
speedControl();
delay(1000);
}
// This function lets you control spinning direction of motors
void directionControl() {
// Set motors to maximum speed
// For PWM maximum possible values are 0 to 255
analogWrite(enA, 255);
analogWrite(enB, 255);
// Turn on motor A & B
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
delay(2000);
// Now change motor directions
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
delay(2000);
// Turn off motors
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
// This function lets you control speed of the motors
void speedControl() {
// Turn on motors
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
// Accelerate from zero to maximum speed
for (int i = 0; i < 256; i++) {
analogWrite(enA, i);
analogWrite(enB, i);
delay(20);
}
// Decelerate from maximum speed to zero
for (int i = 255; i >= 0; --i) {
analogWrite(enA, i);
analogWrite(enB, i);
delay(20);
}
// Now turn off motors
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
代码说明:
Arduino 代码相当简单。它不需要任何库即可工作。该草图首先声明连接到 L298N 控制引脚的 Arduino 引脚。
// Motor A connections
int enA = 9;
int in1 = 8;
int in2 = 7;
// Motor B connections
int enB = 3;
int in3 = 5;
int in4 = 4;
在代码的设置部分,所有电机控制引脚(包括方向和速度控制引脚)都配置为数字输出。方向控制引脚被拉低以最初禁用两个电机。
void setup() {
// Set all the motor control pins to outputs
pinMode(enA, OUTPUT);
pinMode(enB, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
// Turn off motors - Initial state
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
在代码的循环部分,我们调用两个用户定义的函数,延迟一秒。
void loop() {
directionControl();
delay(1000);
speedControl();
delay(1000);
}
这些功能是:
-
directionControl()
– 此功能使两个电机全速旋转两秒钟。然后它反转电机的旋转方向并旋转两秒钟。最后,它停止电机。void directionControl() { // Set motors to maximum speed // For PWM maximum possible values are 0 to 255 analogWrite(enA, 255); analogWrite(enB, 255); // Turn on motor A & B digitalWrite(in1, HIGH); digitalWrite(in2, LOW); digitalWrite(in3, HIGH); digitalWrite(in4, LOW); delay(2000); // Now change motor directions digitalWrite(in1, LOW); digitalWrite(in2, HIGH); digitalWrite(in3, LOW); digitalWrite(in4, HIGH); delay(2000); // Turn off motors digitalWrite(in1, LOW); digitalWrite(in2, LOW); digitalWrite(in3, LOW); digitalWrite(in4, LOW); }
-
speedControl()
– 此函数使用AnalogWrite()函数生成 PWM 信号,该信号将两个电机从零加速到最大速度,然后再减速回零。最后,它停止电机。void speedControl() { // Turn on motors digitalWrite(in1, LOW); digitalWrite(in2, HIGH); digitalWrite(in3, LOW); digitalWrite(in4, HIGH); // Accelerate from zero to maximum speed for (int i = 0; i < 256; i++) { analogWrite(enA, i); analogWrite(enB, i); delay(20); } // Decelerate from maximum speed to zero for (int i = 255; i >= 0; --i) { analogWrite(enA, i); analogWrite(enB, i); delay(20); } // Now turn off motors digitalWrite(in1, LOW); digitalWrite(in2, LOW); digitalWrite(in3, LOW); digitalWrite(in4, LOW); }