ESP32入门六(读取引脚的模拟信号[2]:信号出现误差的原因)

在之前的章节中,我们测试了用ESP32来接收模拟电压信号,在测试中,读取到的数据与现实存在一定的误差,在这一篇中,我们尝试了解出现误差的原因和解决方法。

对于出现的误差,有多种软件和硬件方面的原因:

一、官方设置原因

二、代码原因

三、硬件原因

四、电源原因


我们对应这几个原因,一步一步来测试并尝试解决。

我们所使用的ESP32版本有许多(esp32,esp32-s2,esp32-c3,esp32-s3等),对于ADC的更新和优化也一直在进行。在本系列章节中所使用的版本为esp32,而该版本的ADC功能在使用过程中,体现是比较差的一个版本。

我们在官方文档中可以查到该版本的ADC功能的量程

ADC_ATTEN_DB_0      100 mV ~ 950 mV      (0.1V~0.95V)
ADC_ATTEN_DB_2_5   100 mV ~ 1250 mV   (0.1V~1.25V)
ADC_ATTEN_DB_6      150 mV ~ 1750 mV    (0.15V~1.75V)
ADC_ATTEN_DB_11    150 mV ~ 3100 mV    (0.15V~3.1V)

也就是说,在默认设置下,我们可以读取的电压范围为0.15V~3.1V,但是我们在上一章中所使用的是3.3V的引脚,也就是说,当电压为3.1V时,我们读取到的数据已经等于4095,但电压继续上升时,我们读取到的数据并不会继续增加。

我们可以用代码来测试这个现像,我们用ESP32的DAC功能来生成一个电压,同时用ADC功能来读取这个生成的电压,测试生成的电压和读取的电压是否相同。

#include <esp32-hal-adc.h>
uint8_t dac_value = 0;                            //DAC值,2^8长度
void setup() {Serial.begin(115200);
}void loop() {dac_value++;                              //DAC值累加float vout = (dac_value) * 3.3  / 255;    //DAC值转为电压值Serial.print("vout = ");Serial.print(vout);                     //串口输出当前输出的电压值dacWrite(25,dac_value);                   //25号引脚输出对应电压int adc_value = analogRead(4);            //4号引脚读取25号引脚输出的模拟值float vin = (adc_value*3.3)  / 4095;      //读取到的数据转为电压值Serial.print(" | ");Serial.print("vin = ");Serial.println(vin);                      //串口输出当前输入的电压值delay(1000);
}

 查看串口输出

我们可以观察到

当输出的电压到达0.06V时,读取到的电压为0.01V。误差为0.06

在观察过程中,误差慢慢增加,当输出电压到达2.47V时,读取到的电压为2.12V,误差达到最大误差值,为0.35。

之后,误差慢慢减少,当输出电压到达3.30V时,读取到的电压为3.25V,误差为0.05。

这时,我们发现,这与官方文档所说明的量程为0.15V~3.10V的又出现了偏差。


所以,我们继续尝试用另一个函数:analogReadMillivolts()来读取4号引脚的电压:

#include <esp32-hal-adc.h>
uint8_t dac_value = 0;                            //DAC值,2^8长度
void setup() {Serial.begin(115200);
}void loop() {dac_value++;                              //DAC值累加float vout = (dac_value) * 3.3  / 255;    //DAC值转为电压值Serial.print("vout = ");Serial.print(vout);                     //串口输出当前输出的电压值dacWrite(25,dac_value);                   //25号引脚输出对应电压float vin = analogReadMillivolts(4)/1000.0;   //4号引脚读取25号引脚的电压值Serial.print(" | ");Serial.print("vin = ");Serial.print(vin);                      //串口输出当前输入的电压值Serial.print(" | ");Serial.print("deviation = ");Serial.println(vout - vin);             //串口输出当前输出与输入的误差delay(100);
}

读取的结果同样并不完美,同样出现误差的变化,但对比之前,误差已经在一定的范围内

当读取到的电压到达3.1V时,超量了0.04V,误差最大为0.14。

至此,我们大概已经可以了解到,在代码层面出现误差的原因有两点:

一、官方设置的量程问题

二、与analogRead()相比较,使用analogReadMillivolts()函数能更精确地读取对应的电压值。

        我们在官方文档中详细地了解一下这两个函数:ADC — Arduino-ESP32 2.0.14 documentation

analogRead()函数的作用是用于读取指定引脚的ADC值,返回的结果未经过校准。

        

analogReadMillivolts()函数的作用是用于读取指定引脚的ADC值,并返回转换为以毫伏为单位的校准结果。

至此,我们在本章中已经了解了软件方面导致数据出现误差的原因,在下一章中,我们将介绍在硬件方面导致数据出现误差的原因。

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

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

相关文章

【计算机毕业设计】SSM汽车维修预约平台

项目介绍 本项目分为前后台&#xff0c;前台为普通用户登录&#xff0c;后台为管理员登录&#xff1b; 管理员角色&#xff1a; 管理员登录,新增管理员信息,查看管理员信息,查询管理员信息,查看用户信息列表,查询用户信息,新增新闻公告,查看新闻公告,查询新闻公告,新增配件类…

04-获取认证的用户身份信息

存储用户信息的方式 获取用户信息的流程 用户提交账号和密码后,DaoAuthenticationProvider调用UserDetailsService接口实现类的loadUserByUsername()方法,该方法可以接收请求参数username的值,然后根据该值查询用户信息,最后将账号,密码,权限封装到UserDetails对象中并返回给…

通过AWS Endpoints从内网访问S3

AWS S3作为非结构化数据的存储&#xff0c;经常会有内网中的app调用的需求。S3默认是走公网访问的&#xff0c;如果内网app通过公网地址访问S3并获取数据会消耗公网带宽费用。如下图所示&#xff1a; AWS 提供了一种叫做endpoints的资源&#xff0c;这种资源可以后挂S3服务&a…

ES的使用(Elasticsearch)

ES的使用&#xff08;Elasticsearch&#xff09; es是什么&#xff1f; es是非关系型数据库&#xff0c;是分布式文档数据库&#xff0c;本质上是一个JSON 文本 为什么要用es? 搜索速度快&#xff0c;近乎是实时的存储、检索数据 怎么使用es? 1.下载es的包&#xff08;环境要…

三巨头对决:深入了解pnpm、yarn与npm

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 三巨头对决&#xff1a;深入了解pnpm、yarn与npm 前言包管理器简介npm&#xff08;Node Package Manager&#xff09;&#xff1a;Yarn&#xff1a;pnpm&#xff08;Performant Npm&#xff09;&#…

python爬虫进阶-每日一学(GIF验证码识别)

目的 学习更多的python反爬虫策略 测试网址 http://credit.customs.gov.cn/ccppserver/verifyCode/creator分析 01 下载gif图片 02 使用ddddocr逐帧识别 03 如指定字符串出现次数大于等于3&#xff0c;则认定为正确的识别结果 经验证&#xff0c;识别成功率95%源码 #!/usr…

07-C++ 异常

异常 1. 概念 异常事件&#xff08;如&#xff1a;除 0 溢出&#xff0c;数组下标越界&#xff0c;所要读取的文件不存在,空指针&#xff0c;内存不足等等&#xff09; 在C 语言对错误的处理是两种方法&#xff1a; 一是使用整型的 返回值标识错误&#xff1a;二是使用 errno…

swing快速入门(三十二)消息对话框

注释很详细&#xff0c;直接上代码 上一篇 新增内容 1.自定义对话框前列图标 2.消息对话框的若干种形式 package swing21_30;import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent;public class swing_test_30 {// 定义一个JFrameJFrame jFrame n…

Redis内存使用率高,内存不足问题排查和解决

问题现象 表面现象是系统登录突然失效&#xff0c;排查原因发现&#xff0c;使用redis查询用户信息异常&#xff0c;从而定位到redis问题 if (PassWord.equals(dbPassWord)) {map.put("rtn", 1);map.put("value", validUser);session.setAttribute("…

初识智慧城市

文章目录 智慧家居 智慧社区 智慧交通 智慧医疗 智慧教育 智慧旅游 智慧农业 智慧安防 智慧家居 利用智能语音、智能交互等技术,实现用户对家居系统各设备的远程操控和能控制如开关窗帘(窗户)、操控家用电器和照明系统、打扫卫生等操作。利用计算机视觉等技术,对被照看…

java爬虫(jsoup)如何设置HTTP代理ip爬数据

目录 前言 什么是HTTP代理IP 使用Jsoup设置HTTP代理IP的步骤 1. 导入Jsoup依赖 2. 创建HttpProxy类 3. 设置代理服务器 4. 使用Jsoup进行爬取 结论 前言 在Java中使用Jsoup进行网络爬虫操作时&#xff0c;有时需要使用HTTP代理IP来爬取数据。本文将介绍如何使用Jsoup设…

智能监控平台/视频共享融合系统EasyCVR海康设备国标GB28181接入流程

TSINGSEE青犀视频监控汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力&…

sqlilabs第三十二三十三关

Less-32&#xff08;GET - Bypass custom filter adding slashes to dangerous chars) 手工注入 由 宽字符注入可知payload 成功触发报错 http://192.168.21.149/Less-32/ ?id1%df 要写字符串的话直接吧字符串变成ascii码 注意16进制的表示方式 自动注入 sqlmap -u http:…

饥荒Mod 开发(二二):显示物品信息

饥荒Mod 开发(二一)&#xff1a;超大便携背包&#xff0c;超大物品栏&#xff0c;永久保鲜 饥荒Mod 开发(二三)&#xff1a;显示物品栏详细信息 饥荒中的物品没有详细信息&#xff0c;基本上只有一个名字&#xff0c;所以很多物品的功能都不知道&#xff0c;比如浆果吃了也不知…

鸿蒙4.0实战教学—基础ArkTS(简易视频播放器)

构建主界面 主界面由视频轮播模块和多个视频列表模块组成&#xff0c;效果图如图&#xff1a; VideoData.ets中定义的视频轮播图数组SWIPER_VIDEOS和视频列表图片数组HORIZONTAL_VIDEOS。 // VideoData.ets import { HorizontalVideoItem } from ./HorizontalVideoItem; impo…

35.搜索插入位置

给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target 5 输出: 2示例 2: 输入:…

大开眼界,速看!Solid Edge各版本安装指南

下载链接 https://pan.baidu.com/s/1g3QEGoLsjD7JaudZUOW96Q?pwd0531 1.鼠标右击【Solid Edge2024(64bit)】压缩包&#xff08;win11及以上系统需先点击“显示更多选项”&#xff09;【解压到 Solid Edge2024(64bit)】。 2.打开解压后的文件夹&#xff0c;双击打开【Setup】文…

【前端技术】LocalForage数据存储

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

算法训练营Day26

#Java #全排列 #回溯 开源学习资料 Feeling and experiences&#xff1a; 递增子序列&#xff1a;力扣题目链接 给你一个整数数组 nums &#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。 数组…

《PCI Express体系结构导读》随记 —— 第I篇 第1章 PCI总线的基本知识(18)

接前一篇文章&#xff1a;《PCI Express体系结构导读》随记 —— 第I篇 第1章 PCI总线的基本知识&#xff08;17&#xff09; 1.4 PCI总线的中断机制 1.4.2 中断信号与PCI总线的连接关系 在PCI总线中&#xff0c;INTx信号属于边带信号。所谓边带信号是指这些信号在PCI总线环境…