百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

Arduino应用实例——用L298N芯片驱动直流电机,智能小车必备

liuian 2024-12-08 16:24 77 浏览

在本次的文章中,我们将会介绍如何使用 Arduino 控制直流有刷电机。

直流有刷电机上生活中最为常见的电动机之一。小时候玩的四驱车采用的就是直流有刷电机。这种直流电机的驱动也是非常简单 ,只要给它接上直流电,电机就能转动,改变电源正负极,电机就能反转。那么我们怎么对电机进行调速并且更方便地切换电机的旋转方向呢?

我们知道,一个电机接两节干电池时的转速要比只接一节干电池要快得多。因此我们可以通过简单地控制电机的输入电压来控制直流电机的转速。最常用的方法是使用 PWM 信号控制电机。

PWM 直流电机控制

PWM 脉冲宽度调制(Pulse width modulation,PWM)是一种模拟控制方式,根据相应载荷的变化来调制晶体管基极或MOS管栅极的偏置,来实现晶体管或MOS管导通时间的改变,从而实现开关稳压电源输出的改变。这种方式能使电源的输出电压在工作条件变化时保持恒定,是利用微处理器的数字信号对模拟电路进行控制的一种非常有效的技术。它相当于我们通过快速打开和关闭电源来调整输入电子设备的电压的平均值。 平均电压取决于占空比,或者信号开启的时间与信号在一个周期内关闭的时间的比值。

因此,根据电机的大小,我们可以简单地将 Arduino PWM 输出连接到晶体管的基极或 MOS的栅极,并通过控制 PWM 输出来控制电机的速度。 低功率 Arduino PWM 信号打开和关闭 MOS上的栅极,通过该栅极驱动高功率电机。

注意:Arduino与电机电源需共地。

H-桥直流电机控制

我们已经学会了控制电机的速度,下一步就是控制电机的正反转。为了控制旋转方向,我们只需要反转通过电机的电流方向,最常用的方法是使用H桥。 H桥电路包含四个开关元件、晶体管或MOS,中间的电机形成类似H型的电路。通过同时激活两个特定的开关,我们就可以改变电流的方向,从而改变电机的旋转方向。比如只接通开关1,3电机正转,只接通2,4开关电机就会反转。

因此,如果我们将PWM和H桥这两种方法结合起来,我们就自如地控制直流电机了。实际上我们有许多具有这种功能的直流电机驱动器,L298N 就是其中最常用的模块之一。

L298N驱动模块

L298N 是双H桥电机驱动器,可同时控制两个直流电机的速度和方向。该模块可以驱动电压在5-35V之间的直流电机,峰值电流可达2A。

该模块左右各有两个螺钉接线端子用于连接电机A和B。中间的螺钉接线端子包括一个接地端,一个电机5-35V的供电端VCC以及一个5V接线端,它可以是输入或输出。这取决于电机 VCC 上使用的电压。 该模块具有板载5V稳压器,可使用跳线启用或禁用该稳压器。 如果电机电源电压高达 12V,我们可以启用5V稳压器,并且 5V 引脚可以用作输出,并为我们的 Arduino 板供电。 但如果电机电压大于 12V,我们必须断开跳线,因为过高的电压会损坏板载 5V 稳压芯片。 在这种情况下,5V 引脚将用作输入,因为我们需要将其连接到 5V 电源才能使 IC 正常工作。


接下来是信号端的接线。使能A(EnableA)和使能B(EnableB)引脚用于启用和控制电机速度。如果该引脚上存在跳线,电机将启动并以最大速度工作。我们也拆下跳线帽,将PWM输入此引脚,就可以控制电机的速度。如果我们将此针脚接地,电机将被禁用。

接下来,IN1和IN2引脚用于控制马达A的旋转方向,IN3和IN4用于马达B。我们通过这些引脚,来L298N IC内部H桥的开关。如果IN1输入低电平而IN2输入高电平,电机将正转,如果N1输入高电平而IN2输入低电平,电机将反转。如果两个引脚输入相同,电机将停止。这同样适用于IN3和IN4以及电机B。

Arduino L298N电机驱动

现在让我们连接上Arduino 做一个实际应用。我们将使用电位计控制电机的速度,并使用按钮改变旋转方向。下面是电路图。

硬件设备:

  • Arduino UNO控制器 × 1
  • 298N电机驱动模块 × 1
  • 直流电机 × 1
    • 电位计 × 1
    • 按钮 × 1
    • 12V 电源 × 1
    • 杜邦线 × n

Arduino代码

/*  Arduino 直流电机控制 - PWM | H-Bridge | L298N */
#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);
  // 设置初始旋转方向
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
}
void loop() {
  int potValue = analogRead(A0);  // 读取电位计值
  int pwmOutput = map(potValue, 0, 1023, 0 , 255); //将电位计值映射到 0- 255
  analogWrite(enA, pwmOutput); //  PWM信号输出
  // 读取按键值
  if (digitalRead(button) == true) {
    pressed = !pressed;
  }
  while (digitalRead(button) == true);
  delay(20);
   // 如果按键被按下,改变电机旋转方向
  if (pressed == true  & rotDirection == 0) {
    digitalWrite(in1, HIGH);
    digitalWrite(in2, LOW);
    rotDirection = 1;
    delay(20);
  }
  // 如果按键被按下,改变电机旋转方向
  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板的启用引脚,该引脚实际驱动电机。

接下来,我们检查是否按下了按钮,如果是值是真的,通过反向设置in1和in2状态来改变电机的旋转方向。该按钮将作为电机换向按钮,每次我们按下它,电机的旋转方向就会改变。

相关推荐

python入门到脱坑函数—定义函数_如何定义函数python

Python函数定义:从入门到精通一、函数的基本概念函数是组织好的、可重复使用的代码块,用于执行特定任务。在Python中,函数可以提高代码的模块性和重复利用率。二、定义函数的基本语法def函数名(...

javascript函数的call、apply和bind的原理及作用详解

javascript函数的call、apply和bind本质是用来实现继承的,专业点说法就是改变函数体内部this的指向,当一个对象没有某个功能时,就可以用这3个来从有相关功能的对象里借用过来...

JS中 call()、apply()、bind() 的用法

其实是一个很简单的东西,认真看十分钟就从一脸懵B到完全理解!先看明白下面:例1obj.objAge;//17obj.myFun()//小张年龄undefined例2shows(...

Pandas每日函数学习之apply函数_apply函数python

apply函数是Pandas中的一个非常强大的工具,它允许你对DataFrame或Series中的数据应用一个函数,可以是自定义的函数,也可以是内置的函数。apply可以作用于DataF...

Win10搜索不习惯 换个设定就好了_window10搜索用不了怎么办

Windows10的搜索功能是真的方便,这点用惯了Windows10的小伙伴应该都知道,不过它有个小问题,就是Windows10虽然会自动联网搜索,但默认使用微软自家的Bing搜索引擎和Edge...

面试秘籍:call、bind、apply的区别,面试官为什么总爱问这三位?

引言你有没有发现,每次JavaScript面试,面试官总爱问你call、bind和apply的区别?好像这三个方法成了通关密码,掌握了它们,就能顺利过关。其实不难理解,面试官问这些问题,不...

记住这8招,帮你掌握“追拍“摄影技法—摄影早自习第422日

杨海英同学提问:请问叶梓老师,我练习追拍时,总也不能把运动的人物拍清晰,速度一般掌握在1/40-1/60,请问您如何把追拍拍的清晰?这跟不同的运动形式有关系吗?请您给讲讲要点,谢谢您!摄影:Damia...

[Sony] 有点残酷的测试A7RII PK FS7

都是好机!手中利器!主要是最近天天研究fs5,想知道fs5与a7rii后期匹配问题,苦等朋友的fs5月底到货,于是先拿手里现有的fs7小测一下,十九八九也能看到fs5的影子,另外也了解一下fs5k标配...

AndroidStudio_Android使用OkHttp发起Http请求

这个okHttp的使用,其实网络上有很多的案例的,但是,如果以前没用过,copy别人的直接用的话,可以发现要么导包导不进来,要么,人家给的代码也不完整,这里自己整理一下.1.引入OkHttp的jar...

ESL-通过事件控制FreeSWITCH_es事务控制

通过事件提供的最底层控制机制,允许我们有效地利用工具箱,适时选择使用其中的单个工具。FreeSWITCH是一个核心交换与混合矩阵,它周围有几十个模块提供各种功能特性。我们完全控制了所有的即时信息,这些...

【调试】perf和火焰图_perf生成火焰图

简介perf是linux上的性能分析工具,perf可以对event进行统计得到event的发生次数,或者对event进行采样,得到每次event发生时的相关数据(cpu、进程id、运行栈等),利用这些...

文本检索控件也玩安卓?dtSearch Engine发布Android测试版

dtSearchEngineforLinux(原生64-bit/32-bitC++和JavaAPIs)和dtSearchEngineforWin&.NET(原生64-bi...

网站后台莫名增加N个管理员,记一次SQL注入攻击

网站没流量,但却经常被SQL注入光顾。最近,网站真的很奇怪,网站后台不光莫名多了很多“管理员”,所有的Wordpres插件还会被自动暂停,导致一些插件支持的页面,如WooCommerce无法正常访问、...

多元回归树分析Multivariate Regression Trees,MRT

多元回归树(MultivariateRegressionTrees,MRT)是单元回归树的拓展,是一种对一系列连续型变量递归划分成多个类群的聚类方法,是在决策树(decision-trees)基础...

JMETER性能测试_JMETER性能测试指标

jmeter为性能测试提供了一下特色:jmeter可以对测试静态资源(例如js、html等)以及动态资源(例如php、jsp、ajax等等)进行性能测试jmeter可以挖掘出系统最大能处...