使用 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.rhkb.cn/news/156084.html

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

相关文章

邮政编码,格式校验:@ZipCode(自定义注解)

目标 自定义一个用于校验邮政编码格式的注解ZipCode&#xff0c;能够和现有的 Validation 兼容&#xff0c;使用方式和其他校验注解保持一致&#xff08;使用 Valid 注解接口参数&#xff09;。 校验逻辑 有效格式 不能包含空格&#xff1b;应为6位数字&#xff1b; 不校验…

区块链在游戏行业的应用

区块链技术在游戏行业有许多潜在的应用&#xff0c;它可以改变游戏开发、发行和玩家交互的方式。以下是区块链技术在游戏行业的一些主要应用&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.游戏资产…

L05_SpringBoot入门

SpringBoot入门 浅谈Restful风格代码实现(并且通过Apifox进行接口测试[以传入json格式数据为例])首先创建一个SpringBoot项目,pom文件包引入如下下面在新建src创建com.ndky.controller包,然后再在包内创建一个HelloController类编写(一个简易的restful风格的代码)编写GET请求代…

智能工厂:APS高级计划排程系统成为了制造业建设智能工厂的核心必要需求

近年来&#xff0c;中国经济受到了许多因素的影响&#xff0c;例如新冠疫情冲击和国内外经济环境的巨大变化&#xff0c;随着我国人口红利的减少和人力成本逐步的增加&#xff0c;不论是中大型或小微制造企业为了提高市场竞争力并降低生产成本&#xff0c;都纷纷开始规划建设数…

C++QT-day6

/*定义一个基类 Animal&#xff0c;其中有一个虛函数perform&#xff08;)&#xff0c;用于在子类中实现不同动物的表演行为。*/ #include <iostream> using namespace std; class Animal //封装Animal类&#xff08;基类&#xff09; { private:string person; public:A…

Linux内存管理 (2):memblock 子系统的建立

前一篇&#xff1a;Linux内存管理 (1)&#xff1a;内核镜像映射临时页表的建立 文章目录 1. 前言2. 分析背景3. memblock 简介3.1 memblock 数据结构3.2 memblock 接口 4. memblock 的构建过程 1. 前言 限于作者能力水平&#xff0c;本文可能存在谬误&#xff0c;因此而给读者…

Vue绑定样式

一、绑定class样式 语法格式&#xff1a; :class "属性名" &#xff08;一&#xff09;字符串写法 该写法适用于样式的类名不确定&#xff0c;需要动态指定的场景 我们用如下的CSS样式进行操作演示 我们要完成点击按钮改变CSS样式的操作&#xff0c;如下图代码所…

C# 中大小端Endian

大小端可以找下资料很多&#xff0c;都是文字的。我每次遇到大小端问题就会搜资料&#xff0c;总是记不住。我自己用用图片记录一下&#xff0c;以备直观的从内存中看到。 在C#中可以用BitConverter.IsLittleEndian来查询。 几个数字在内存中 我们来观察一下&#xff0c;我的…

js获取当前时间

// 格式化日对象 (获取当前时间) export function timeFormat() {var date new Date();var sign2 ":";var year date.getFullYear(); // 年var month date.getMonth() 1; // 月var day date.getDate(); // 日var hour date.getHours(); // 时var minutes dat…

Burstormer论文阅读笔记

这是CVPR2023的一篇连拍图像修复和增强的论文&#xff0c;一作是阿联酋的默罕默德 本 扎耶得人工智能大学&#xff0c;二作是旷视科技。这些作者和CVPR2022的一篇BIPNet&#xff0c;同样是做连拍图像修复和增强的&#xff0c;是同一批。也就是说同一个方向&#xff0c;22年中了…

RecyclerView 空白区域点击事件

在项目中使用RecyclerView展示列表数据&#xff0c;用了GridLayoutManager&#xff0c;在遇到item个数不满足一行时&#xff0c;会在页面右侧透出空白位&#xff0c; 如下图所示. 目前点击空白位是没有点击响应事件的&#xff0c;我们想实现点击响应以扩大用户可以进入LandingP…

小程序中如何设置所服务地区的时区

在全球化的背景下&#xff0c;小程序除了在中国使用外&#xff0c;还为海外的华人地区提供服务。例如我们采云小程序为泰国、阿根廷、缅甸等国家的商家就提供过微信小程序。这些商家开通小程序&#xff0c;为本地的华人提供服务。但通常小程序的开发者/服务商位于中国&#xff…

Facebook广告账户被封?这份防封及申诉指南收好

Facebook广告是海外营销的一大利器&#xff0c;但是随着互联网的发展&#xff0c;有部分不法分子正在利用他进行盈利&#xff0c;导致Facebook官方安全审核日益严格&#xff0c;不少卖家遭遇封号问题&#xff01;这篇文章就来教你如何更好地管理 Facebook广告帐户&#xff0c;实…

Maven下载与文件配置

文章目录 官网下载相应文件修改配置文件设置环境变量 官网下载相应文件 https://maven.apache.org/ 点击Download ,找到Files 下载好了&#xff0c;请解压&#xff0c;放在你需要存储的位置&#xff01; 修改配置文件 打开解压的文件&#xff1a; 在conf 下有一个setting…

Stable diffusion 用DeOldify给黑白照片、视频上色

老照片常常因为当时的技术限制而只有黑白版本。然而现代的 AI 技术,如 DeOldify,可以让这些照片重现色彩。 本教程将详细介绍如何使用 DeOldify 来给老照片上色。. 之前介绍过基于虚拟环境的 基于DeOldify的给黑白照片、视频上色,本次介绍对于新手比较友好的在Stable diff…

Webmin远程命令执行漏洞复现

文章目录 Webmin_1.910_rce(CVE-2019-15107)漏洞编号漏洞描述影响版本漏洞评级利用方法&#xff08;利用案例&#xff09;漏洞挖掘加固建议参考信息漏洞分类 Webmin_1.910_rce(CVE-2019-15107) 漏洞编号 CVE-2019-15107 漏洞描述 Webmin是一个用于管理类Unix系统的管理配置…

5G安卓核心板-MT6833/MT6853核心板规格参数

随着智能手机的不断发展&#xff0c;芯片技术在推动手机性能和功能方面发挥着关键作用。MT6833和MT6853安卓核心板是两款高度集成的基带平台&#xff0c;为LTE/5G/NR和C2K智能手机应用提供强大的处理能力和多样化的接口。 这两款安卓核心板都集成了蓝牙、FM、WLAN和GPS模块&…

什么是React的虚拟DOM(Virtual DOM)?它的作用是什么?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

PHP 自习室空位查询系统mysql数据库web结构apache计算机软件工程网页wamp计算机毕业设计

一、源码特点 PHP 自习室空位查询系统是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 php 自习室空位查询系统1 代码 https://download.csdn.net/download/qq_41221322/…

ESP8266 WiFi物联网智能插座—下位机软件实现

目录 1、软件架构 2、开发环境 3、软件功能 4、程序设计 4.1、初始化 4.2、主循环状态机 4.3、初始化模式 4.4、配置模式 4.5、运行模式 4.6、重启模式 4.7、升级模式 5、程序功能特点 5.1、日志管理 5.2、数据缓存队列 本篇博文开始讲解下位机插座节点的MCU软件…