arduino 只有.h没有.cpp_基于Arduino接口的L298N直流电动机驱动器模块

如果您打算组装新的机器人朋友,那么您最终将想了解有关控制直流电动机的知识。控制直流电动机的最简单,最便宜的方法之一是将L298N电动机驱动器与Arduino接口。它可以控制两个直流电动机的速度和旋转方向。
另外,它甚至可以控制NEMA 17等双极步进电机。

使用L298N电机驱动器和Arduino控制步进电机控制步进电动机最简单,最便宜的方法之一是将L298N电动机驱动器与Arduino接口。它可以同时控制速度和方向


控制直流电动机


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

PWM –用于控制速度
直流电动机的速度可以通过改变其输入电压来控制。执行此操作的常用技术是使用PWM(脉冲宽度调制)
PWM是通过发送一系列ON-OFF脉冲来调整输入电压平均值的技术。
平均电压与称为占空比的脉冲宽度成比例。
占空比越高,施加到直流电动机(高速)的平均电压越大,占空比越低,施加到直流电动机(低速)的平均电压越小。
下图显示了具有各种占空比和平均电压的PWM技术。


H桥–用于控制旋转方向
直流电动机的旋转方向可以通过改变其输入电压的极性来控制。执行此操作的常用技术是使用H桥。
H桥电路包含四个开关,电机在中心,形成H形排列。
同时闭合两个特定的开关会反转施加到电动机的电压的极性。这引起电动机旋转方向的改变。
下图显示了H桥电路的工作原理。


L298N电机驱动器IC


模块的核心是一块大的黑色芯片,上面有一块矮小的散热器,是L298N。
L298N是一款双通道H桥电机驱动器,能够驱动一对DC电机。这意味着它可以单独驱动最多两个电机,因此非常适合构建两轮机器人平台。

电源供应


L298N电机驱动器模块通过3针间距螺丝端子供电。它由用于电动机电源(Vs),接地和5V逻辑电源(Vss)的引脚组成。

L298N电机驱动器IC实际上有两个输入电源引脚,即。“ Vss”和“ Vs”。 H桥从Vs引脚获得驱动5V至35V电机功率的电源。Vss用于驱动可以为5V至7V的逻辑电路。它们都共用为“ GND”的公共接地。


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


当该跳线安装到位时,将启用5V调节器,从电动机电源(Vs)提供逻辑电源(Vss)。在这种情况下,5V输入端子充当输出引脚,并提供5V 0.5A。您可以使用它为Arduino或其他需要5V电源的电路供电。


卸下跳线后,5V稳压器将被禁用,我们必须通过5伏输入端子分别提供5伏。

警告: 如果电动机电源低于12V,则可以将跳线安装到位。如果大于12V,则应卸下跳线,以免损坏板载5V稳压器。 当跳线就位时,也不要同时为电动机电源输入和5V电源输入供电。

L298N的压降


L298N电机驱动器的压降约为2V。这是由于H桥电路中的开关晶体管内部的电压降所致。
因此,如果我们将12V连接到电动机电源端子,则电动机将接收10V左右的电压。这意味着12V直流电动机将永远不会以其最大速度旋转。
为了使电动机达到最大速度,电动机的电源电压应比电动机的实际电压要求高一点(2V)。
考虑到2V的压降,如果使用5V电机,则需要在电机电源端子上提供7V。如果您有12V电动机,则电动机电源电压应为14V。

输出引脚


L298N的电动机驱动器A和B的驱动器输出通道通过两个间距的螺钉端子开到模块的边缘。
您可以将两个电压在5到35V之间的直流电动机连接到这些端子。
模块上的每个通道均可向直流电动机提供高达2A的电流。但是,提供给电动机的电流量取决于系统的电源。


控制针


对于L298N的每个通道,都有两种类型的控制销,它们使我们可以同时控制直流电动机的速度和旋转方向。方向控制pin和速度控制pin。

方向控制针


使用方向控制pin,我们可以控制电动机是向前还是向后旋转。这些引脚实际上控制着L298N IC内部的H桥电路的开关。
该模块的每个通道都有两个方向控制引脚。的IN1IN2引脚控制马达A的纺丝方向而IN3IN4控制马达B.
可以通过向这些输入施加逻辑高电平(5伏)或逻辑低电平(接地)来控制电动机的旋转方向。下图说明了如何完成此操作。

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


速度控制针


速度控制引脚即:ENAENB用于打开,关闭电动机以及控制其速度。
将这些引脚拉高将使电动机旋转,将其拉低将使它们停止。但是,借助脉冲宽度调制(PWM),我们实际上可以控制电动机的速度。
模块通常在这些引脚上带有跳线。当安装了该跳线时,将启用电动机并以最大速度旋转。如果要以编程方式控制电动机的速度,则需要卸下跳线并将其连接到Arduino上启用PWM的引脚。


L298N电机驱动器模块的引脚排列


在深入研究连接和示例代码之前,让我们首先看一下其Pinout。

VCC 引脚为电动机供电。它可以是5至35V之间的任何电压。请记住,如果安装了5V-EN跳线,则需要提供比电动机实际电压要求高出2伏的电压,以使电动机达到最大速度。

GND 是常见的接地引脚。

5V 引脚为L298N IC内部的开关逻辑电路供电。如果安装了5V-EN跳线,则此引脚用作输出,可用于为Arduino供电。如果移除了5V-EN跳线,则需要将其连接到Arduino的5V引脚。

ENA 引脚用于控制电动机A的速度。将该引脚拉至高电平(将跳线保持在适当的位置)将使电动机A旋转,将其拉至低电平将使电动机停止。删除跳线并将此引脚连接到PWM输入将使我们能够控制电动机A的速度。

IN1 IN2 引脚用于控制电动机A的旋转方向。当其中一个为HIGH且另一个为LOW时,电动机A将旋转。如果两个输入均为高电平或低电平,则电动机A将停止。

IN3 IN4 引脚用于控制电机B的旋转方向。当其中一个为高电平而另一个为低电平时,电机B旋转。如果两个输入均为高电平或低电平,则电动机B将停止。

ENB 引脚用于控制电动机B的速度。将该引脚拉至高电平(将跳线保持在适当的位置)将使电动机B旋转,将其拉至低电平将使电动机停止。删除跳线并将此引脚连接到PWM输入将使我们能够控制电机B的速度。

OUT1 OUT2 引脚连接到电机A。

OUT3 OUT4 引脚连接到电机B。


使用Arduino UNO接线L298N电机驱动器模块


既然我们了解了有关模块的所有知识,就可以开始将其连接到Arduino了!
首先将电源连接到电动机。在我们的实验中,我们使用的直流变速箱电机(也称为“ TT”电机)通常在两轮驱动机器人中使用。它们的额定电压为3至12V。因此,我们将外部12V电源连接到VCC端子。考虑到L298N IC的内部压降,电动机将接收10V电压,并以较低的RPM旋转。但是,没关系。
接下来,我们需要为L298N的逻辑电路提供5伏的电压。我们将使用板载5V稳压器并从电动机电源获得5伏特,因此,将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)。您可以互换电动机的连接,从技术上讲,没有正确或错误的方法。
完成后,您应该拥有与下图相似的外观。


Arduino代码–控制直流电动机


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

// Motor A connections
intenA=9;intin1=8;intin2=7;// Motor B connections
intenB=3;intin3=5;intin4=4;voidsetup(){// 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);}voidloop(){directionControl();delay(1000);speedControl();delay(1000);}// This function lets you control spinning direction of motors
voiddirectionControl(){// 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
voidspeedControl(){// Turn on motors
digitalWrite(in1,LOW);digitalWrite(in2,HIGH);digitalWrite(in3,LOW);digitalWrite(in4,HIGH);// Accelerate from zero to maximum speed
for(inti=0;i<256;i++){analogWrite(enA,i);analogWrite(enB,i);delay(20);}// Decelerate from maximum speed to zero
for(inti=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
intenA=9;intin1=8;intin2=7;// Motor B connections
intenB=3;intin3=5;intin4=4;


在代码的设置部分,所有电机控制引脚均声明为数字输出,并拉至低电平以关闭两个电机。

voidsetup(){// 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);}


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

voidloop(){directionControl();delay(1000);speedControl();delay(1000);}

函数部分

  • directionControl() –此函数使两个电动机以最大速度向前旋转两秒钟。然后,它反转电动机的旋转方向,并再旋转两秒钟。最后,它关闭了电动机。
voiddirectionControl(){// 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信号将两个电动机从零加速到最大速度,然后将其减速回零。最后,它关闭了电动机。
voidspeedControl(){// Turn on motors
digitalWrite(in1,LOW);digitalWrite(in2,HIGH);digitalWrite(in3,LOW);digitalWrite(in4,HIGH);// Accelerate from zero to maximum speed
for(inti=0;i<256;i++){analogWrite(enA,i);analogWrite(enB,i);delay(20);}// Decelerate from maximum speed to zero
for(inti=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);}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值