42 adc_oneshot_unit_init_cfg_t init_config = {};
44 init_config.ulp_mode = ADC_ULP_MODE_DISABLE;
45#if USE_ESP32_VARIANT_ESP32C3 || USE_ESP32_VARIANT_ESP32C5 || USE_ESP32_VARIANT_ESP32C6 || USE_ESP32_VARIANT_ESP32H2
46 init_config.clk_src = ADC_DIGI_CLK_SRC_DEFAULT;
51 ESP_LOGE(TAG,
"Error initializing %s: %d", LOG_STR_ARG(
adc_unit_to_str(this->adc_unit_)), err);
60 adc_oneshot_chan_cfg_t config = {
62 .bitwidth = ADC_BITWIDTH_DEFAULT,
66 ESP_LOGE(TAG,
"Error configuring channel: %d", err);
74 adc_cali_handle_t handle =
nullptr;
76#if USE_ESP32_VARIANT_ESP32C3 || USE_ESP32_VARIANT_ESP32C5 || USE_ESP32_VARIANT_ESP32C6 || \
77 USE_ESP32_VARIANT_ESP32S3 || USE_ESP32_VARIANT_ESP32H2 || USE_ESP32_VARIANT_ESP32P4
79 adc_cali_curve_fitting_config_t cali_config = {};
80#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 3, 0)
85 cali_config.bitwidth = ADC_BITWIDTH_DEFAULT;
87 err = adc_cali_create_scheme_curve_fitting(&cali_config, &handle);
91 ESP_LOGV(TAG,
"Using curve fitting calibration");
93 ESP_LOGW(TAG,
"Curve fitting calibration failed with error %d, will use uncalibrated readings", err);
97 adc_cali_line_fitting_config_t cali_config = {
100 .bitwidth = ADC_BITWIDTH_DEFAULT,
101#if !defined(USE_ESP32_VARIANT_ESP32S2)
102 .default_vref = 1100,
105 err = adc_cali_create_scheme_line_fitting(&cali_config, &handle);
109 ESP_LOGV(TAG,
"Using line fitting calibration");
111 ESP_LOGW(TAG,
"Line fitting calibration failed with error %d, will use uncalibrated readings", err);
162 ESP_LOGW(TAG,
"ADC read failed with error %d", err);
167 ESP_LOGW(TAG,
"Invalid ADC reading");
171 aggr.add_sample(
raw);
174 uint32_t final_value = aggr.aggregate();
182 esp_err_t err = adc_cali_raw_to_voltage(this->
calibration_handle_, final_value, &voltage_mv);
184 return voltage_mv / 1000.0f;
186 ESP_LOGW(TAG,
"ADC calibration conversion failed with error %d, disabling calibration", err);
188#if USE_ESP32_VARIANT_ESP32C3 || USE_ESP32_VARIANT_ESP32C5 || USE_ESP32_VARIANT_ESP32C6 || \
189 USE_ESP32_VARIANT_ESP32S3 || USE_ESP32_VARIANT_ESP32H2 || USE_ESP32_VARIANT_ESP32P4
199 return final_value * 3.3f / 4095.0f;
204 auto read_atten = [
this](adc_atten_t atten) -> std::pair<int, float> {
206 adc_oneshot_chan_cfg_t config = {
208 .bitwidth = ADC_BITWIDTH_DEFAULT,
214 ESP_LOGW(TAG,
"Error configuring ADC channel for autorange: %d", err);
221#if USE_ESP32_VARIANT_ESP32C3 || USE_ESP32_VARIANT_ESP32C5 || USE_ESP32_VARIANT_ESP32C6 || \
222 USE_ESP32_VARIANT_ESP32S3 || USE_ESP32_VARIANT_ESP32H2 || USE_ESP32_VARIANT_ESP32P4
231 adc_cali_handle_t handle =
nullptr;
233#if USE_ESP32_VARIANT_ESP32C3 || USE_ESP32_VARIANT_ESP32C5 || USE_ESP32_VARIANT_ESP32C6 || \
234 USE_ESP32_VARIANT_ESP32S3 || USE_ESP32_VARIANT_ESP32H2 || USE_ESP32_VARIANT_ESP32P4
235 adc_cali_curve_fitting_config_t cali_config = {};
236#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 3, 0)
240 cali_config.atten = atten;
241 cali_config.bitwidth = ADC_BITWIDTH_DEFAULT;
243 err = adc_cali_create_scheme_curve_fitting(&cali_config, &handle);
245 adc_cali_line_fitting_config_t cali_config = {
248 .bitwidth = ADC_BITWIDTH_DEFAULT,
249#if !defined(USE_ESP32_VARIANT_ESP32S2)
250 .default_vref = 1100,
253 err = adc_cali_create_scheme_line_fitting(&cali_config, &handle);
260 ESP_LOGW(TAG,
"ADC read failed in autorange with error %d", err);
261 if (handle !=
nullptr) {
262#if USE_ESP32_VARIANT_ESP32C3 || USE_ESP32_VARIANT_ESP32C5 || USE_ESP32_VARIANT_ESP32C6 || \
263 USE_ESP32_VARIANT_ESP32S3 || USE_ESP32_VARIANT_ESP32H2 || USE_ESP32_VARIANT_ESP32P4
264 adc_cali_delete_scheme_curve_fitting(handle);
266 adc_cali_delete_scheme_line_fitting(handle);
272 float voltage = 0.0f;
273 if (handle !=
nullptr) {
275 err = adc_cali_raw_to_voltage(handle,
raw, &voltage_mv);
277 voltage = voltage_mv / 1000.0f;
279 voltage =
raw * 3.3f / 4095.0f;
282#if USE_ESP32_VARIANT_ESP32C3 || USE_ESP32_VARIANT_ESP32C5 || USE_ESP32_VARIANT_ESP32C6 || \
283 USE_ESP32_VARIANT_ESP32S3 || USE_ESP32_VARIANT_ESP32H2 || USE_ESP32_VARIANT_ESP32P4
284 adc_cali_delete_scheme_curve_fitting(handle);
286 adc_cali_delete_scheme_line_fitting(handle);
289 voltage =
raw * 3.3f / 4095.0f;
292 return {
raw, voltage};
295 auto [raw12, mv12] = read_atten(ADC_ATTEN_DB_12);
297 ESP_LOGE(TAG,
"Failed to read ADC in autorange mode");
301 int raw6 = 4095, raw2 = 4095, raw0 = 4095;
302 float mv6 = 0, mv2 = 0, mv0 = 0;
305 auto [raw6_val, mv6_val] = read_atten(ADC_ATTEN_DB_6);
309 if (raw6 < 4095 && raw6 != -1) {
310 auto [raw2_val, mv2_val] = read_atten(ADC_ATTEN_DB_2_5);
314 if (raw2 < 4095 && raw2 != -1) {
315 auto [raw0_val, mv0_val] = read_atten(ADC_ATTEN_DB_0);
322 if (raw0 == -1 || raw2 == -1 || raw6 == -1 || raw12 == -1) {
326 const int adc_half = 2048;
327 uint32_t c12 = std::min(raw12, adc_half);
328 uint32_t c6 = adc_half - std::abs(raw6 - adc_half);
329 uint32_t c2 = adc_half - std::abs(raw2 - adc_half);
330 uint32_t c0 = std::min(4095 - raw0, adc_half);
331 uint32_t csum = c12 + c6 + c2 + c0;
334 ESP_LOGE(TAG,
"Invalid weight sum in autorange calculation");
338 return (mv12 * c12 + mv6 * c6 + mv2 * c2 + mv0 * c0) / csum;