用Arduino控制大电流设备的几种方法
liuian 2024-12-08 16:25 46 浏览
Arduino是广受欢迎的简单易学的单片机控制器,但它们只能直接控制小电流设备。有几种方法可以扩展Arduino的功能,使其能够驱动更大的电流负载。今天,我们一起来探讨一下。
本文翻译自科普大神DroneBotWorkshop.com文章,浅显易懂适合新手入门
译者:DIY百事
目录
1 引言
2 晶体管和MOSFET
2.1双极结型晶体管(BJT)
2.2 MOSFET
2.3 BJT与MOSFET
3 我用到的BJT和MOSFET
3.1 TIP120达灵顿晶体管
3.2 IRF520 MOSFET
3.3流行的MOSFET模块
4 Arduino上用到的晶体管
4.1基本的Arduino晶体管开关
4.2开关感性负载
5 Arduino上用到的MOSFET
5.1 Arduino +MOSFET 控制 RGB 彩色 LED灯条
6 结论
介绍
Arduino是一个微控制器,您可能已经知道。“微控制器”这个名字恰恰告诉我们,该设备的主要用途是控制事物。“微型”部分仅表示它是非常小的设备。
Arduino或任何微控制器的体积都非常小。它还具有相当小的电流功能,将其使用范围限制为仅直接控制诸如单个LED,OLED和LCD显示器之类的小型设备。
当然,这并没有阻止我们控制更大的设备,例如齿轮马达和大型步进马达。我们通过使用驱动板来获取低电流Arduino控制信号并驱动高电流电机来实现这一点。在这些情况下,驱动板为我们完成了所有繁重的工作。
我们一直在使用的驱动器板使用晶体管和MOSFET之类的器件来实现其魔力。这些是在众多应用中使用的基本电子组件,实际上,Arduino本身是单个芯片上的晶体管的集合。
今天,我们将学习如何使用这些组件来扩展Arduino设计的电流驱动能力。
晶体管和MOSFET
1947年,美国物理学家John Bardeen和Walter Brattain在新泽西州Murray Hill的Bell Labs的物理学家William Shockley的指导下工作,发明了第一个点接触晶体管。一年后,肖克利发明了第一个双极晶体管并申请了专利。
这项工作使这三个人因其对半导体的研究和对晶体管效应的发现而获得了1956年的诺贝尔物理学奖。他们的发明改变了世界。
晶体管实际上是当今创建的每个电子设备的基础。我们知道和喜爱的功能强大的台式计算机和紧凑型智能手机的存在,要归功于蚀刻在硅芯片上的微型晶体管。没有晶体管,医学,太空研究甚至互联网本身的进步都不会实现。
晶体管取代了真空管,它们可以用作放大器或电子开关。我们将利用后者的功能。
双极结型晶体管(BJT)
“标准”晶体管是双极结型晶体管或BJT。这些有时称为双极晶体管。
BJT有以下三个极:
- 基极
- 发射极
- 集电极
BJT有两种类型-NPN和PNP。
BJT是电流驱动的,也就是说,当电流在基极和发射极之间流动时,它会导通。
足够的电流流入基极将导通晶体管,并使电流在发射极和集电极之间流动。
当BJT接通时,其行为非常类似于二极管。从某种意义上讲,您可以将其视为可开关二极管。
场效应管
金属氧化物半导体场效应晶体管(MOSFET)在许多方面都是对BJT的改进。这是一种使用低电压实现开关功能的高阻抗设备。
与BJT一样,MOSFET具有三个极:
- Gate栅极
- Drain漏极
- Source源极
MOSFET有两种类型,N沟道和P沟道。
该图说明了电路中的MOSFET,其中低压源连接到栅极。
当向栅极施加足够的电压时,MOSFET导通。
这允许电流在漏极和源极之间流动。MOSFET导通时,其作用就像一个非常低值的电阻。
由于MOSFET的导通电阻非常低,因此它们不会消耗太多功率,因此即使没有散热片,它们也可以避免高温。
BJT与MOSFET
那么,两种类型的晶体管中哪一种最适合您的设计?
答案并不总是那么简单,因为双极结型晶体管(BJT)和MOSFET都有各自的优缺点。
此图表概述了其中一些差异:
如您所见,在大多数应用中,MOSFET与BJT相比具有一些明显的优势。但是在某些情况下,例如在放大器的设计中,或者需要节约成本时,双极结型晶体管可能是更好的选择。
常用的晶体管和MOSFET
这是我们将在实验中使用的元件。它们都是电子商店里常见的元件。您可以用其他类似规格的元件代替。
TIP120达灵顿晶体管
TIP120是NPN达林顿功率晶体管。它可以以8安培的峰值电流和5安培的常态工作电流驱动高达60伏的负载。
达林顿晶体管由同一封装中的一对晶体管组成。第一晶体管的发射极与第二晶体管的基极连接,并且两个晶体管的集电极连接在一起以形成达林顿对。
这种布置提高了晶体管的电流增益和额定电流。
以下是TIP120的主要规格:
- NPN中功率达林顿晶体管
- 高直流电流增益(hFE),通常为1000
- 集电极连续电流(IC)为5A
- 集电极-发射极电压(VCE)为60V
- 集电极-基极电压(VCB)为60V
- 发射极-基极电压(VBE)为5V
- 静态电流(IB)为120mA
- 峰值负载电流为8A
- 采用To-220封装
IRF520 MOSFET
IRF520是功率MOSFET, 具有9.2A集电极电流和100V的击穿电压。该MOSFET的栅极阈值电压低至4伏,因此通常与Arduino等微控制器一起使用,以控制大电流负载。
以下是IRF520的主要规格:
- N沟道功率MOSFET
- 常态工作漏极电流(ID):9.2A
- 漏极至源极击穿电压:100V
- 漏源电阻(RDS)为0.27欧姆
- 栅极阈值电压(VGS-th)为4V(最大)
- 上升时间和下降时间分别为30nS和20nS
- 由于其低阈值电压,它通常与Arduino一起使用。
- 采用To-220封装
流行的MOSFET模块
我选择将IRF520用于MOSFET实验的原因之一是它可以作为低成本模块使用。该模块具有一些支持组件,以及用于控制电源和负载的螺钉端子。它还具有一个3针连接器,用于连接Arduino或其他微控制器。
我将在MOSFET示例中使用这些模块,但您也可以选择使用分立的IRF520。我将在接线图中向您展示两种方式。
晶体管在Arduino中的应用
在前几个实验中,我们将使用TIP120功率达灵顿BJT。如果没有TIP120,则可以用类似规格的BJT代替。
我将在实验中使用6V电池和负载,但您可以使用任何直流电源并负载40V以下的电压。不要尝试使用您将这些方法来控制交流电压,因为这些都是严格的直流电路。
基本的Arduino晶体管开关
第一个实验是基本的开关。这是一个简单的连接和代码,它说明了用晶体管和Arduino控制负载的简单性。
对于大电流负载,我使用的是6伏白炽灯泡。如果愿意,可以选择其他阻性负载。
下面是接线图:
请注意,除了Arduino,TIP120,灯泡和电池外,您还需要一个按钮开关和几个电阻。2.2k电阻限制流入晶体管基极的电流,而10k电阻器则是开关的上拉电阻。
以下是Arduino代码:
/*
Transistor Switch Demonstration
transistor-switch-demo.ino
Demonstrates use of BJT to switch 6-volt incandescent lamp
Uses pushbutton for input
DroneBot Workshop 2019
https://dronebotworkshop.com
*/
// Output pin to transistor base
int outPin = 9;
// Input pin from pushbutton
int buttonPin = 3;
// Pushbutton value
int buttonVal;
void setup()
{
// Setup transistor pin as output
pinMode(outPin, OUTPUT);
// Setup pushbutton pin as input
pinMode(buttonPin, INPUT);
// Make sure transistor is off
digitalWrite(outPin, LOW);
}
void loop()
{
//Read pushbutton input
buttonVal = digitalRead(buttonPin);
//Check button position
if (buttonVal == HIGH) {
// Button is not pressed, turn off lamp
digitalWrite(outPin, LOW);
delay(20);
} else {
// Button is pressed, turn on lamp for 5 seconds
digitalWrite(outPin, HIGH);
delay(5000);
digitalWrite(outPin, LOW);
}
}
我们的控制实验的代码非常简单。其目的是在按下按钮时点亮灯泡5秒钟。
我们首先定义变量来表示晶体管的输出引脚和开关的输入引脚。我们还定义了一个变量来保存按钮值。
在setup中,我们设置输入和输出,然后向输出引脚写入LOW,以确保我们在晶体管关闭的情况下进入循环。
在loop循环中,我们读取输入引脚并将其值用作按钮值。如果它为高电平,则尚未按下按钮,并且10k电阻器将输入拉高至5伏。
如果按下该按钮,则输入将接地,并且该值将为LOW。我们通过将输出设置为高电平来打开灯,该输出将电流通过2.2k电阻器传递到晶体管基极。
我们希望灯光保持一会儿,所以我们增加了5秒的延迟。然后,我们将输出设置为LOW以关闭灯泡,然后返回并完成循环。
加载代码并观察结果。您可以根据需要增加或减少延迟。
开关感性负载
我们刚才在晶体管和Arduino上看到的布置对于阻性负载效果很好,但是对于电感性负载,还有另一个考虑因素。
您可能会问什么是感性负载?
感性负载是指使电流通过线圈的任何负载。例如电动机,继电器和螺线管。
当电流通过线圈时,会产生磁场,并且在相反的方向上会产生小电流。有时称为“反向EMF”或“背压”。
诸如电动机或螺线管之类的设备在运动时可能会产生较大的反电动势。反向电压会损坏晶体管,因此需要对其进行保护。
防止反向EMF损坏的最常见方法是使用以“相反”极性接线的二极管。这吸收了反向电压。
在我们的实验中,我们将使用小型直流电动机形式的感应负载。
注意电机引线两端的二极管,我使用了一个非常常见的设备IN4004整流二极管。
其余的接线非常简单。我再次使用6伏电池为实验的高电流侧供电,并且我们使用2.2k电阻来限制流向晶体管基极的电流。
我们还添加了一个电位计,以便我们可以控制电机速度。
这是我们将用于电机控制的代码:
/*
Transistor Inductive Control Demonstration
transistor-induct-control-demo.ino
Demonstrates use of BJT to control a 6-volt DC motor
Uses potentiometer for input
DroneBot Workshop 2019
https://dronebotworkshop.com
*/
// Output pin to transistor base
int outPin = 9;
// Input from potentiometer
int potIn = A0;
// Variable to hold speed value
int speedVal;
void setup()
{
// Setup transistor pin as output
pinMode(outPin, OUTPUT);
}
void loop()
{
// Read values from potentiometer
speedVal = analogRead(potIn);
// Map value to range of 0-255
speedVal = map(speedVal, 0, 1023, 0, 255);
// Write PWM to transistor
analogWrite(outPin, speedVal);
delay(20);
}
这也是一个简单的代码,其目的是读取电位计的位置并相应地设置电动机速度。
我们首先定义到晶体管的输出以及电位计使用的模拟输入引脚。我们还定义了一个变量t来保存电动机速度,
在setup代码段,我们要做的就是将晶体管连接定义为输出。
在loop中,我们读取电位计的位置,然后使用map命令将其转换为0-255的范围。然后,我们使用analogWrite命令将PWM信号发送到我们的晶体管。这会打开和关闭晶体管,为我们的电机供电。
加载代码并通过控制电动机速度进行实验。因为我们使用的是PWM,所以即使在较慢的速度下,电动机也应具有良好的转矩。
如果您需要控制小型直流电动机的速度并且不需要反转它,那么这实际上是一个实用的电路。请注意,晶体管有0.7V的压降。
MOSFET在Arduino上的应用
与BJT相比,MOSFET具有许多优势。它们的成本更高,但是只要多花一些钱,就可以将它们连接到逻辑电路上,从而获得更好的功耗和简便性。
我们将在实验中使用IRF520 N沟道功率MOSFET。我将使用一种流行的“ MOSFET模块”,该模块可以简化将外部设备连接到微控制器的过程,但是您也可以只使用分立的MOSFET。
Arduino MOSFET RGB LED灯条驱动器
我们的实验将涉及使用Arduino控制5米长的RGB LED灯条。我们将有三个电位器来控制所有三种颜色的强度,使我们能够模拟出彩虹的颜色。
您将需要三个MOSFET或MOSFET模块进行连接,以及一个12伏电源,该电源具有足够的电流来为LED灯带供电,这可能会消耗数安培。
我在设计中使用了MOSFET模块,但是如果要使用分立MOSFET,则可以使用此图将两者等效。
请注意,模块上的VCC引脚未连接任何东西。另外,Vin和V +引脚只是连在一起。
该图未显示额外的1k电阻和模块用来在MOSFET栅极输入上显示活动的LED。
这是接线图。
回想起来,您不需要从电源正极到模块V +的连接,它们实际上并没有连接到任何地方。仅需要与LED灯带正极公共端的连接。
连接非常简单,本质上我们将三个电位计连接到三个模拟输入,将三个MOSFET模块连接到能够进行PWM的输出引脚。LED灯条通过MOSFET输出连接到电源。
这是我们将用来完成所有工作的代码:
/*
MOSFET RGB LED Strip Demonstration
mosfet-rgb-led-demo.ino
Demonstrates use of MOSFETs to drive RGB LED Strip
Uses three potentiometers for input
DroneBot Workshop 2019
https://dronebotworkshop.com
*/
// Output pins to MOSFETs
int redPin = 3;
int greenPin = 5;
int bluePin = 6;
// Define Potentiometer Inputs
int redControl = A0;
int greenControl = A1;
int blueControl = A2;
// Variables for Values
int redVal;
int greenVal;
int blueVal;
void setup()
{
// Setup MOSFET pins as outputs
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
// Setup Serial Monitor
Serial.begin(9600);
}
void loop() {
// Read values from potentiometers
redVal = analogRead(redControl);
greenVal = analogRead(greenControl);
blueVal = analogRead(blueControl);
// Map values to range of 0-255
redVal = map(redVal, 0, 1023, 0, 255);
greenVal = map(greenVal, 0, 1023, 0, 255);
blueVal = map(blueVal, 0, 1023, 0, 255);
// Write PWM to pins
analogWrite(redPin, redVal);
analogWrite(greenPin, greenVal);
analogWrite(bluePin, blueVal);
// Write Color values to Serial Monitor
Serial.print("Red: ");
Serial.print(redVal);
Serial.print(" - Green: ");
Serial.print(greenVal);
Serial.print(" - Blue: ");
Serial.println(blueVal);
// Add a slight delay
delay(20);
}
另一个简单的代码,实际上与我们用BJT控制电机的代码非常相似。
我们定义了将用于MOSFET输出的引脚,以及三个电位计使用的模拟引脚。我们还定义了三个变量来保存三个颜色值。
在设置中,我们将连接到MOSFET的引脚设置为输出。我们还设置了串行监视器,这是可选的,仅用于故障排除。
在循环中,我们读取三个电位器,将它们的值转换为0-255的范围,然后将PWM发送到三个MOSFET开关以控制我们的LED。这很简单。
一旦一切都准备就绪,请尝试一下。如果您无法正常工作,请查看串行监视器,以查看从电位计获得的值。
这是一个丰富多彩的实验!
结论
通过使用BJT和MOSFET,我们可以扩展Arduino项目的控制能力。我们不再局限于40ma以下的设备。
我在这里向您展示的技术可用于各种直流负载,包括感性和非感性。但是它们不能用于控制交流设备,因此不要尝试。还有其他控制交流设备的方法,我们将在以后的文章和视频中介绍它们。
祝大家玩得开心!
相关推荐
- 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可以挖掘出系统最大能处...
- 一周热门
-
-
【验证码逆向专栏】vaptcha 手势验证码逆向分析
-
Python实现人事自动打卡,再也不会被批评
-
Psutil + Flask + Pyecharts + Bootstrap 开发动态可视化系统监控
-
一个解决支持HTML/CSS/JS网页转PDF(高质量)的终极解决方案
-
再见Swagger UI 国人开源了一款超好用的 API 文档生成框架,真香
-
网页转成pdf文件的经验分享 网页转成pdf文件的经验分享怎么弄
-
C++ std::vector 简介
-
飞牛OS入门安装遇到问题,如何解决?
-
系统C盘清理:微信PC端文件清理,扩大C盘可用空间步骤
-
10款高性能NAS丨双十一必看,轻松搞定虚拟机、Docker、软路由
-
- 最近发表
-
- python入门到脱坑函数—定义函数_如何定义函数python
- javascript函数的call、apply和bind的原理及作用详解
- JS中 call()、apply()、bind() 的用法
- Pandas每日函数学习之apply函数_apply函数python
- Win10搜索不习惯 换个设定就好了_window10搜索用不了怎么办
- 面试秘籍:call、bind、apply的区别,面试官为什么总爱问这三位?
- 记住这8招,帮你掌握“追拍“摄影技法—摄影早自习第422日
- [Sony] 有点残酷的测试A7RII PK FS7
- AndroidStudio_Android使用OkHttp发起Http请求
- ESL-通过事件控制FreeSWITCH_es事务控制
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- vscode切换git分支 (35)
- python bytes转16进制 (35)
- grep前后几行 (34)
- hashmap转list (35)
- c++ 字符串查找 (35)
- mysql刷新权限 (34)