一起玩儿物联网人工智能小车(ESP32)——17. 用ESP32的ADC功能读取电源电压

摘要:本文主要介绍如何使用ESP32的ADC功能,读取物联网智能小车的电池电压

今天介绍一个ESP32的新功能——如何利用ESP32的引脚,采集模拟量信息。在前面GPIO的学习中我们知道,可以利用GPIO的引脚读取外部设备输出的高低电平信号,这种只有2种高低电平的信号是数字信号,而具有连续数值的信号则属于模拟信号,比如我们今天要读取的电源电压就属于模拟信号。

ADC(Analog to Digital Converter:模数转换器)的功能就是将外部设备的模拟电压信号,转换成数字量,从而让单片机能够识别和进行处理。在前面GPIO学习的时候,已经强调过了,虽然除了电源引脚之外的引脚都是GPIO引脚,但有些引脚只能输入,有些引脚已经被特殊功能给占用了,开发者是不能使用的。ADC功能同样如此,也是需要注意有哪些引脚可以使用,具体的对应关系如下表所示:

GPIO

模拟功能

注释

GPIO0

ADC2_CH1

Strapping 管脚

GPIO2

ADC2_CH2

Strapping 管脚

GPIO4

ADC2_CH0

GPIO12

ADC2_CH5

Strapping 管脚;JTAG

GPIO13

ADC2_CH4

JTAG

GPIO14

ADC2_CH6

JTAG

GPIO15

ADC2_CH3

Strapping 管脚;JTAG

GPIO25

ADC2_CH8

GPIO26

ADC2_CH9

GPIO27

ADC2_CH7

GPIO32

ADC1_CH4

GPIO33

ADC1_CH5

GPIO34

ADC1_CH6

GPI

GPIO35

ADC1_CH7

GPI

GPIO36

ADC1_CH0

GPI

GPIO37

ADC1_CH1

GPI

GPIO38

ADC1_CH2

GPI

GPIO39

ADC1_CH3

GPI

通过上表可以看到,ESP32芯片有两个ADC单元,分别是ADC1和ADC2,ADC单元就相当于可以独立完成ADC功能的机器,而这两个ADC单元可以工作在不同的工作模式,两者不会互相影响。

上表中一共列举了18个GPIO引脚,这就相当于给ADC单元供货的18个传送带,它们负责把外部的模拟信号,传递给ADC单元,这18个传送带的学名叫通道(Channel),与ADC1连接的有8个通道,分别命名为CH0、CH1、CH2……直到CH7。与ADC2连接的有10个通道,分别命名为CH0、CH1、CH2……直到CH9。所以,在将一个模拟信号接入到GPIO引脚的时候,一定要知道连接的是哪一个通道以及哪一个ADC单元。关于ADC通道引脚,有以下几个事项需要特别注意:

  1. 只能将模拟信号接入上面表格中的GPIO引脚,接入其他引脚是无法进行ADC转换,无法采集模拟信号的。
  2. 在使用ADC功能的时候,在GPIO一节中介绍的那些不能使用的GPIO引脚同样适用ADC功能,已经被内部占用的引脚同样不能用作ADC功能。
  3. 当模块启用Wi-Fi的时候,ADC2单元会被占用,此时不能使用ADC2进行模数转换,只能使用ADC1来进行模数转换,需要将模拟信号接入到ADC1的10个通道。ADC2的10个通道全部都不能用作ADC功能了。
  4. 要注意ADC引脚的可测量范围在0~3.3V,所以接入的模拟信号不要高于3.3V。

ESP32这两个ADC都是12位SAR(逐次逼近)ADC。也就是最高的精度为12位,即为 2^12 = 4096,先记住4096这个数字,后边会进一步的讲解。在实际使用中,也可以将ADC的精度通过软件设置位11位、10位或者9位。

ESP32的ADC单元有两种工作模式:

  1. ADC单次读取模式:适用于低频采样。
  2. ADC连续(DMA)模式:适用于高频连续采样。

好了,ADC功能先基本介绍到这里了,可能初次接触的一下觉得有些复杂,不好理解。下面就来看一下我们是如何实现电源电压采集的吧,使用的方法还是很简单的。

在上边已经介绍过了,ESP32的ADC通道引脚最多支持3.3V的输入电压,而我们的电源电压是12V左右的,是不能直接连接到GPIO引脚的。在这里我们就需要使用到分压模块,该模块的作用就是将电压分压到原来的五分之一,样子如下图所示,这样我们的电源电压就转换成了0~3V以内了。没有这个模块的,可以直接按照串联电阻分压原理,找2个合适的电阻,自己搭建一个也是可以的。

这个分压模块的原理如下图所示。

根据原理图,我们只需要把左侧的VCC连接电池的正极,GND连接电池的负极。右侧的“-”端连接到ESP32开发板的GND引脚,“S”端连接到ESP32的P35引脚(也可以使用别的引脚)就可以了。

接下来就可以使用Mixly进行开发读取电源电压值的程序了。在这个功能中,我们主要用到了“输入/输出”功能模块区的“模拟输入”功能,该功能可以直接将指定引脚的电压信号转换成数字信号。我们在程序中将这个采集的数字输出出来,就可以计算出我们电池的电源电压了。最简单的读取电压的程序如下图所示:

下面就运行一下,看看输入结果吧。我的输出结果如下图所示:

我们看到,每一次的输出,都是一个4位数的整数,那么如何转换成我们想要的电压值呢?这就要用到我们前面介绍的ADC转换精度的知识了。默认情况下,ADC使用的是12位的转换精度,那么转换的结果就是0~4095,也就是说0对应0V电压,4095对应3.3V的电压。那么把采集的数除以4095,然后再乘以3.3V就是GPIO引脚的输入电压了。最后别忘了,我们使用了分压电路,计算的结果还要再乘以5才是真正的电源电压。具体计算公式如下所示:

2855/4095*3.3*5=11.5

这就说明,我们电源的电压是11.5V。是不是很简单?你成功了吗?

最后,我们再看一下Mixly的源代码,了解一下用程序代码是如何工作的吧。

void setup(){

  Serial.begin(115200);

}

void loop(){

  Serial.println(analogRead(35));

}

只需要调用analogRead()函数就把P35引脚的电压信号转换成数字值了。但实际上ADC的工作不是那么简单的,在读取模拟信号值之前也是要进行一系列配置的,只不过这个配置过程都由开发工具在背后默默的完成了,其使用到的参数都是参数的默认值。当我们需要进行个性定制话ADC转换的时候,就没这么简单了。这在以后遇到了再详细的讲解吧。

前边用Mixly生成C语言的方式获得了供电电压的数值。接下来再用MicroPython语言也实现这个功能,其实现方法和之前的C语言基本一样,只不过增加了一个参考电压的设置,参考电压的值越大,ADC可测量的输入的模拟信号的电压值越高,我们将其配置为3.3V,具体开发方法如下所示:

上传该程序后,在串口窗口输出了返回的结果,如下图所示:

输出值为45755,啊!和前面的输出值不同啊?别担心,没出问题。这是因为MicroPython将ADC的结果转换为了在0~65535之间,所以,这个测量结果在计算被测电压的时候,要除以的数值是65535,而不是4095了。具体计算公式如下:

45755/65535*3.3*5=11.5

没错,两次测量的结果是一样的。但是C语言与MicroPython在这里对处理结果的差别要注意一下,不然,计算出来的结果就不对了。Mixly生成的MicroPython代码如下所示:

import machine

adc35 = machine.ADC(machine.Pin(35))

adc35.atten(machine.ADC.ATTN_11DB)

print(adc35.read_u16())

自己尝试一下读懂它吧?

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

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

相关文章

什么是LangChain

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版,欢迎购买。点击进入详情 LangChain 是一个旨在简化使用大型语言模型(LLM)创建应用程序的框架。它提供了许多功能,使与LLM的合作变得更加容易&#xff0c…

【Mybatis】我抄袭了Mybatis,手写一套MyMybatis框架:学会使用mybatis框架

上一篇文章中,我们学习了通过JDBC与MySQL进行交互。如果我们平常在项目中使用mybatis框架作为我们的orm框架。这一次我们就来学习如何使用框架。我们项目中使用到maven。我们直接通过pom文件的方式给他引入进来。 MyBatis是一个简单而强大的持久层框架,…

SParC数据集介绍

导语 SParC是Text-to-SQL领域的一个多轮查询数据集。本篇博客将对该数据集论文和数据格式进行简要介绍。 SParC数据集概述 SParC是一个跨领域的多轮Text-to-SQL数据集。它包含有4298个问题轮次,大约有12k的自然语言问句到SQL标注的Question-SQL对。这些问题来自于…

JavaWeb的Servlet的入门和使用方法

1 什么是Servlet Servlet是Server Applet的简称,是用Java编写的是运行在 Web 服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。使用 Servlet,可以收集来自网页表单的用户输…

提升FTP上传速度的方法(提升FTP下载速度的技巧)

在企业日常经营中,快速上传和下载文件至关重要。然而,在使用FTP(文件传输协议)进行文件传输时,速度可能成为瓶颈。为了提升工作效率,以下是一些建议,可以帮助企业提高FTP上传下载速度。 1、确保…

BERT的学习

BERT 1.前言 self-supervised learning是一种无监督学习的特殊形式,算法从数据本身生成标签或者目标,然后利用这些生成的目标来进行学习。(也就是说数据集的标签是模型自动生成的,不是由人为提供的。)例如&#xff0…

万能刷题小程序源码系统:功能强大+试题管理+题库分类+用户列表 附带完整的搭建教程

随着互联网技术的不断进步,线上学习已成为越来越多人的选择。刷题作为提高学习效果的重要方式,一直受到广大学生的喜爱。然而,市面上的刷题软件虽然繁多,但功能各异,质量参差不齐,使得很多用户在选择时感到…

STM32F4系列单片机库函数模板工程创建

目录 一、工程配置 1、新建工程 2、芯片选择 3、工程子文件夹创建 (1)FWLIB文件夹添加文件 (2)CORE文件夹添加文件 (3)USER文件夹添加文件 4、工程设置 (1)工程中添加文件夹…

【前端技术】Vite vs Webpack

✨专栏介绍 在当今数字化时代,Web应用程序已经成为了人们生活和工作中不可或缺的一部分。而要构建出令人印象深刻且功能强大的Web应用程序,就需要掌握一系列前端技术。前端技术涵盖了HTML、CSS和JavaScript等核心技术,以及各种框架、库和工具…

Banana Pi BPI-M4 Berry 全志H618开发板快速使用手册

介绍 BPI-M4 Berry 开发板是一款功能强大的单板计算机 (SBC),利用 Allwinner H618 片上系统 (SoC) 的功能为开发人员提供令人印象深刻的性能和丰富的功能。与 Raspberry Pi 4b 类似,BPI-M4 Berry 拥有可比的 CPU 性能、LPDDR4 内存支持、集成 WiFi 和蓝…

人机验证码生成与验证:提升系统安全性

一、前言 为了防止机器人或脚本程序自动化攻击和滥用系统资源,很多网站和应用程序需要使用验证码来判断用户是否为真人。 一般登录都要求用户手动输入以验证身份的安全措施。验证码是一种通过生成包含随机字符的图像或文本,通常包含了不同大小写字母、数…

内网穿透的应用-Ubuntu安装XRDP远程桌面结合内网穿透实现远程桌面Ubuntu

文章目录 一、 同个局域网内远程桌面Ubuntu二、使用Windows远程桌面连接三、公网环境系统远程桌面Ubuntu1. 注册cpolar账号并安装2. 创建隧道,映射3389端口3. Windows远程桌面Ubuntu 四、 配置固定公网地址远程Ubuntu1. 保留固定TCP地址2. 配置固定的TCP地址3. 使用…

工业4.0、 工业互联网、智能制造与设备通信协议 Modbus OPC MQTT

工业4.0是指第四次工业革命的核心概念,它代表了制造业的一种转型趋势,即通过深度整合数字化、互联和智能化技术,实现生产方式的革新。以下是对工业4.0主要特点的概述: 数字化:将物理世界与虚拟世界紧密连接&#xff0c…

ros2+gazebo+urdf:ros2机器人使用gazebo的urdf文件中的<gazebo>部分官网资料

原文链接SDFormat extensions to URDF (the gazebo tag) — Documentation 注意了ros2的gazebo部分已经跟ros1的gazebo部分不一样了: Toggle navigation SpecificationAPIDocumentationDownload Back Edit Version: 1.6 Table of C…

多维时序 | Matlab实现PSO-GCNN粒子群优化分组卷积神经网络多变量时间序列预测

多维时序 | Matlab实现PSO-GCNN粒子群优化分组卷积神经网络多变量时间序列预测 目录 多维时序 | Matlab实现PSO-GCNN粒子群优化分组卷积神经网络多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 Matlab实现PSO-GCNN粒子群优化分组卷积神经网络多…

Qt/C++音视频开发61-多屏渲染/一个解码渲染到多个窗口/画面实时同步

一、前言 多屏渲染就是一个解码线程对应多个渲染界面,通过addrender这种方式添加多个绘制窗体,我们经常可以在展会或者卖电视机的地方可以看到很多电视播放的同一个画面,原理应该类似,一个地方负责打开解码播放,将画面…

谷歌 SGE 和生成式 AI 在搜索中:2024 年会发生什么

2024 年,Google 的搜索生成体验将如何影响营销?探索 AI 驱动的搜索趋势、SERP 中的 SGE、自然流量影响等。 最初,Labs 中的 Google 搜索生成体验 (SGE) 实验预计将于 2023 年 12 月“结束”。但随着谷歌实验室网站的最…

nodejs+vue+微信小程序+python+PHP的勤工俭学系统-计算机毕业设计推荐

微信小程序端 (1)首页。顶部展示公告,下方展示兼职信息详情,按时间倒序,求职者可以根据兼职内容信息和行业进行模糊筛选用人单位的招聘信息,点击某条信息可查看其信息内容和用人单位的信息(包括…

用C语言找最大值最小值极值问题---------(C每日一编程)

一&#xff0c;输入十个数&#xff0c;输出其中的最大值 采用打擂台的方法 void main() {int i, max, a[10];for (i 0; i < 10; i)scanf("%d", &a[i]);max a[0];for (i 1; i < 10; i)if (a[i] > max)max a[i];printf("%d\n", max); } 二…

蓝牙物联网在汽车领域的应用

I、蓝牙的技术特点 ​ 1998 年 5 月&#xff0c;瑞典爱立信、芬兰诺基亚、日本东芝、美国IBM 和英特尔公司五家著名厂商&#xff0c;在联合拓展短离线通信技术的标准化活动时提出了蓝牙技术的概念。蓝牙工作在无需许可的 2.4GHz 工业频段 (SIM)之上(我国的频段范围为2400.0~248…