esp-idf ADC文档源码解读
[esp-idf] : adc 文档源码解读
---ADC Single Read Example
This example demonstrates the following:
- How to obtain a oneshot ADC reading from a GPIO pin using the ADC oneshot mode driver
- How to use the ADC Calibration functions to obtain a calibrated result (in mV)
ESP32 ADC
esp32拥有两个adc单元,可以生成单次转换结果,也可以生成连续转换结果,以下为操作ADC的具体解读
ADC1: 10 channels: GPIO1 - GPIO10
ADC2: 10 channels: GPIO11 - GPIO20
注意: ADC2的模块也同样在跑wifi,如果在wifi开启后调用adc2的读取函数,将会导致读取失败!!!!
1. 配置ADC单元(Unit Configuration)
ADC单元单次转换初始化配置句柄 :adc_oneshot_chan_cfg_t
参数:
adc_oneshot_unit_init_cfg_t::unit_id: 选择ADC
adc_oneshot_unit_init_cfg_t::clk_src: 选择ADC时钟源,如果置0,则使用系统默认时钟源
adc_oneshot_unit_init_cfg_t::ulp_mode: 如果置位,则使用ULP模式 (ULP是一个低功耗的协处理器,具体见百度)
配置完ADC初始化句柄后,调用adc_oneshot_new_unit()函数初始化
adc_oneshot_unit_handle_t adc1_handle; //adc句柄
adc_oneshot_unit_init_cfg_t init_config1 = { //adc配置句柄
.unit_id = ADC_UNIT_1, //ADC1
.ulp_mode = ADC_ULP_MODE_DISABLE, //不使用ULP
};
ESP_ERROR_CHECK(adc_oneshot_new_unit(&init_config1, &adc1_handle));
删除adc单元
ESP_ERROR_CHECK(adc_oneshot_del_unit(adc1_handle));
当adc单元创建好之后,我们需要使用adc_oneshot_chan_cfg_t配置adc io通道来获取信号
句柄参数:
adc_oneshot_chan_cfg_t::atten: ADC attenuation
adc_oneshot_chan_cfg_t::bitwidth: 原始采样结果的位宽
ADC attenuation
配置完成后,调用adc_oneshot_config_channel()使之生效
#define EXAMPLE_ADC1_CHAN0 ADC_CHANNEL_2
#define EXAMPLE_ADC1_CHAN1 ADC_CHANNEL_3
adc_oneshot_chan_cfg_t config = {
.bitwidth = ADC_BITWIDTH_DEFAULT,
.atten = ADC_ATTEN_DB_11,
};
ESP_ERROR_CHECK(adc_oneshot_config_channel(adc1_handle, EXAMPLE_ADC1_CHAN0, &config));
ESP_ERROR_CHECK(adc_oneshot_config_channel(adc1_handle, EXAMPLE_ADC1_CHAN1, &config));
3.ADC读取
调用ADC读取函数adc_oneshot_read()读取ADC转换后的值
真实电压的转换公式:Vout = Dout * Vmax / Dmax
真实电压 = 读取值 * (真实电压最大值 / 可读取最大值(adc_oneshot_chan_cfg_t:bitwidth))
ESP_ERROR_CHECK(adc_oneshot_read(adc1_handle, EXAMPLE_ADC1_CHAN0, &adc_raw[0][0]));
ESP_LOGI(TAG, "ADC%d Channel[%d] Raw Data: %d", ADC_UNIT_1 + 1, EXAMPLE_ADC1_CHAN0, adc_raw[0][0]);
ESP_ERROR_CHECK(adc_oneshot_read(adc1_handle, EXAMPLE_ADC1_CHAN1, &adc_raw[0][1]));
ESP_LOGI(TAG, "ADC%d Channel[%d] Raw Data: %d", ADC_UNIT_1 + 1, EXAMPLE_ADC1_CHAN1, adc_raw[0][1]);