0%

ESP32_ADC

ESP32 集成了2个12位逐次逼近型AD,有5个专用转换控制器管理,支持18个AD转换通道,可以测量内部VDD等电压信号,本次实验利用一路AD采集光敏电阻电压

特性

  • 1个内部电压vdd33通道、2个pa_pkdet通道
  • 可配置12位、11位、10位、9位多种分辨率
  • 支持DMA(1个控制器支持)
  • 支持多通道扫描模式(2个控制器支持)
  • 支持Deep-sleep模式运行(1个控制器支持)
  • 支持ULP协处理器控制(2个控制器支持)

ESP32拥有5个专用转换器:

  • 2个高性能多通道扫描转换器,SAR ADC1/2 Controller [ADC1 8路:GPIO32-39,ADC2 10路:GPIO0,2,4,12-15,25-27]
  • 2个支持Deep-sleep模式下低功耗转换器, RTC ADC1/2 Controller
  • 1个功率检测/峰值检测控制器

ADC2 限制

  • 仅当WiFi驱动程序未启动时,应用程序才能使用ADC2,因为具有更高优先级的WiFi驱动程序也使用ADC.某些ADC2引脚用作捆扎引脚(GPIO0,2,15),因此无法自由使用

1.硬件原理图

光敏电阻电路

2.硬件初始化

  • 设置ADC分辨率
  • 设置ADC基准电压

3.API介绍

导入头文件: “driver/adc.h” “esp_adc_cal.h”

函数名 描述 案例
esp_err_t adc1_config_width(adc_bits_width_t width_bit) 配置ADC1所有通道分辨率
width_bit:ADC_WIDTH_9Bit:ADC_WIDTH_12Bit
adc1_config_width(ADC_WIDTH_12Bit)
esp_err_t adc1_config_channel_atten(adc1_channel_t channel,adc_atten_t atten) 配置ADC1通道的基准电压源,默认0db:1.1V
channel:ADC1_CHANNEL_0:ADC1_CHANNEL_7
atten:ADC_ATTEN_0db,2_5db,6db,11db[1,1/1.34,1/2,1/3.6]
adc1_config_channel_atten(ADC1_CHANNEL_0,ADC_ATTEN_0db)
int adc1_get_voltage(adc1_channel_t channel) 获取ADC1通道读数 adc1_get_voltage(ADC1_CHANNEL_0)

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/ledc.h"
#include "driver/gpio.h"
#include "esp_err.h"
#include <esp_log.h>
#include "driver/adc.h"
#include "esp_adc_cal.h"

#define LIGHT_SENSOR_CHANNEL ADC1_CHANNEL_6

void bsp_ADCInit()
{
adc1_config_width(ADC_WIDTH_12Bit);// 12位分辨率
adc1_config_channel_atten(LIGHT_SENSOR_CHANNEL,ADC_ATTEN_DB_6);// 设置通道6和2.2V参考电压
}

void app_main()
{
const char* TAG = "Light Sensor ADC";
int lightPower;
ESP_LOGW(TAG,">>> Light Sensor Initialize... <<<");
bsp_ADCInit();
ESP_LOGW(TAG,">>> Light Sensor Start... <<<");
for(;;)
{
lightPower = adc1_get_raw(LIGHT_SENSOR_CHANNEL);
ESP_LOGI(TAG,"ADC_Value: %d Voltage: %f mV", lightPower, (lightPower*2200.0)/4096);
vTaskDelay(1000 / portTICK_RATE_MS);
}
}

效果

LightSensorADC