ESP32 IDF开发 驱动篇⑧ ADC简单实用与介绍

  • 1、博主写这篇技术文章的目的:
  • 2、ESP32 ADC的概述
  • 3、ADC库的介绍
  • 4、软件设计
  • 5、实例分析
  • 6、以下是调试的结果:



别迷路-导航栏
快速导航找到你想要的(文章目录)


此篇文章如果对你有用,请点赞收藏,您的支持就是博主坚持的动力。

1、博主写这篇技术文章的目的:

(1)了解ESP32 模块ADC相关的功能;
(2)掌握esp32 ADC的编程方法;

2、ESP32 ADC的概述

ESP32 集成了 2 个 12 位逐次逼近模数转换器 (SAR ADC),由 5 个专用转换器控制器管理.支持 18 个通道(模拟使能引脚)的测量. ADC 还可测量 vdd3.3V 等内部信号.其中一些引脚可用于设计 1 个可编程增益放大器,用于测量微弱模拟信号。SAR ADC 使用的 5 个控制器均为专用控制器,其中 2 个支持高性能多通道扫描、2 个经过优化可支持 Deep-sleep 模式下的低功耗运行,另外 1 个专门用于 PWDET/ PKDET (功率检测和峰值监测)。

ADC 驱动程序 API 支持 ADC1(8 个通道,连接到 GPIO 32-39)和 ADC2(10 个通道,连接到 GPIO 0,2,4,12-15和 25-27)。但是使用 ADC2 的应用程序存在一些限制:仅当 Wi-Fi 驱动程序未启动时,应用程序才能使用 ADC2,因为具有更高优先级的 Wi-Fi 驱动程序也使用 ADC。

某些 ADC2 引脚用作捆扎引脚(GPIO 0,2,15),因此无法自由使用. 例如,官方开发套件:

ESP32 Core Board V2 / ESP32 DevKitC:由于外部自动编程电路,无法使用 GPIO0. ESP-WROVER-KIT V3:由于外部连接用于不同目的,因此无法使用 GPIO 0,2,4 和 15。

主要特性:

· 采用 2 个 SAR ADC,可支持同时采样与转换
· 采用 5 个专用 ADC 控制器,可支持不同应用场景(比如,高性能、低功耗,或功率检测和峰值检测)
· 支持 18 个模拟输入管脚
· 1 个内部电压 vdd33 通道、2 个 pa_pkdet 通道(部分控制器支持)
· 可配置 12 位、11 位、10 位、9 位多种分辨率
· 支持 DMA(1 个控制器支持)
· 支持多通道扫描模式(2 个控制器支持)
· 支持 Deep-sleep 模式运行(1 个控制器支持)
· 支持 ULP 协处理器控制(2 个控制器支持)

ADC引脚功能介绍:

怎么读取ESP32资料 esp32读取adc_嵌入式硬件

3、ADC库的介绍

有关ADC详细函数请参msys32\esp-idf\components\driver\include\driver\adc.h
在这里我只做几个重要经常使用的API函数讲解
ADC库函数主要讲解:设置adc精度、设置装换通道、读取转换数据。
设置adc精度:

/**
  * @brief 配置ADC1捕获宽度,同时使能ADC1的输出反转。
  *该配置适用于ADC1的所有通道
  * @param width_bit ADC1的位捕获宽度
  *
  * @return
  *-ESP_OK成功
  *-ESP_ERR_INVALID_ARG参数错误
  */
esp_err_t adc1_config_width(adc_bits_width_t width_bit);

设置装换通道:

/**
 * @brief 设置ADC1上特定通道的衰减,并配置其衰减

 *默认的ADC满量程电压为1.1V。要读取更高的电压(最高为引脚最大电压,
 *通常3.3 V)要求将该ADC通道的信号衰减设置为> 0 dB。
 *当VDD_A为3.3 V时:
 *-0 dB衰减(ADC_ATTEN_DB_0)提供满量程电压1.1 V
 *-2.5 dB衰减(ADC_ATTEN_DB_2_5)提供1.5 V的满量程电压
 *-6 dB衰减(ADC_ATTEN_DB_6)提供了2.2V的满量程电压
 *-11 dB衰减(ADC_ATTEN_DB_11)提供3.9V的满量程电压(请参见下面的注释)
 *
 * @note 满量程电压是对应于最大读数的电压(取决于配置的ADC1)
 *位宽,此值为:12位为4095,11位为2047,10位为1023,9位为511。)
 *
 * @note 在11 dB衰减时,最大电压受VDD_A限制,而不是满量程电压。
 *
 *由于ADC的特性,在以下近似电压范围内可获得最准确的结果:
 *
 *-100至950 mV之间的0 dB衰减(ADC_ATTEN_DB_0)
 *-100至1250 mV之间的2.5 dB衰减(ADC_ATTEN_DB_2_5)
 *-150至1750 mV之间的6 dB衰减(ADC_ATTEN_DB_6)
 *-150至2450 mV之间的11 dB衰减(ADC_ATTEN_DB_11)
 *
 *为了获得最高的精度,请使用ADC校准API并测量这些建议范围内的电压。
 *
 * @param 通道ADC1通道进行配置
 * @param 衰减等级
 *
 * @return
 *-ESP_OK成功
 *-ESP_ERR_INVALID_ARG参数错误
 */
esp_err_t adc1_config_channel_atten(adc1_channel_t channel, adc_atten_t atten);
esp_err_t adc2_config_channel_atten(adc1_channel_t channel, adc_atten_t atten);

读取转换数据:

/**
  * @brief 信息从单个通道获取ADC1读数。
  * @param 通道ADC1通道读取
  * @return
  *--1:参数错误
  *-其他:ADC1通道读数。
  */
int adc1_get_raw(adc1_channel_t channel);
/**
  * @brief 在单个通道上获取ADC2读数
  * @param通道ADC2通道读取
  * @param width_bit ADC2的位捕获宽度
  * @param raw_out用于保存输出数据的变量。
  * @返回
  *-如果成功,则为ESP_OK
  *-ESP_ERR_TIMEOUT使用ADC2启动WIFI
  */
esp_err_t adc2_get_raw(adc2_channel_t channel, adc_bits_width_t width_bit, int *raw_out);

4、软件设计

Adc的软件设计比较简单直接调用API函数即可。

5、实例分析

复制上一个工程改名字为 idf_adc即可 文件名字改为 idf_adc.C makefile文件也改成 PROJECT_NAME := idf_adc即可,然后复制一下代码测试。

/**********************************************************************
*               文件名:            idf_adc.c
*               创建人:            
*               创建日期:           
*               修改人:
*               修改日期:           
*               版本号:            V1.1
*               备注:
*               公司:
********************************************************************/
#include <stdio.h>
#include "string.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/uart.h"
#include "driver/gpio.h"
#include <stdio.h>
#include <stdlib.h>
#include "driver/adc.h"
#include "esp_adc_cal.h"
/***********************************************************************
* 函数:  
* 描述:   主函数
* 参数:
* 返回: 无
* 备注:
************************************************************************/
void app_main()
{    
    //ADC1的配置
    adc1_config_width(ADC_WIDTH_BIT_12);        //12位AD,采样范围0-4095
    adc1_config_channel_atten(ADC_CHANNEL_6, ADC_ATTEN_DB_0);//gpio34
    //ADC2的配置
    adc2_config_channel_atten(ADC_CHANNEL_0, ADC_ATTEN_DB_0);//gpio4
    for(;;)
    {
        int adc2_Val = 0;
        int adc1_Val = adc1_get_raw(ADC_CHANNEL_6);
        adc2_get_raw(ADC_CHANNEL_0,ADC_WIDTH_BIT_12,&adc2_Val);
        printf("ADC1 Channe Val:%d\n", adc1_Val );
        printf("ADC2 Channe Val:%d\n", adc2_Val );
        vTaskDelay(1000 / portTICK_RATE_MS);
    }

}

6、以下是调试的结果:

测试时将G34 跳线接地;G4跳线到3v3

怎么读取ESP32资料 esp32读取adc_嵌入式硬件_02