22-ESP32-S3模数转换器(ADC)

ESP32-S3模数转换器(ADC)

什么是模数转换器(ADC)🔍?


模数转换器(ADC)是一种将模拟信号(如电压)转换为数字信号的设备。在ESP32-S3中,ADC用于将模拟电压转换为数字值,以便微控制器可以处理。

ADC 转换器可分为:

  • 并行比较型A/D 转换器(FLASH ADC)
  • 逐次比较型A/D 转换器(SAR ADC)
  • 双积分式A/D 转换器(Double Integral ADC)

ESP32-S3中集成了两个SAR ADC

A/D 转换过程通常为 4 步:采样、保持、量化和编码:
在这里插入图片描述

  1. 采样:在这个阶段,连续的模拟信号被转换为离散的信号。这是通过在特定的时间间隔内测量信号的值来完成的。

  2. 保持:在这个阶段,采样值被“保持”或固定,以便进行下一步的量化。这是必要的,因为量化过程需要一定的时间,而我们不希望在这个过程中输入信号发生变化。

  3. 量化:在这个阶段,保持的采样值被近似为一组预定义的离散值。这是通过将输入信号的范围划分为一组小的区间(每个区间对应一个数字值)来完成的。

  4. 编码:在这个阶段,量化的值被转换为数字二进制代码,以便于数字系统处理。

这四个步骤共同构成了模数转换的过程,使得模拟信号可以被数字系统处理和理解。

衰减值和分辨率的概念🎊


衰减值

衰减值(Attenuation)在模数转换器(ADC)中,指的是在将模拟信号送入ADC进行转换之前,通过电子电路(如分压器)有意降低信号幅度的过程。这样做主要是为了匹配ADC的输入范围,确保信号不会超过ADC的最高可测量电压(满量程电压)。如果原始信号的电压范围超过了ADC的输入电压限制,不进行衰减可能会导致信号失真或者损坏ADC。

对于衰减值11dB意味着信号功率或电压幅度减少大约一半。在分贝(dB)的表达中,功率衰减遵循公式:

dB = 10 ⋅ log ⁡ 10 ( P 1 P 2 ) \text{dB} = 10 \cdot \log_{10} \left( \frac{P_1}{P_2} \right) dB=10log10(P2P1)

至于电压衰减,鉴于功率与电压平方成正比 P ∝ V 2 P \propto V^2 PV2,相应的转换公式为:

dB = 20 ⋅ log ⁡ 10 ( V 1 V 2 ) \text{dB} = 20 \cdot \log_{10} \left( \frac{V_1}{V_2} \right) dB=20log10(V2V1)

因此,若信号遭受11dB的衰减,这意指着电压幅度减小约 1 0 11 20 \sqrt{10^{\frac{11}{20}}} 102011 倍,等价于更直观的百分比形式,即信号维持了原初幅度的大约79.4%,或者说损失了20.6%。更精确地,

V 2 = V 1 ⋅ 1 0 − 11 20 ≈ 0.891 V 1 V_2 = V_1 \cdot 10^{-\frac{11}{20}} \approx 0.891V_1 V2=V11020110.891V1

因此,经历11dB衰减的信号,其电压水平将减至初始值的约89.1%,相应地,电压幅度减少了大约10.9%。

分辨率

在模数转换器(ADC)领域,分辨率是指ADC能够区分输入模拟信号细微差异的能力,即能够检测的最小电压变化量。简而言之,它体现了ADC输出数字信号时的精度。

分辨率通常由ADC的位数来表述。一个N位的ADC能够输出 2 N 2^N 2N个不同的数字量。例如,一个8位的ADC能够输出从0到255即 ( 2 8 − 1 ) (2^8 - 1) (281) 的数字值,而一个12位的ADC则能输出0到4095即 ( 2 12 − 1 ) (2^{12} - 1) (2121) 的值。这意味着,12位的ADC相比8位ADC,在相同的电压范围内能够提供更精细的量化。

分辨率与实际电压的对应关系可通过以下公式计算:
分辨率 = 满量程电压 2 N − 1 \text{分辨率} = \frac{\text{满量程电压}}{2^N - 1} 分辨率=2N1满量程电压
假设一个ADC的工作电压范围是0至3.3V,对于一个12位的ADC:
分辨率 = 3.3 V 4095 ≈ 0.000806 V 或者 0.806 m V \text{分辨率} = \frac{3.3V}{4095} \approx 0.000806V 或者 0.806mV 分辨率=40953.3V0.000806V或者0.806mV
这意味着,如果输入电压有任何大于0.806毫伏的变化,12位的ADC就能检测到并反映在输出的数字值上。因此,高分辨率ADC适合用于需要高度精确测量的应用场景,如精密仪器、传感器读数或是音频处理等领域。

ESP32-S3的ADC特性


ESP32-S3 集成了两个 12 位 SAR(逐次逼近寄存器) ADC,ADC1 和 ADC2,支持20 个模拟通道输入。这 20个模拟通道输入对应着具体的 IO。

ADC1型:

  • 10 通道:GPIO1 - GPIO10

ADC2型:

  • 10 通道:GPIO11 - GPIO20

ESP32-S3的ADC模块的分辨率为12位,所以AD转换后的值范围为0~4095。由于ESP32-S3的工作电压为3.3V,所以当AD值为4095时,对应的电压为3.3V;当AD值为0时,对应的电压为0V。

这里的关系可以用一个简单的公式来表示,即:

引脚输入的电压 = 引脚 A D 的值 4095 × 3.3 V 引脚输入的电压 = \frac{引脚AD的值}{4095} \times 3.3V 引脚输入的电压=4095引脚AD的值×3.3V

如何使用ESP32-S3的ADC


1️⃣配置 ADC

该函数用于配置 ADC 各项参数,其函数原型如下所示:

esp_err_t adc_digi_controller_configure(const adc_digi_configuration_t *config)

该函数的形参描述如下:

形参描述
config指向 ADC 配置结构体的指针,需自行定义,并根据 ADC 的配置参数填充结构体中的成员变量

该函数的返回值描述如下:

返回值描述
ESP_OK返回:0,配置成功
ESP_ERR_INVALID_ARG无效参数
ESP_ERR_INVALID_STATE驱动程序状态无效

该函数使用 adc_digi_configuration_t 类型的结构体变量传入 ADC 外设的配置参数,该结构体的定义如下所示:

typedef struct {bool conv_limit_en;uint32_t conv_limit_num;uint32_t pattern_num;adc_digi_pattern_config_t *adc_pattern;uint32_t sample_freq_hz;adc_digi_convert_mode_t conv_mode;adc_digi_output_format_t format;
} adc_digi_configuration_t;

该函数的使用示例如下:

#include "driver/gpio.h"void example_fun(void)
{adc_digi_pattern_config_t adc1_digi_pattern_config; // 定义 ADC1 的模式配置结构体adc_digi_configuration_t adc1_init_config; // 定义 ADC1 的初始化配置结构体/* 配置 ADC1 */adc1_digi_pattern_config.atten = ADC_ATTEN_DB_11; // 设置衰减为 11dBadc1_digi_pattern_config.channel = ADC_ADCX_CHY; // 设置通道为 ADC_ADCX_CHYadc1_digi_pattern_config.unit = ADC_UNIT_1; // 设置单元为 ADC_UNIT_1adc1_digi_pattern_config.bit_width = ADC_BITWIDTH_12; // 设置位宽为 12 位adc1_init_config.adc_pattern = &adc1_digi_pattern_config; // 将 ADC1 的模式配置结构体赋值给初始化配置结构体的 adc_pattern 成员adc_digi_controller_configure(&adc1_init_config); // 调用 adc_digi_controller_configure 函数配置 ADC 数字控制器
}

当然,以下是整理后的格式:

2️⃣读取 ADC 原始数据

该函数用于读取 ADC 原始数据,其函数原型如下所示:

int adc1_get_raw(adc1_channel_t channel);

该函数的形参描述如下:

形参描述
channelADC 通道

该函数的返回值描述如下:

返回值描述
-1读取失败
其他值ADC 的原始数值

该函数的使用示例如下:

uint32_t adc_get_result_average(uint32_t ch, uint32_t times)
{uint32_t temp_val = 0; // 定义一个临时变量用于存储 ADC 读取的值uint8_t t;for (t = 0; t < times; t++) // 循环 times 次{temp_val += adc1_get_raw(ch); // 读取 ADC 的原始值并累加到 temp_valvTaskDelay(5); // 延时 5ms}return temp_val / times; // 返回平均值
}

程序设计 💻


首先配置ADC以从通道7(即GPIO8)读取电压,然后将读取到的电压值打印到串口。

#include "driver/adc.h"
#include "esp_adc_cal.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_log.h"#define ADC_CHANNEL ADC_CHANNEL_7 // GPIO8
#define ADC_ATTEN ADC_ATTEN_DB_11
#define ADC_UNIT ADC_UNIT_1
#define ADC_WIDTH ADC_WIDTH_BIT_12
#define NUM_SAMPLES 64 // 多次采样
#define TAG "ADC"void example_fun(void)
{adc_digi_pattern_config_t adc1_digi_pattern_config; // 定义 ADC1 的模式配置结构体adc_digi_configuration_t adc1_init_config; // 定义 ADC1 的初始化配置结构体adc1_digi_pattern_config.atten = ADC_ATTEN_DB_11; // 设置衰减为 11dBadc1_digi_pattern_config.channel = ADC_CHANNEL; // 设置通道为 ADC_CHANNELadc1_digi_pattern_config.unit = ADC_UNIT_1; // 设置单元为 ADC_UNIT_1adc1_digi_pattern_config.bit_width = ADC_BITWIDTH_12; // 设置位宽为 12 位adc1_init_config.adc_pattern = &adc1_digi_pattern_config; // 将 ADC1 的模式配置结构体赋值给初始化配置结构体的 adc_pattern 成员adc_digi_controller_configure(&adc1_init_config); // 调用 adc_digi_controller_configure 函数配置 ADC 数字控制器
}uint32_t adc_get_result_average(uint32_t ch, uint32_t times)
{uint32_t temp_val = 0; // 定义一个临时变量用于存储 ADC 读取的值uint8_t t;for (t = 0; t < times; t++) // 循环 times 次{temp_val += adc1_get_raw(ch); // 读取 ADC 的原始值并累加到 temp_valvTaskDelay(5); // 延时 5ms}return temp_val / times; // 返回平均值
}void app_main(void)
{example_fun(); // 配置 ADCwhile (1) // 无限循环{uint32_t voltage = adc_get_result_average(ADC_CHANNEL, NUM_SAMPLES); // 读取 ADC 的平均值ESP_LOGI(TAG, "平均ADC读数: %d", voltage); // 将 ADC 的平均值打印到串口vTaskDelay(pdMS_TO_TICKS(1000)); // 延时 1s}
}

总结

参考资料
正点原子DNESP32S3 开发板教程-IDF 版
乐鑫ESP32-IDF

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

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

相关文章

深入图像分类:使用美国手语数据集训练定制化神经网络

引言 在前一篇博客中&#xff0c;我们探讨了如何使用MNIST数据集训练一个基础的神经网络来进行手写数字识别。在本文中&#xff0c;我们将更进一步&#xff0c;使用美国手语字母表&#xff08;ASL&#xff09;数据集来构建一个定制化的图像分类模型。通过这个过程&#xff0c;…

羊大师:羊奶营养好选择

羊大师&#xff1a;羊奶营养好选择 羊奶确实是一种营养丰富的饮品&#xff0c;它被视为乳品中的精品&#xff0c;被称为“奶中之王”是世界上公认的最接近人奶的乳品。以下是一些羊奶的主要营养成分和其对人体的益处&#xff1a; 蛋白质&#xff1a;羊奶中的蛋白质含量丰富&a…

k8s部署maven项目

failed to verify certificate: x509: certificate signed by unknown authority 今天在执行kubectl get nodes的时候报的证书验证问题&#xff0c;看了一圈首次搭建k8s的都是高频出现的问题。 couldn’t get current server API group list: Get “https://kubernetes.docker…

什么是死锁?代码演示,死锁如何排查和解决

死锁的概念 死锁是指在多线程或多进程中&#xff0c;两个或两个以上的线程或进程在执行过程中&#xff0c;因抢夺资源而造成的一种相互等待的现象。简单来说&#xff0c;就是两个或两个以上的线程或进程都在等待对方释放资源&#xff0c;从而导致所有线程或进程都无法继续执行的…

【python】python标准化考试系统[单项选择题 简易版](源码)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

[python]texthero安装后测试代码

测试环境&#xff1a; anaconda3python3.8 texthero1.1.0 测试代码来自官方&#xff1a;https://github.com/jbesomi/texthero 代码&#xff1a; import texthero as hero import pandas as pddf pd.read_csv("https://gitee.com/FIRC/texthero/raw/master/dataset/…

解决Linux中磁盘满/dev/vda1使用率100%问题

发现根目录下占用100%&#xff0c;具体还要排场到底是有哪些大文件占用 那么就在根目录下查询各个子文件夹的占用状态&#xff0c;有过大不用的即可删除 df -h *我的磁盘是100G&#xff0c;但这些总共加起来也接近不了这个数值 那就是有可能出现 已删除空间却没有释放的进程…

用python画一个正八边形

1 问题 使用turtle库的turtle.fd()函数和turtle.seth()函数绘制一个边长100的正八边形。 2 方法 1、利用for循环解决如何画出图形中相同的八条边的问题。 2、再利用turtle.fd()函数和turtle.seth()函数画出完整的图形。 代码清单 1 import turtleturtle.pensize(2)d0for i in r…

Mybatis进阶(映射关系多对一 )

文章目录 1.需求分析2.应用实例&#xff08;xml配置&#xff09;1.数据表设计2.entity设计&#xff08;不要使用toString会栈溢出&#xff09;1.Pet.java2.User.java 3.编写Mapper1.PetMapper.java2.UserMapper.java 4.编写Mapper.xml1.UserMapper.xml2.PetMapper.xml 5.测试Us…

初识Vue-组件化开发(应用实例)

目录 一、任务管理应用 1.介绍 2.代码 1. 任务列表组件 (TaskList.vue) 2. 添加任务组件 (AddTask.vue) 3. 应用入口组件 (App.vue) 4. 主入口文件 (main.js) 3.效果 4.总结 二、购物车 1.介绍 2.代码 1. 商品列表组件 (ProductList.vue) 2. 购物车组件 (Cart.vue…

Web APIs 学习归纳6--- BOM浏览器对象

前面几节主要针对DOM进行了学习&#xff0c;现在开始新的内容的学习---DOM浏览器对象。 DOM是更注重页面&#xff08;document&#xff09;内容的设计&#xff0c;但是BOM不仅限于页面&#xff08;document&#xff09;的设计&#xff0c;而是更加全面包括页面的刷新&#xff0…

【数据结构】:链表的带环问题

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;数据结构 &#x1f337;追光的人&#xff0c;终会万丈光芒 前言&#xff1a; 链表的带环问题在链表中是一类比较难的问题&#xff0c;它对我们的思维有一个比较高的要求&#xff0c;但是这一类…

拌合楼管理系统(十六)c#如何实现点击同时启动两个窗体,并且窗体全部关闭后才退出程序

前言&#xff1a; 好长时间没有再写博文了&#xff0c;最近项目有个需求&#xff0c;无人值守程序需要一个client端&#xff0c;主要实现两个功能&#xff0c;一个是显示安装的四个监控的画面&#xff0c;一个是显示地磅称重数量和车牌列表等一些信息。今天主要解决如何显示两个…

SQL注入漏洞--报错/union/布尔盲注/时间盲注

之前介绍了数据库的基本操作&#xff0c;今天这篇文章就来实操SQL注入。 阅读本文前可以先看一下基本操作&#xff0c;有助于更换理解本文。。。 https://blog.csdn.net/weixin_60885144/article/details/138356410?spm1001.2014.3001.5502 what SQL---结构化查询语言---S…

【目标检测】DEtection TRansformer (DETR)

一、前言 论文&#xff1a; End-to-End Object Detection with Transformers 作者&#xff1a; Facebook AI 代码&#xff1a; DEtection TRansformer (DETR) 特点&#xff1a; 无proposal&#xff08;R-CNN系列&#xff09;、无anchor&#xff08;YOLO系列&#xff09;、无NM…

从一到无穷大 #25 DataFusion:可嵌入,可扩展的模块化工业级计算引擎实现

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作)&#xff0c;由 李兆龙 确认&#xff0c;转载请注明版权。 文章目录 引言架构总览与可扩展性Catalog and Data SourcesFront End逻辑计划与逻辑计划优化器…

美国零售媒体(广告业)指南:快速增长、不断扩展的业态和新兴机遇

Guide to retail media: Rapid growth, expanding formats, and emerging opportunities --- 零售媒体如何通过CTV和其他合作伙伴关系向上发展 原文作者&#xff1a;Sara Lebow | 2024年2月16日 整理编辑&#xff1a;数字化营销工兵 I 2024年5月2日 ​​​​​​​ &#…

Agent AI智能体:如何借助机器学习引领科技新潮流

文章目录 &#x1f4d1;前言一、Agent AI智能体的基本概念二、Agent AI智能体的技术进步2.1 机器学习技术2.2 自适应技术2.3 分布式计算与云计算 三、Agent AI智能体的知识积累3.1 知识图谱3.2 迁移学习 四、Agent AI智能体的挑战与机遇4.1 挑战4.2 机遇 小结 &#x1f4d1;前言…

python学习笔记B-15:序列结构之字典--字典的创建与删除

字典的创建与删除方法&#xff1a; import random #第1种创建方式 d {10:"cat", 20:"dog", 30:"monkey"} print(d) #第2种创建方式 lst1 [10,20,30] lst2["cat","dog","monkey"] d zip(lst1,lst2) print(dict…

DRF解析器源码分析

DRF解析器源码分析 1 解析器 解析请求者发来的数据&#xff08;JSON&#xff09; 使用 request.data 获取请求体中的数据。 这个 reqeust.data 的数据怎么来的呢&#xff1f;其实在drf内部是由解析器&#xff0c;根据请求者传入的数据格式 请求头来进行处理。 drf默认的解…