0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心
发布

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用L298N和Arduino板控制直流电机

科技观察员 来源:八色木 作者:八色木 2022-04-08 15:06 次阅读

在这个Arduino教程中,我们将学习如何使用Arduino控制直流电机。我们来看看控制直流电机的一些基本技术,并通过两个例子,学习如何使用L298N电机驱动器和Arduino板来控制直流电机。

在以往的文章中,我们知道可以通过简单地控制输入电压来控制直流电机的速度,最常用的方法是使用PWM信号。延伸可阅读:PWM

pYYBAGJP3diAGGiWAAB9JCjmyfQ263.png

PWM控制直流电机

使用PWM控制直流电机

PWM,即脉冲宽度调制技术,它是一种允许我们通过调整进入电机的电压的平均值,通过高电平和低电平的持续时间来控制电机运动的技术。平均电压取决于占空比,即信号在一段时间内打开的时间与关闭的时间之比。

poYBAGJPpCWABQ0xAAER697JgsI225.png

脉冲宽度调制技术

因此,根据电机的大小,我们可以简单地将ArduinoPWM输出连接到晶体管的底座或MOSFET的栅极,通过控制PWM输出来控制电机的速度。低功率ArduinoPWM信号开关在MOSFET上,通过PWM信号开关可驱动大功率电机。

pYYBAGJP3eOAAjkSAAFeEQNV7gA850.png

ArduinoPWM控制直流电机

H桥直流电机控制

另一方面,为了控制电机的旋转方向,我们只需要对电流流过电机的方向进行逆转,最常用的方法是用H桥。一个H桥电路包含四个开关元件,晶体管或mosfet,形成一个类似于H的结构。通过同时激活两个特定的开关,我们可以改变电流流动的方向,从而改变电机的旋转方向。

pYYBAGJP3emALfVyAAEVpSr-g_U797.png

H桥的结构

所以,如果我们把PWM和H桥这两种方法结合起来,我们就可以完全控制直流电机的运动了。有许多直流电机驱动器都具有这些特性,L298N就是其中之一。

L298N驱动模块

L298N是一个双H桥电机驱动器,它允许在同一时间,在速度和方向上对两个直流电机进行控制。该模块可以驱动电压在5–35V之间的直流电机,峰值工作电流可达2A。

poYBAGJP3fCAGwHnAAPHhAxZZYQ593.png

L298N驱动模块

让我们仔细看看L298N模块的接口定义,并解释它是如何工作的。该模块包括两个电机(A、B)的连接端子、接地GND端子、电机的VCC和一个可作为输入或输出的5V引脚,这主要取决于在电机VCC上使用的电压,具体使用请往下看。

pYYBAGJP3faAWyMDAAHQLMTCPwA155.png

该模块有一个板载5V调节器,可通过跳线启用或禁用。如果电机供电电压低于12V,我们可以启用5V调节器,5V引脚可以作为输出,例如为我们的Arduino板供电;但是如果电机电压大于12V,我们必须断开跳线,因为这些电压会对板载5V调节器造成损坏。在这种情况下,5V引脚将作为输入,因为我们需要连接到5V电源,以便IC正常工作。

使用中这个集成电路的电压降大约是2V。例如,如果我们使用12V电源,电机端子的电压大约是10V,这意味着我们无法从12V直流电机中获得最大速度。

pYYBAGJP3gOAR_CDAAKkob1ZamM317.png

L298N的电压降

接下来是逻辑控制信号输入。使能A和使能B引脚用于使能和控制电机的速度。如果跳线出现在这个引脚上,电机将被启用并以最大速度工作,如果我们移除跳线,我们可以将PWM输入连接到这个引脚上,以这种方式控制电机的速度。如果我们把这个插针接在地GND上,马达就会不工作。

poYBAGJP3f2ANfQHAAJ36mRNsuo156.png

L298N的逻辑输入控制

其中,输入1和2针用于控制电动机A的转动方向,输入3和4用于控制电机B。这些插针实际上控制的是H桥的开关L298N芯片。它的控制原理是:当输入1是低,2是高马达A会向前转动,反之亦然,如果输入1高2低电机A将反方向旋转。如果两个输入都相同,无论高低电平,电机A都会停止。同样的道理也适用于输入3和4。

Arduino上L298N的使用

现在让我们做一些实际的测试。在第一个示例中,我们将使用电位器控制电机的速度,并使用一个按钮改变旋转方向。这是电路原理图。

pYYBAGJP3hCAGhAkAAI_ZOJkYcI810.png

Arduino上L298N的使用

测试元件包括:一个L298N驱动器,一个直流电机,一个电位器,一个按钮开关和一个Arduino板以及12V电源。

Arduino 控制代码如下

/* ArduinoDCMotor Control - PWM | H-Bridge | L298N - Example 01

*/

#define enA 9

#define in1 6

#define in2 7

#define button 4

int rotDirection = 0;

int pressed = false;

void setup() {

pinMode(enA, OUTPUT);

pinMode(in1, OUTPUT);

pinMode(in2, OUTPUT);

pinMode(button, INPUT);

// Set initial rotation direction

digitalWrite(in1, LOW);

digitalWrite(in2, HIGH);

}

void loop() {

int potValue =analogRead(A0); // Read potentiometer value

int pwmOutput = map(potValue, 0, 1023, 0 , 255); // Map the potentiometer value from 0 to 255

analogWrite(enA, pwmOutput); // Send PWM signal to L298N Enable pin

// Read button - Debounce

if (digitalRead(button) == true) {

pressed = !pressed;

}

while (digitalRead(button) == true);

delay(20);

// If button is pressed - change rotation direction

if (pressed == true & rotDirection == 0) {

digitalWrite(in1, HIGH);

digitalWrite(in2, LOW);

rotDirection = 1;

delay(20);

}

// If button is pressed - change rotation direction

if (pressed == false & rotDirection == 1) {

digitalWrite(in1, LOW);

digitalWrite(in2, HIGH);

rotDirection = 0;

delay(20);

}

}

代码解释:首先我们需要为程序定义引脚和一些变量。在 setup 部分,我们需要设置引脚模式和电机的初始旋转方向。在 loop 部分,我们首先读取电位器的值,然后将我们从电位器中得到的值,0到 1023 映射到PWM信号值 0 到 255,也就是PWM信号从0到100%的占空比。然后使用 analogWrite() 函数,发送PWM信号到L298N板的使能端,从而实现电机的驱动。接下来,检查是否按下了按钮,如果是,将通过反方向设置输入1和输入2的状态来改变电机的旋转方向。这个按钮将作为切换按钮工作,每次我们按下它,它都将改变电机的旋转方向。

Arduino采用L298N驱动机器人小车

如果我们理解了上面的知识,下面我们就可以制造自己的Arduino机器人小车了。下面是电路原理图:

pYYBAGJP3pGAVt5MAANPvwFKYoQ299.png

Arduino采用L298N驱动机器人小车

我们需要两个直流电机,L298N驱动器,一个Arduino板和一个操纵杆Joystick。在电源方面,我选择了三节3.7V的锂离子电池作为电源,电压约11V。小车采用3毫米的胶合板做了底盘,用金属支架把电机固定在上面,把轮子连在电机上,底盘的前面安装了一个转向轮。在网上有成品底盘,例如:智能小车底盘

现在让我们看看Arduino代码,看看它是如何工作的。

int xAxis = analogRead(A0); // Read Joysticks X-axis

int yAxis = analogRead(A1); // Read Joysticks Y-axis

在loop部分定义了引脚之后,我们首先读取操纵杆X和Y轴的值。操纵杆实际上是由两个电位器连接到Arduino的vwin 输入,它们的值从0到1023。当操纵杆保持在中心位置时,电位器或轴的值都在512左右。

poYBAGJP3p2AUbfBAAFy9H89teE407.png

操纵杆Joystick 模块的值

我们将增加一点公差,以470到550的值为中心。所以如果向后移动操纵杆的Y轴,数值低于470,将使用四个输入引脚将两个电机的旋转方向设置为向后。然后,我们将从470到0的下降值转换为PWM从0到255的上升值,这实际上是控制电机的速度。

// Y-axis used forforward and backward control

if (yAxis < 470) {

// Set Motor A backward

digitalWrite(in1, HIGH);

digitalWrite(in2, LOW);

// Set Motor B backward

digitalWrite(in3, HIGH);

digitalWrite(in4, LOW);

// Convert the declining Y-axis readings for going backward from 470 to 0 into 0 to 255 value for the PWM signal for increasing the motor speed

motorSpeedA= map(yAxis, 470, 0, 0, 255);

motorSpeedB = map(yAxis, 470, 0, 0, 255);

}

类似的,如果我们向前移动操纵杆的Y轴,数值超过550,我们将设置电机向前移动,并将读数从550到1023转换为PWM值从0到255。如果操纵杆保持在它的中心,电机的速度将为零。接下来,让我们看看如何使用X轴来控制小车左右转动 。

// X-axis used for left and right control

if (xAxis < 470) {

// Convert the declining X-axis readings from 470 to 0 into increasing 0 to 255 value

int xMapped = map(xAxis, 470, 0, 0, 255);

// Move to left - decrease left motor speed, increase right motor speed

motorSpeedA = motorSpeedA - xMapped;

motorSpeedB = motorSpeedB + xMapped;

// Confine the range from 0 to 255

if (motorSpeedA < 0) {

motorSpeedA = 0;

}

if (motorSpeedB > 255) {

motorSpeedB = 255;

}

}

首先,需要把X轴的读数转换成0到255之间的速度值。对于向左移动,我们使用这个值来降低左电机速度并增加右电机速度。在这里,由于算术函数,我们使用两个额外的“if”语句来限制电机速度范围从0到255。

poYBAGJP3oyAHUtzAAIdK48ND8c950.png

机器人小车的左转和右转

同样的方法也适用于向右移动小车。

根据所施加的电压和采用电机本身的不同,在较低的速度下,电机无法启动,并产生嗡嗡声。在我本文的例子中,如果PWM信号的值低于70,电机就无法启动。因此,使用这两个if语句,我实际上把速度限制在70到255之间。最后,发送电机速度控制值或PWM信号到L298N驱动器的使能引脚。

// Prevent buzzing at low speeds (Adjust according to your motors. My motors couldn't start moving if PWM value was below value of 70)

if (motorSpeedA < 70) {

motorSpeedA = 0;

}

if (motorSpeedB < 70) {

motorSpeedB = 0;

}

analogWrite(enA, motorSpeedA); // Send PWM signal to motor A

analogWrite(enB, motorSpeedB); // Send PWM signal to motor B

最后附上Arduino机器人小车示例的完整代码:

*/

#define enA 9

#define in1 4

#define in2 5

#define enB 10

#define in3 6

#define in4 7

int motorSpeedA = 0;

int motorSpeedB = 0;

void setup() {

pinMode(enA, OUTPUT);

pinMode(enB, OUTPUT);

pinMode(in1, OUTPUT);

pinMode(in2, OUTPUT);

pinMode(in3, OUTPUT);

pinMode(in4, OUTPUT);

}

void loop() {

int xAxis = analogRead(A0); // Read Joysticks X-axis

int yAxis = analogRead(A1); // Read Joysticks Y-axis

// Y-axis used for forward and backward control

if (yAxis < 470) {

// Set Motor A backward

digitalWrite(in1, HIGH);

digitalWrite(in2, LOW);

// Set Motor B backward

digitalWrite(in3, HIGH);

digitalWrite(in4, LOW);

// Convert the declining Y-axis readings for going backward from 470 to 0 into 0 to 255 value for the PWM signal for increasing the motor speed

motorSpeedA = map(yAxis, 470, 0, 0, 255);

motorSpeedB = map(yAxis, 470, 0, 0, 255);

}

else if (yAxis > 550) {

// Set Motor A forward

digitalWrite(in1, LOW);

digitalWrite(in2, HIGH);

// Set Motor B forward

digitalWrite(in3, LOW);

digitalWrite(in4, HIGH);

// Convert the increasing Y-axis readings for going forward from 550 to 1023 into 0 to 255 value for the PWM signal for increasing the motor speed

motorSpeedA = map(yAxis, 550, 1023, 0, 255);

motorSpeedB = map(yAxis, 550, 1023, 0, 255);

}

// If joystick stays in middle the motors are not moving

else {

motorSpeedA = 0;

motorSpeedB = 0;

}

// X-axis used for left and right control

if (xAxis < 470) {

// Convert the declining X-axis readings from 470 to 0 into increasing 0 to 255 value

int xMapped = map(xAxis, 470, 0, 0, 255);

// Move to left - decrease left motor speed, increase right motor speed

motorSpeedA = motorSpeedA - xMapped;

motorSpeedB = motorSpeedB + xMapped;

// Confine the range from 0 to 255

if (motorSpeedA < 0) {

motorSpeedA = 0;

}

if (motorSpeedB > 255) {

motorSpeedB = 255;

}

}

if (xAxis > 550) {

// Convert the increasing X-axis readings from 550 to 1023 into 0 to 255 value

int xMapped = map(xAxis, 550, 1023, 0, 255);

// Move right - decrease right motor speed, increase left motor speed

motorSpeedA = motorSpeedA + xMapped;

motorSpeedB = motorSpeedB - xMapped;

// Confine the range from 0 to 255

if (motorSpeedA > 255) {

motorSpeedA = 255;

}

if (motorSpeedB < 0) {

motorSpeedB = 0;

}

}

// Prevent buzzing at low speeds (Adjust according to your motors. My motors couldn't start moving if PWM value was below value of 70)

if (motorSpeedA < 70) {

motorSpeedA = 0;

}

if (motorSpeedB < 70) {

motorSpeedB = 0;

}

analogWrite(enA, motorSpeedA); // Send PWM signal to motor A

analogWrite(enB, motorSpeedB); // Send PWM signal to motor B

}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表德赢Vwin官网 网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 直流电机
    +关注

    关注

    35

    文章

    1679

    浏览量

    69821
  • Arduino
    +关注

    关注

    186

    文章

    6451

    浏览量

    185711
收藏 人收藏

    评论

    相关推荐

    L298N驱动直流电机问题

    经pwm调制 l298n驱动一个 直流电机的c程序怎么编写还有该怎么接线
    发表于05-04 17:14

    Arudino+L298N控制直流电机的正反转

    Arudino+ L298N 控制 直流电机正反转所需元器件电路连接图 Arduino程序所需元器件 Arduinouno,
    发表于06-28 11:17

    请问L298N是怎样控制直流电机正反转的?

    L298N的原理是什么? L298N是怎样 控制 直流电机正反转的?
    发表于06-29 09:28

    Arduino实践详细说明之L298N驱动直流电机

    基于 arduinouno 利用 l298n驱动 控制 直流电机的正反转和速度 L298N说明这是其
    发表于06-29 08:06

    L298驱动arduinoL298N电机驱动模块和直流电机接线具体步骤

    L298驱动 arduinoL298N 电机驱动模块和 直流电机接线具体步骤如下:1.第一步,将数字3、4脚接
    发表于09-08 07:52

    L298N驱动是怎样控制直流电机

    什么是 直流电机L298N驱动 是怎样 控制 直流电机的?
    发表于10-19 08:29

    arduinouno如何利用l298n驱动控制直流电机的正反转和速度?

    arduinouno如何利用 l298n驱动 控制 直流电机的正反转和速度?
    发表于10-20 07:34

    L298N电机驱动直流电机程序汇总

    关于 L298N驱动 直流电机的各种写法程序汇总
    发表于05-04 16:04 31次下载

    L298N驱动2个直流电机的电路

    只找到了一个来 L298N的驱动电路,可以驱动两个 直流电机,需要两个电源5V,12V。可以实现 直流电机正反转,停止 控制。这里介绍下肖基特二极管。
    发表于05-14 10:01 9312次阅读
    <b class='flag-5'>L298N</b>驱动2个<b class='flag-5'>直流电机</b>的电路

    L298n直流电机的原理说明

    该文件包含了 L298n 直流电机的工作原理图和PCB制图
    发表于05-28 10:06 3次下载

    Arduino实验17L298N电机驱动模块

    控制程序。 二、实验设备与环境 ArduinoUNO套件、 ArduinoIDE、计算机、 L298N驱动模块、 直流电机、电位器、PS/
    发表于03-16 14:14 11次下载
    <b class='flag-5'>Arduino</b>实验17 <b class='flag-5'>L298N</b><b class='flag-5'>电机</b>驱动模块

    ros与arduino通信控制直流电机

    前言:在成功通过 arduino开发 控制 直流电机后,开始尝试用ros与 arduino通信来 控制
    发表于03-31 11:45 4次下载
    ros与<b class='flag-5'>arduino</b>通信<b class='flag-5'>控制</b><b class='flag-5'>直流电机</b>

    L298N驱动直流电机仿真

    L298N是双 H 桥 电机驱动器,可同时 控制两个 直流电机的速度和方向。 该模块可以驱动电压在5-35V之间的 直流电机,峰值 电流可
    发表于04-03 10:53 4次下载
    <b class='flag-5'>L298N</b>驱动<b class='flag-5'>直流电机</b>仿真

    L298N直流电机总结

    采用 L298N双桥 直流电机驱动芯片 工作电压范围5V35V,如果需要从模块内取电,则供电范围为7V35V 峰值输出电流2A 每个通道有一个使能输入端 可以驱动两个 直流电机或者一个四线步进
    发表于04-03 11:05 3次下载
    <b class='flag-5'>L298N</b><b class='flag-5'>直流电机</b>总结

    Arudino+L298N控制直流电机正反转

    Arudino+ L298N 控制 直流电机正反转 所需元器件 电路连接图 Arduino程序 所需元器件 Arduinouno
    发表于04-03 14:55 2次下载
    Arudino+<b class='flag-5'>L298N</b><b class='flag-5'>控制</b><b class='flag-5'>直流电机</b>正反转