You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ESP-IDF中ADC_ATTEN_DB_11已弃用,如何迁移至新ADC驱动?

解决ESP-IDF中旧版ADC驱动弃用警告问题

问题背景

在基于PlatformIO的ESP-IDF项目中,使用旧版ADC初始化API时出现两类弃用警告:

  • ADC_ATTEN_DB_11 已被弃用,替换为ADC_ATTEN_DB_12后仍有警告
  • 提示需迁移至oneshot模式(esp_adc/adc_oneshot.h)或连续模式(esp_adc/adc_continuous.h)驱动

原有初始化及读取代码如下:

// main function
void app_main() {
    esp_event_loop_create_default();
    connect_wifi_params_t cbs = {
        .on_connected = handle_wifi_connect,
        .on_failed = handle_wifi_failed
    };

    // configure ADC for 12-bit width, 3.3V source
    // Photoresistor needs to be connected from 3.3V to pin 34.
    adc1_config_width(ADC_WIDTH_BIT_12);
    adc1_config_channel_atten(adc_channel, ADC_ATTEN_DB_11);
    
    // connect wifi
    appwifi_connect(cbs);
}
// transmit reading to server. Photoresistor is read here.
static void publish_reading(int temp, int hum) {
    char buffer[5];
    if (client != NULL && enabled) {
        esp_mqtt_client_publish(client, TEMP_TOPIC, itoa(temp, buffer, 10), 0, 1, 0);
        esp_mqtt_client_publish(client, HUM_TOPIC, itoa(hum, buffer, 10), 0, 1, 0);
        // average ADC value over 32 samples and send it
        int adc_val = 0;
        for (unsigned char i = 0; i < SAMPLE_CNT; i++) adc_val += adc1_get_raw(adc_channel);
        adc_val /= SAMPLE_CNT;
        esp_mqtt_client_publish(client, PHOTO_TOPIC, itoa(adc_val, buffer, 10), 0, 1, 0);
    }
}

解决方案:迁移至OneShot模式驱动

你的场景是单次采样多次取平均,适合使用oneshot模式,具体修改步骤如下:

1. 替换头文件

移除旧的ADC头文件,引入oneshot模式的头文件:

#include "esp_adc/adc_oneshot.h"

2. 定义全局句柄

在全局区域或合适的位置定义ADC1的句柄:

adc_oneshot_unit_handle_t adc1_handle;

3. 修改ADC初始化逻辑

在app_main()中替换旧的初始化代码,使用oneshot模式API:

void app_main() {
    esp_event_loop_create_default();
    connect_wifi_params_t cbs = {
        .on_connected = handle_wifi_connect,
        .on_failed = handle_wifi_failed
    };

    // 初始化ADC1的oneshot单元
    adc_oneshot_unit_init_cfg_t init_cfg = {
        .unit_id = ADC_UNIT_1,
        .ulp_mode = ADC_ULP_MODE_DISABLE, // 禁用ULP模式,无需低功耗采样
    };
    ESP_ERROR_CHECK(adc_oneshot_new_unit(&init_cfg, &adc1_handle));

    // 配置目标通道的衰减和精度
    adc_oneshot_chan_cfg_t chan_cfg = {
        .atten = ADC_ATTEN_DB_12, // 替代ADC_ATTEN_DB_11的新标准衰减值
        .bitwidth = ADC_BITWIDTH_12, // 保持12位采样精度
    };
    ESP_ERROR_CHECK(adc_oneshot_config_channel(adc1_handle, adc_channel, &chan_cfg));
    
    // connect wifi
    appwifi_connect(cbs);
}

4. 修改ADC读取代码

替换旧的adc1_get_raw()为oneshot模式的读取API:

static void publish_reading(int temp, int hum) {
    char buffer[5];
    if (client != NULL && enabled) {
        esp_mqtt_client_publish(client, TEMP_TOPIC, itoa(temp, buffer, 10), 0, 1, 0);
        esp_mqtt_client_publish(client, HUM_TOPIC, itoa(hum, buffer, 10), 0, 1, 0);
        // average ADC value over 32 samples and send it
        int adc_val = 0;
        int raw_reading;
        for (unsigned char i = 0; i < SAMPLE_CNT; i++) {
            ESP_ERROR_CHECK(adc_oneshot_read(adc1_handle, adc_channel, &raw_reading));
            adc_val += raw_reading;
        }
        adc_val /= SAMPLE_CNT;
        esp_mqtt_client_publish(client, PHOTO_TOPIC, itoa(adc_val, buffer, 10), 0, 1, 0);
    }
}

5. 可选:资源清理(低功耗场景)

如果项目需要关闭ADC单元以节省功耗,可在退出逻辑中调用:

ESP_ERROR_CHECK(adc_oneshot_del_unit(adc1_handle));

关键说明

  • ADC_ATTEN_DB_12是ADC_ATTEN_DB_11的官方替代值,对应最大输入电压约3.9V,完全适配你的3.3V电源场景
  • OneShot模式专为单次采样场景设计,API逻辑清晰,符合你多次采样取平均的需求
  • 使用ESP_ERROR_CHECK包裹API调用,可及时捕获初始化或采样过程中的错误,提升代码健壮性

内容的提问来源于stack exchange,提问作者StarSword

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 05:07:32