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引脚功能介绍:
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