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

news2024/10/5 5:15:49

使用 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 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 代码非常简单。它不需要任何库即可工作。该草图首先声明 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 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);
    }

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

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

相关文章

【SQL】MySQL中的索引,索引优化

索引是存储引擎用来快速查询记录的一种数据结构&#xff0c;按实现方式主要分为Hash索引和B树索引。 按功能划分&#xff0c;主要有以下几类 单列索引指的是对某一列单独建立索引&#xff0c;一张表中可以有多个单列索引 1. 单列索引 - 普通索引&#xff1a;

ubuntu 安装jdk21开发环境

下载 wget https://download.oracle.com/java/21/latest/jdk-21_linux-x64_bin.tar.gz 第二步&#xff1a;解压 tar -zxvf jdk-21_linux-x64_bin.tar.gz 第三步&#xff1a;移动 jdk-21 目录到 /usr/local/jdk21 第四步&#xff1a;配置环境变量 sudovim/etc/profile vim/etc/…

手部关键点检测2:YOLOv5实现手部检测(含训练代码和数据集)

手部关键点检测2&#xff1a;YOLOv5实现手部检测(含训练代码和数据集) 目录 手部关键点检测2&#xff1a;YOLOv5实现手部检测(含训练代码和数据集) 1. 前言 2. 手部检测数据集说明 &#xff08;1&#xff09;手部检测数据集 &#xff08;2&#xff09;自定义数据集 3. 基…

python入门篇08- 函数进阶-参数传递

全文目录,一步到位 1.前言简介1.1 专栏传送门1.1.1 上文小总结1.1.2 上文传送门 2. python基础使用2.1 函数进阶 - 参数传递2.1.1 设置多个返回值 2.2 传参方式(多种)2.1.0 代码准备2.1.1 方式一: 参数位置传递2.1.2 方式二: 关键字参数传递2.1.3 方式三: 缺省参数传递2.1.4 方…

口袋参谋:淘宝卖家必备的市场调查分析工具!

​在淘宝天猫上开店&#xff0c;首先想到的第一个问题就是——卖什么&#xff1f; 想要解决这个疑问&#xff0c;我们就需要对一些你选的品类做市场调查&#xff0c;根据市场调查分析得出了结论&#xff0c;哪个市场竞争力小&#xff0c;那就卖哪个&#xff01; 卖家做市场调查…

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

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

【动态规划】121. 买卖股票的最佳时机、122. 买卖股票的最佳时机 II

提示&#xff1a;努力生活&#xff0c;开心、快乐的一天 文章目录 121. 买卖股票的最佳时机&#x1f4a1;解题思路&#x1f914;遇到的问题&#x1f4bb;代码实现&#x1f3af;题目总结 122. 买卖股票的最佳时机 II&#x1f4a1;解题思路&#x1f914;遇到的问题&#x1f4bb;代…

DC电源模块工作效率的特点

BOSHIDA DC电源模块工作效率的特点 DC电源模块是一种常见的电源供应装置&#xff0c;它在广泛应用于各种电子设备中。它是一种直流电源&#xff0c;通常用于提供低压、高电流的电源&#xff0c;如电子器件、LED灯、无线路由器、计算机硬件等。DC电源模块的工作效率是其中一个非…

关于如何进行ChatGPT模型微调的新手指南

微调是指在预训练的模型基础上&#xff0c;通过进一步的训练来调整模型以适应特定任务或领域。预训练的模型在大规模的文本数据上进行了广泛的学习&#xff0c;从中获得了一定的知识和语言理解能力。然而&#xff0c;由于预训练并不针对具体任务&#xff0c;因此需要微调来使模…

启山智软/微信小程序商城

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 启山智软一、微信小程序商城二、微信小程序商城的定义微信小程序商城特点总结 启山智软 想要了解代码规范&#xff0c;学习商城解决方案&#xff0c;点击下方官网链…

11.1.0- iDesktopX新特性之统计面内对象数

作者&#xff1a;Mei 文章目录 一、属性更新二、面内统计对象数 当我们在做数据处理时&#xff0c;可能会遇到需要统计面内包含其他对象数的需求&#xff0c;在以往的iDesktopX 11i版本中&#xff0c;一般是用属性更新功能。今年发布的iDesktopX 11.1.0版本&#xff0c;有一个新…

创新学习方式,电大搜题助您迈向成功之路

近年来&#xff0c;随着信息技术的发展&#xff0c;互联网在教育领域发挥的作用越来越显著。贵州开放大学作为国内首家电视大学&#xff0c;一直致力于创新教学模式&#xff0c;帮助学生更好地获取知识。在学习过程中&#xff0c;学生常常遇到疑难问题&#xff0c;而解决这些问…

Python作业【简单算法题】

总结&#xff1a; 这次题目当中考点是基础知识&#xff0c;还有一些简单的算法&#xff0c;比如说动态规划&#xff0c;插入排序这些&#xff0c;以及切片的知识 筛选法&#xff1a; 这里说一下我对他的理解&#xff0c;之前一直不能理解为什么开个根号就可以减少算法的复杂…

【数据结构复习之路】栈和队列(本站最全最详细讲解) 严蔚敏版

复习完上面一章【线性表】&#xff0c;我们接着复习栈和队列&#xff0c;这篇文章我写的非常详细且通俗易懂&#xff0c;看完保证会带给你不一样的收获。如果对你有帮助&#xff0c;看在我这么辛苦整理的份上&#xff0c;三连一下啦ε٩(๑> ₃ <)۶з 目录: ☆ 栈 &am…

SpringBoot篇之集成Jedis、Lettuce、Redisson

目录 前言一、详解Jedis、Lettuce 和 Redisson的区别二、SpringBoot集成2.1 集成Jedis2.2 集成Lettuce2.3 集成Redisson 总结 前言 大家好&#xff0c;我是AK&#xff0c;最近在做新项目&#xff0c;基于旧项目框架修改&#xff0c;正好最近也在整理springboot相关知识&#x…

C语言系统化精讲(四): 条件判断语句

文章目录 一、if语句二、if…else语句三、else if语句四、if语句的嵌套五、条件运算符六、switch语句的基本形式七、多路开关模式的switch语句八、if…else语句和switch语句的区别 当我们是儿童时&#xff0c;父母就告诉我们记住这句 红灯停&#xff0c;绿灯行&#xff0c;黄灯…

JTS:11 Overlaps 部分重叠

这里写目录标题 版本代码1 多点与多点2 线与线3 面与面 版本 org.locationtech.jts:jts-core:1.19.0 链接: github 代码 /*** 部分重叠*/ public class GeometryOverlaps {private final GeometryFactory geometryFactory new GeometryFactory();private static final Logg…

提升自动化测试效率的秘密武器——Allure Report

一.使用 Allure2 运行方式-Python # --alluredir 参数生成测试报告。 # 在测试执行期间收集结果 pytest [测试用例/模块/包] --alluredir./result/ (—alluredir这个选项 用于指定存储测试结果的路径)# 生成在线的测试报告 allure serve ./result二.使用 Allure2 运行方式-Ja…

TCP/IP(十四)流量控制

一 流量控制 说明&#xff1a; 本文只是原理铺垫,没有用tcpdumpwiresahrk鲜活的案例讲解,后续补充 ① 基本概念 流量控制: TCP 通过接受方实际能接收的数据量来控制发送方的窗口大小 ② 正常传输过程 背景:1、客户端是接收方,服务端是发送方 --> 下载2、假设接收窗…

Vue绑定样式

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