L298N 直流电机驱动模块与 Arduino 的接口

7 篇文章 0 订阅
4 篇文章 0 订阅

L298N 直流和步进电机驱动器与 Arduino 接口教程

 虽然您最终需要学习控制直流电机才能构建自己的机器人,但您可能需要一些更容易上手的东西 - 这就是 L298N 电机驱动器的用武之地。它可以控制速度和旋转两个直流电机的方向。此外,它还可以

控制直流电机

只有能够控制直流电机的速度和旋转方向,我们才能完全控制它。通过结合这两种技术可以实现这一点。

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

让我们详细了解这些技术。

控制双极步进电机,例如 NEMA 17。如果您想了解更多信息,请查看本教程。

PWM——控制速度

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

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

占空比越高,施加到直流电机的平均电压就越高,从而导致电机速度增加。占空比越短,施加到直流电机的平均电压就越低,导致电机速度降低。

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

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

脉宽调制(PWM)技术

H 桥 – 控制旋转方向

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

H桥电路由排列成H形的四个开关组成,电机位于中心。

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

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

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

H桥的工作

L298N电机驱动芯片

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

L298N 电机驱动模块 - IC

 

L298N 芯片包含两个标准 H 桥,能够驱动一对直流电机,非常适合构建两轮机器人平台。

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

技术规格

以下是规格:

电机输出电压5V – 35V
电机输出电压(推荐)7V – 12V
逻辑输入电压5V – 7V
每通道连续电流2A
最大功耗25W

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

 

L298N 电机驱动器模块引脚分配

L298N 模块有 11 个引脚,可使其与外界通信。引脚排列如下:

L298N 电机驱动器模块引脚分配

让我们一一熟悉一下每个引脚。

电源引脚

L298N 电机驱动器模块从 3 针、3.5 毫米螺距螺丝端子接收电源。

l298n模块电源引脚

L298N 电机驱动器有两个输入电源引脚:VS 和 VSS。

VS引脚为 IC 的内部 H 桥供电,用于驱动电机。该引脚接受 5 至 12V 的输入电压。

电压信号用于为 L298N IC 内的逻辑电路供电,电压范围为 5V 至 7V。

接地是公共接地引脚。

输出引脚

L298N电机驱动器的输出通道,输出1和输出2对于电机 A 和输出3和输出4对于电机 B,通过两个 3.5mm 螺距螺钉端子断开至模块边缘。您可以将两个 5-12V 直流电机连接到这些端子。

l298n模块电机输出连接引脚

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

方向控制引脚

方向控制引脚允许您控制电机是向前还是向后旋转。这些引脚实际上控制 L298N 芯片内 H 桥电路的开关。

l298n模块方向控制引脚

该模块有两个方向控制引脚。这IN1 和 IN2引脚控制电机A的旋转方向;尽管IN3 和 IN4控制电机B的旋转方向。

 

电机的旋转方向可以通过对这些输入施加逻辑高电平(5V)或逻辑低电平(接地)来控制。下图显示了各种组合及其结果。

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

速度控制销

速度控制引脚埃纳环境局用于打开/关闭电机并控制其速度。

l298n模块速度控制引脚

将这些引脚拉高将导致电机旋转,而将它们拉低将停止电机。然而,通过脉冲宽度调制(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)。您可以更换电机的连接。从技术上讲,没有正确或错误的方法。

使用 DC TT 电机和 Arduino UNO 为 L298N 电机驱动器模块接线

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);
    }
  • 7
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值