使用 L293D 电机驱动器 IC 和 Arduino 控制直流电机

使用 L293D 电机驱动器 IC 和 Arduino 控制直流电机的教程

如果您打算组装新的机器人朋友,您最终会想要学习如何控制直流电机。控制直流电机最简单且经济的方法是将 L293D 电机驱动器 IC 与 Arduino 连接。它可以控制两个直流电机的速度和旋转方向。

此外,它还可以控制单极步进电机(如 28BYJ-48)或双极步进电机(如 NEMA 17)。

控制直流电机

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

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

PWM——控制速度

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

PWM 是一种通过发送一系列开关脉冲来调整输入电压平均值的技术。

平均电压与称为占空比的脉冲宽度成正比。

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

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

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

脉宽调制(PWM)技术

H-Bridge – 控制旋转方向

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

H 桥电路由四个开关组成,电机位于中心,形成类似 H 的布置。

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

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

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

H桥的工作

L293D电机驱动IC

L293D 是一款双通道 H 桥电机驱动器,能够驱动一对直流电机或单个步进电机。这意味着它可以单独驱动多达两个电机,这使其成为构建两轮机器人平台的理想选择。

L293D集成电路

L293D 最常用于驱动电机,但也可用于驱动任何感性负载,例如继电器螺线管或大型开关功率晶体管。

它能够驱动四个螺线管、四个单向直流电机、两个双向直流电机或一个步进电机。

L293D IC 的电源范围为 4.5V 至 36V,每通道能够提供 1.2A 峰值输出电流,因此它与我们的大多数电机配合良好。

该 IC 还包括内置反冲二极管,以防止电机断电时损坏。

技术规格

以下是规格:

电机输出电压4.5V – 36V
逻辑输入电压5V
每通道输出电流600毫安
每个通道的峰值输出电流1.2A

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

L293D 数据表

L293D 电机驱动器 IC 引脚排列

L293D IC 共有 16 个引脚,用于将其与外界连接。引脚排列如下:

l293d 双 H 桥电机驱动器 IC 引脚排列

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

电源引脚

l293d电源连接

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

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

VSS(Vcc1)用于驱动内部逻辑电路,电压应为5V。

接地引脚是公共接地引脚。所有 4 个 GND 引脚均在内部连接,用于散发高负载条件下产生的热量。

输出引脚

l293d输出端子

L293D 电机驱动器的电机 A 和 B 的输出通道引出至引脚输出1、输出2输出3、输出4分别。您可以将两个 5-36V 直流电机连接到这些引脚。

IC 上的每个通道均可向直流电机提供高达 600mA 的电流。然而,提供给电机的电流量取决于系统的电源。

方向控制引脚

通过方向控制引脚可以控制电机正转还是反转。这些引脚实际上控制 L293D IC 内部 H 桥电路的开关。

l293d方向控制输入

该 IC 的每个通道都有两个方向控制引脚。这输入1输入2引脚控制电机A的旋转方向;尽管IN3IN4控制电机B的旋转方向。

电机的旋转方向可以通过对这些输入施加逻辑高电平(5V)或逻辑低电平(接地)来控制。下图显示了这是如何完成的。

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

速度控制销

l293d速度控制输入

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

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

将 L293D 电机驱动器 IC 连接到 Arduino

现在我们已经了解了有关 IC 的一切,我们可以开始将它连接到我们的 Arduino 了!

让我们从将电源连接到电机开始。在我们的实验中,我们使用两轮驱动机器人中常见的直流变速箱电机(也称为“TT”电机)。它们的额定电压为 3 至 12V。因此,我们将外部5V电源连接到VS(Vcc2)引脚。

接下来,我们需要向 L293D 的逻辑电路提供 5V 电压。将 VSS (Vcc1) 引脚连接到 Arduino 上的 5V 输出。并确保您的电路和 Arduino 共享一个公共地。

现在将 L293D IC 的输入和使能引脚(ENA、IN1、IN2、IN3、IN4 和 ENB)连接到 6 个 Arduino 数字输出引脚(9、8、7、5、4 和 3)。请注意,Arduino 输出引脚 9 和 3 均启用 PWM。

最后,将一个电机连接到 OUT1 和 OUT2,将另一个电机连接到 OUT3 和 OUT4。您可以互换电机的连接。从技术上讲,没有正确或错误的方法。

完成后,您应该看到类似于下图的内容。

带直流电机arduino的l293d电机驱动器IC接线

Arduino 示例代码

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

// 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 outputspinMode(enA, OUTPUT);pinMode(enB, OUTPUT);pinMode(in1, OUTPUT);pinMode(in2, OUTPUT);pinMode(in3, OUTPUT);pinMode(in4, OUTPUT);// Turn off motors - Initial statedigitalWrite(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 255analogWrite(enA, 255);analogWrite(enB, 255);// Turn on motor A & BdigitalWrite(in1, HIGH);digitalWrite(in2, LOW);digitalWrite(in3, HIGH);digitalWrite(in4, LOW);delay(2000);// Now change motor directionsdigitalWrite(in1, LOW);digitalWrite(in2, HIGH);digitalWrite(in3, LOW);digitalWrite(in4, HIGH);delay(2000);// Turn off motorsdigitalWrite(in1, LOW);digitalWrite(in2, LOW);digitalWrite(in3, LOW);digitalWrite(in4, LOW);
}// This function lets you control speed of the motors
void speedControl() {// Turn on motorsdigitalWrite(in1, LOW);digitalWrite(in2, HIGH);digitalWrite(in3, LOW);digitalWrite(in4, HIGH);// Accelerate from zero to maximum speedfor (int i = 0; i < 256; i++) {analogWrite(enA, i);analogWrite(enB, i);delay(20);}// Decelerate from maximum speed to zerofor (int i = 255; i >= 0; --i) {analogWrite(enA, i);analogWrite(enB, i);delay(20);}// Now turn off motorsdigitalWrite(in1, LOW);digitalWrite(in2, LOW);digitalWrite(in3, LOW);digitalWrite(in4, LOW);
}

代码说明:

Arduino 代码非常简单。它不需要任何库即可工作。该草图首先声明 L293D 控制引脚所连接的 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 outputspinMode(enA, OUTPUT);pinMode(enB, OUTPUT);pinMode(in1, OUTPUT);pinMode(in2, OUTPUT);pinMode(in3, OUTPUT);pinMode(in4, OUTPUT);// Turn off motors - Initial statedigitalWrite(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 255analogWrite(enA, 255);analogWrite(enB, 255);// Turn on motor A & BdigitalWrite(in1, HIGH);digitalWrite(in2, LOW);digitalWrite(in3, HIGH);digitalWrite(in4, LOW);delay(2000);// Now change motor directionsdigitalWrite(in1, LOW);digitalWrite(in2, HIGH);digitalWrite(in3, LOW);digitalWrite(in4, HIGH);delay(2000);// Turn off motorsdigitalWrite(in1, LOW);digitalWrite(in2, LOW);digitalWrite(in3, LOW);digitalWrite(in4, LOW);
    }
  • speedControl() – 该函数通过使用AnalogWrite()函数生成 PWM 信号将两个电机从零加速到最大速度,然后将它们减速回零。最后它关闭电机。

    void speedControl() {// Turn on motorsdigitalWrite(in1, LOW);digitalWrite(in2, HIGH);digitalWrite(in3, LOW);digitalWrite(in4, HIGH);// Accelerate from zero to maximum speedfor (int i = 0; i < 256; i++) {analogWrite(enA, i);analogWrite(enB, i);delay(20);}// Decelerate from maximum speed to zerofor (int i = 255; i >= 0; --i) {analogWrite(enA, i);analogWrite(enB, i);delay(20);}// Now turn off motorsdigitalWrite(in1, LOW);digitalWrite(in2, LOW);digitalWrite(in3, LOW);digitalWrite(in4, LOW);
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/102881.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GLTF纹理贴图工具让模型更逼真

1、如何制作逼真的三维模型&#xff1f; 要使三维模型看起来更加逼真&#xff0c;可以考虑以下几个方面&#xff1a; 高质量纹理&#xff1a;使用高分辨率的纹理贴图可以增强模型的细节和真实感。选择适合模型的高质量纹理图像&#xff0c;并确保纹理映射到模型上的UV坐标正确…

栈的运行算法

一&#xff0c;顺序栈的静态分配 二&#xff0c;顺序栈的动态分配 #include<stdio.h> #include<stdlib.h> #define initsize 5 #define incresize 5typedef struct Sqstack{int *base;int *top;int stacksize; }Sqstack;void InitStack(Sqstack *s){(*s).base(int…

抖音小程序没人做了吗?

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 咱说的严谨点&#xff0c;不是没人做了&#xff0c;而是做的人少了。利益驱使&#xff0c;越来越多的人开始思考新方向了&#xff0c;开发小程序的人少了&#xff0c;排名也没多少人做了&#xff…

URL because the SSL module is not available

Could not fetch URL https://pypi.org/simple/pip/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host‘pypi.org’, port443): Max retries exceeded with url: /simple/pip/ (Caused by SSLError(“Can’t connect to HTT PS URL because the…

c++day5

#include <iostream>using namespace std;class Sofa { private:string sitting; public:Sofa(){cout << "沙发的无参构造函数" << endl;}Sofa(string s):sitting(s){cout << "沙发的有参构造函数" << endl;}void show(){co…

《UnityShader入门精要》学习1

读者可以在开源网站github&#xff08;https://github.com/candycat1992/Unity_Shaders_Book&#xff09;上下载本书的源代码。 第二章 渲染流水线 渲染流水线的最终目的在于生成或者说是渲染一张二维纹理&#xff0c;即我们在电脑屏幕上看到的所有效果&#xff0c;它的输入是…

【Java 进阶篇】HTML 语义化标签详解

HTML&#xff08;HyperText Markup Language&#xff09;是构建Web页面的标准语言。在HTML中&#xff0c;标签&#xff08;tag&#xff09;是用于定义页面结构和内容的关键元素。在构建网页时&#xff0c;了解如何正确使用HTML标签是非常重要的&#xff0c;因为它们不仅影响页面…

【AIGC】如何在使用stable-diffusion-webui生成图片时看到完整请求参数

文章目录 背景开搞使用遇到的问题 背景 通过代码调用Stable Diffusion的txt2img、img2img接口时&#xff0c;很多时候都不知道应该怎么传参&#xff0c;比如如何指定模型、如何开启并使用Controlnet、如何开启面部修复等等&#xff0c;在sd-webui上F12看到的请求也不是正式调用…

WEEX编译|加密市场三季度回顾及未来展望

作者&#xff1a;Greg Cipolaro&#xff0c;NYDIG 全球研究主管 编译&#xff1a;WEEX 唯客交易所 本文要点&#xff1a; ● 在充满挑战的第三季度&#xff0c;比特币价格下跌 11.1%&#xff0c;因为众多资产类别都在努力应对利率上升的影响和对经济衰退的担忧。 ● 比特币…

JavaWeb---Servlet

1.Srvlet概述 Servlet是运行在java服务器端的程序&#xff0c;用于接收和响应来着客户端基于HTTP协议的请求 如果想实现Servlet的功能&#xff0c;可以通过实现javax。servlet。Servlet接口或者继承它的实现类 核心方法&#xff1a;service&#xff08;&#xff09;&#xf…

STM32--WDG看门狗

文章目录 WDG简介IWDGIWDG的超时计算WWDGWWDG超时和窗口值设定独立看门狗工程WWDG工程 WDG简介 WDG看门狗&#xff08;Watchdog Timer&#xff09;是一种常见的硬件设备&#xff0c;在STM32F10系列中&#xff0c;有两种看门狗&#xff0c;分别是独立看门狗和窗口看门狗&#x…

【算法|双指针系列No.6】leetcode LCR 179. 查找总价格为目标值的两个商品

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

设计模式 - 行为型模式考点篇:模板方法模式(概念 | 案例实现 | 优缺点 | 使用场景)

目录 一、行为型模式 1.1、模板方法模式 1.1.1、概念 1.1.2、案例实现 1.1.3、优缺点 1.1.4、使用场景 一、行为型模式 一句话概括行为型模式 行为型模式&#xff1a;类或对象间如何交互、如何划分职责&#xff0c;从而更好的完成任务. 1.1、模板方法模式 1.1.1、概念 …

Ansys Zemax | 如何建立LCD背光源模型

本文建立了楔形LCD背光源模型&#xff0c;并对其进行分析&#xff0c;并按照照明输出标准对其进行优化。 附件下载 联系工作人员获取附件 简介 液晶显示器 (LCDs) 作为一种显示技术&#xff0c;在当今社会中已经得到了广泛的应用。在商业领域中最突出的应用包括计算机显示器…

自定义类型

目录 结构体 匿名结构体 结构体嵌套 结构体大小 设置默认对齐数 位段 位段的跨平台问题 Enum枚举 枚举的好处 union联合体 判断大小端 内存大小 结构体 前面我们讲了结构体的基本知识&#xff0c;还有一些知识并没有罗列完全&#xff0c;这篇将结构体剩余的一些小知…

Windows mysql 5.7 msi版、mysql 8.0 msi版下载、安装教程,附详细图文

大家好&#xff0c;今天为大家带来的是 mysql 5.7 msi &#xff0c; MySql 8.0 版本的下载、安装教程&#xff0c;附详细图文。本文以 5.7 版本为例子&#xff0c;帮助大家讲解。希望对大家有所帮助 文章首发地址 一、下载地址 这里提供一下 CSDN 镜像下载地址&#xff0c;有…

Spring5应用之事务属性

作者简介&#xff1a;☕️大家好&#xff0c;我是Aomsir&#xff0c;一个爱折腾的开发者&#xff01; 个人主页&#xff1a;Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客 当前专栏&#xff1a;Spring5应用专栏_Aomsir的博客-CSDN博客 文章目录 参考文献前言事务…

python sqlalchemy(ORM)- 01 简单使用

[doc] 简介 sqlalchemy 是python操作sql数据库的工具&#xff0c;是一个对象关系映射的框架&#xff1b;在python中提供高效、高性能的数据库访问&#xff0c;企业级的数据持久化模式&#xff1b;pypi 地址sqlalchemy官网 sqlalchemy架构 sql操作是独立于ORM操作的&#xf…

vscode 资源管理器移动到右边

目录 vscode 资源管理器移动到右边 vscode 资源管理器移动到右边 点击 文件》首选项》设置》工作台》外观》 找到这个配置下拉选择左右

单元测试很难么?也没有吧

前言 你可能会用单元测试框架&#xff0c;python的unittest、pytest&#xff0c;Java的Junit、testNG等。 那么你会做单元测试么&#xff01;当然了&#xff0c;这有什么难的&#xff1f; test_demo.py def inc(x):return x 1def test_answer():assert inc(3) 4 inc() 是…