adc: no longer support adc2 oneshot mode on esp32c3

Due to HW limitation, we don't support this anymore. On c3, ADC2 under oneshot mode is not stable.

However, you can enable CONFIG_ADC_ONESHOT_FORCE_USE_ADC2_ON_C3 to force use
ADC2.

Refer to errata to know more details:
https://www.espressif.com/sites/default/files/documentation/esp32-s3_errata_en.pdf
https://www.espressif.com/sites/default/files/documentation/esp32-c3_errata_en.pdf
This commit is contained in:
Armando
2022-12-12 11:01:22 +08:00
committed by morris
parent b4c90c44d2
commit ded528e188
8 changed files with 66 additions and 26 deletions

View File

@@ -28,14 +28,22 @@ const static char *TAG = "EXAMPLE";
#define EXAMPLE_ADC1_CHAN1 ADC_CHANNEL_3
#endif
#if (SOC_ADC_PERIPH_NUM >= 2)
#if (SOC_ADC_PERIPH_NUM >= 2) && !CONFIG_IDF_TARGET_ESP32C3
/**
* On ESP32C3, ADC2 is no longer supported, due to its HW limitation.
* Search for errata on espressif website for more details.
*/
#define EXAMPLE_USE_ADC2 1
#endif
#if EXAMPLE_USE_ADC2
//ADC2 Channels
#if CONFIG_IDF_TARGET_ESP32
#define EXAMPLE_ADC2_CHAN0 ADC_CHANNEL_0
#else
#define EXAMPLE_ADC2_CHAN0 ADC_CHANNEL_0
#endif
#endif
#endif //#if EXAMPLE_USE_ADC2
#define EXAMPLE_ADC_ATTEN ADC_ATTEN_DB_11
@@ -67,7 +75,7 @@ void app_main(void)
bool do_calibration1 = example_adc_calibration_init(ADC_UNIT_1, EXAMPLE_ADC_ATTEN, &adc1_cali_handle);
#if (SOC_ADC_PERIPH_NUM >= 2)
#if EXAMPLE_USE_ADC2
//-------------ADC2 Init---------------//
adc_oneshot_unit_handle_t adc2_handle;
adc_oneshot_unit_init_cfg_t init_config2 = {
@@ -82,7 +90,7 @@ void app_main(void)
//-------------ADC2 Config---------------//
ESP_ERROR_CHECK(adc_oneshot_config_channel(adc2_handle, EXAMPLE_ADC2_CHAN0, &config));
#endif //#if (SOC_ADC_PERIPH_NUM >= 2)
#endif //#if EXAMPLE_USE_ADC2
while (1) {
ESP_ERROR_CHECK(adc_oneshot_read(adc1_handle, EXAMPLE_ADC1_CHAN0, &adc_raw[0][0]));
@@ -101,7 +109,7 @@ void app_main(void)
}
vTaskDelay(pdMS_TO_TICKS(1000));
#if (SOC_ADC_PERIPH_NUM >= 2)
#if EXAMPLE_USE_ADC2
ESP_ERROR_CHECK(adc_oneshot_read(adc2_handle, EXAMPLE_ADC2_CHAN0, &adc_raw[1][0]));
ESP_LOGI(TAG, "ADC%d Channel[%d] Raw Data: %d", ADC_UNIT_2 + 1, EXAMPLE_ADC2_CHAN0, adc_raw[1][0]);
if (do_calibration2) {
@@ -109,7 +117,7 @@ void app_main(void)
ESP_LOGI(TAG, "ADC%d Channel[%d] Cali Voltage: %d mV", ADC_UNIT_2 + 1, EXAMPLE_ADC2_CHAN0, voltage[1][0]);
}
vTaskDelay(pdMS_TO_TICKS(1000));
#endif //#if (SOC_ADC_PERIPH_NUM >= 2)
#endif //#if EXAMPLE_USE_ADC2
}
//Tear Down
@@ -118,12 +126,12 @@ void app_main(void)
example_adc_calibration_deinit(adc1_cali_handle);
}
#if (SOC_ADC_PERIPH_NUM >= 2)
#if EXAMPLE_USE_ADC2
ESP_ERROR_CHECK(adc_oneshot_del_unit(adc2_handle));
if (do_calibration2) {
example_adc_calibration_deinit(adc2_cali_handle);
}
#endif //#if (SOC_ADC_PERIPH_NUM >= 2)
#endif //#if EXAMPLE_USE_ADC2
}