esp32学习笔记(4)——adc


前言

ADC即模拟数字转换器(Analog-to-digital converter)是用于将模拟形式的连续信号转换数字形式的离散信号的一类设备。一个模拟数字转换器可以提供信号用于测量。与之相对的设备成为数字模拟转换器。
例如温度、压力、声音或者图像等,需要转换成更容易储存、处理和发射的数字形式。那就可以用到ADC了


提示:以下是本篇文章正文内容,下面案例可供参考

一、ESP32 ADC相关介绍

一些 ADC2 引脚用作捆绑引脚(GPIO 0、2、15),因此不能自由使用。
ESP32 DevKitC:由于外部自动编程电路,GPIO 0 无法使用。
ESP-WROVER-KIT:GPIO 0、2、4 和 15 不能使用,因为用于不同目的的外部连接。
由于 ADC2 模块也被 Wi-Fi 使用,因此它们一起使用时只有一个可以抢占,这意味着adc2_get_raw()可能会被阻塞直到 Wi-Fi 停止

ESP32 集成了 2 个 SAR(逐次逼近寄存器)ADC,总共支持 18 个测量通道(模拟使能引脚)。
ADC1,8通道:GPIO32 - GPIO39
ADC2,10个通道:GPIO0、GPIO2、GPIO4、GPIO12 - GPIO15、GOIO25 - GPIO27
以下介绍通过ADC1进行介绍
2、ADC衰减
Vref 是 ESP32 ADC 内部用于测量输入电压的参考电压。ESP32 ADC 可以测量从 0 V 到 Vref 的模拟电压。在不同的芯片中,Vref 不同,中位数为 1.1 V。为了转换大于 Vref 的电压,可以在输入 ADC 之前对输入电压进行衰减。有 4 种可用的衰减选项,衰减越高,可测量的输入电压就越高。
在这里插入图片描述
3、ADC 转换
ADC 转换是将输入模拟电压转换为数字值。ADC 驱动程序 API (adc1_get_raw())提供的 ADC 转换结果是原始数据。Single Read 模式下 ESP32 ADC 原始结果的分辨率为 12 位。
如果根据ADC采集的原始数据来计算电压那可以用Vout(输出电压)=Dout(输出的数据)*Vmax(最大测量电压)/Dmax(最大输出数据)
ps:如果是带有ADC校准位的板子可以直接调用esp_adc_cal_raw_to_voltage()来直接读取输出电压,单位为mv
4、ADC 单次读取
在配置好位宽adc1_config_width()和衰减adc1_config_channel_atten()之后就可以直接调用adc1_get_raw(),读取结果了;值得说明的是官方也提供给了从ULP直接读取ADC1通道的结果,但是这个要在配置的时候调用adc1_ulp_enable()来使能ULP

二、使用步骤

1.接口函数介绍

(1)设置通道衰减

esp_err_t adc1_config_channel_atten(adc1_channel_t channel,adc_atten_t atten )

第一个参数是设置ADC通道,第二个参数是设置衰减等级;默认衰减是0dB;通过官方给的衰减设置可以看到,衰减设置的越大,那么可采集的电压范围就越大(通过对输入电压进行衰减)
返回值:
ESP_OK 成功
ESP_ERR_INVALID_ARG 参数错误
在这里插入图片描述

在这里插入图片描述
(2)配置ADC的捕获位宽

esp_err_t adc1_config_width( adc_bits_width_t width_bit )

参数:ADC1 的位捕获宽度
返回值:
ESP_OK 成功
ESP_ERR_INVALID_ARG 参数错误
在这里插入图片描述

(3)读取单个通道上的ADC数据

int adc1_get_raw( adc1_channel_t channel)

返回
-1:参数错误
其他:ADC1 通道读数。
参数
channel: ADC1 通道读取

(4)初始化数字ADC

esp_err_t adc_digi_initialize(const adc_digi_init_config_t *init_config )

参数:数字ADC的初始化配置adc_digi_init_config_t 在这个结构体里面;
返回:

    • ESP_ERR_INVALID_ARG 参数错误
    • ESP_ERR_NOT_FOUND 没有找到中断空闲
    • ESP_ERR_NO_MEM 内存不足
    • ESP_OK 成功
      在这里插入图片描述
      结构体中参数依次是
      1)转换后的数据可以存储的最大长度。
      2)在一个中断中可以转换的数据字节数
      3)待初始化的ADC1通道列表。
      4)需要初始化的ADC2通道列表。

(5)通过 DMA 从数字 ADC 读取字节。

esp_err_t adc_digi_read_bytes(uint8_t *buf, uint32_t length_max, uint32_t *out_length, uint32_t timeout_ms);

[out] buf:从 ADC 读取的缓冲区。
[in] length_max:从 ADC 读取的预期数据长度。
[out] out_length:从 ADC 读取的数据的实际长度。
[in] timeout_ms:等待数据的时间,以毫秒为单位。
返回
ESP_ERR_INVALID_STATE 驱动状态无效。通常这意味着 ADC 采样率快于任务处理率。
ESP_ERR_TIMEOUT 操作超时
ESP_OK 成功
(6)启动数字ADC和 DMA

esp_err_t adc_digi_start(void);

返回
ESP_ERR_INVALID_STATE 驱动状态无效。
ESP_OK 成功
(6)设置数字控制器

esp_err_t adc_digi_controller_configure(const adc_digi_configuration_t *config);

返回值:
ESP_ERR_INVALID_STATE 驱动状态无效。
ESP_ERR_INVALID_ARG 如果参数组合无效。
ESP_OK 成功
参数为adc_digi_configuration_t 结构体
在这里插入图片描述
结构体中参数依次是
1)限制ADC转换的时间,转换完成后是否停止
2)限制ADC转换触发器上限1-255
3)ADC通道数
4)初始化结构体配置参数

  • 3
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
ESP32的FreeRTOS使用上与传统的FreeRTOS有一些区别。在ESP32中,基本不需要单独配置FreeRTOSConfig.h文件,因为ESP-IDF中的menuconfig功能可以对所有涉及到的内容进行配置,使用起来更加直观和便利。主要的数据类型说明中,有一个重要的数据类型是TickType_t。 在ESP32的魔改版FreeRTOS中,很少使用正经的事件集,而是使用ESP-IDF提供的更方便的事件循环。这使得在ESP32中使用事件循环更加方便。 另外,ESP32的分区表是采用二进制格式而不是CSV文件。ESP-IDF提供了gen_esp32part.py工具来配置和构建分区表。默认情况下,使用的是默认分区表。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [【ESP32+freeRTOS学习笔记-(一)freeRTOS介绍】](https://blog.csdn.net/weixin_45499326/article/details/128226443)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [ESPIDF开发ESP32学习笔记ESP32上的FreeRTOS】](https://blog.csdn.net/qq_40500005/article/details/114794039)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值