[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]);

文章作者: 戎劲羽
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 羽老板的心事
esp32 esp32 学习
喜欢就支持一下吧