Skip to content

Commit 74d04c0

Browse files
projectgusdpgeorge
authored andcommitted
esp32/adc: Use new ADC calibration API in all cases.
Replaces the deprecated ESP32 calibration API with the "line" method instead. This work was funded through GitHub Sponsors. Signed-off-by: Angus Gratton <[email protected]>
1 parent 052693e commit 74d04c0

File tree

2 files changed

+27
-43
lines changed

2 files changed

+27
-43
lines changed

ports/esp32/adc.c

+26-38
Original file line numberDiff line numberDiff line change
@@ -63,22 +63,6 @@ void madcblock_bits_helper(machine_adc_block_obj_t *self, mp_int_t bits) {
6363
if (self->unit_id == ADC_UNIT_1) {
6464
adc1_config_width(self->width);
6565
}
66-
for (adc_atten_t atten = ADC_ATTEN_DB_0; atten < ADC_ATTEN_MAX; atten++) {
67-
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 2, 1)
68-
if (self->handle[atten] != NULL) {
69-
adc_cali_curve_fitting_config_t cali_config = {
70-
.unit_id = self->unit_id,
71-
.atten = atten,
72-
.bitwidth = self->width,
73-
};
74-
check_esp_err(adc_cali_create_scheme_curve_fitting(&cali_config, self->handle[atten]));
75-
}
76-
#else
77-
if (self->characteristics[atten] != NULL) {
78-
esp_adc_cal_characterize(self->unit_id, atten, self->width, DEFAULT_VREF, self->characteristics[atten]);
79-
}
80-
#endif
81-
}
8266
}
8367

8468
mp_int_t madcblock_read_helper(machine_adc_block_obj_t *self, adc_channel_t channel_id) {
@@ -93,30 +77,34 @@ mp_int_t madcblock_read_helper(machine_adc_block_obj_t *self, adc_channel_t chan
9377
return raw;
9478
}
9579

96-
mp_int_t madcblock_read_uv_helper(machine_adc_block_obj_t *self, adc_channel_t channel_id, adc_atten_t atten) {
97-
int raw = madcblock_read_helper(self, channel_id);
98-
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 2, 1)
99-
adc_cali_handle_t *adc_handle = self->handle[atten];
100-
if (adc_handle == NULL) {
101-
adc_cali_curve_fitting_config_t cali_config = {
102-
.unit_id = self->unit_id,
103-
.atten = atten,
104-
.bitwidth = self->width,
105-
};
106-
adc_handle = malloc(sizeof(adc_cali_handle_t));
107-
check_esp_err(adc_cali_create_scheme_curve_fitting(&cali_config, adc_handle));
108-
self->handle[atten] = adc_handle;
80+
static esp_err_t ensure_adc_calibration(machine_adc_block_obj_t *self, adc_atten_t atten) {
81+
if (self->handle[atten] != NULL) {
82+
return ESP_OK;
10983
}
110-
int uv;
111-
check_esp_err(adc_cali_raw_to_voltage(*adc_handle, raw, &uv));
84+
85+
#if ADC_CALI_SCHEME_CURVE_FITTING_SUPPORTED
86+
adc_cali_curve_fitting_config_t cali_config = {
87+
.unit_id = self->unit_id,
88+
.atten = atten,
89+
.bitwidth = self->width,
90+
};
91+
return adc_cali_create_scheme_curve_fitting(&cali_config, &self->handle[atten]);
11292
#else
113-
esp_adc_cal_characteristics_t *adc_chars = self->characteristics[atten];
114-
if (adc_chars == NULL) {
115-
adc_chars = malloc(sizeof(esp_adc_cal_characteristics_t));
116-
esp_adc_cal_characterize(self->unit_id, atten, self->width, DEFAULT_VREF, adc_chars);
117-
self->characteristics[atten] = adc_chars;
118-
}
119-
mp_int_t uv = esp_adc_cal_raw_to_voltage(raw, adc_chars);
93+
adc_cali_line_fitting_config_t cali_config = {
94+
.unit_id = self->unit_id,
95+
.atten = atten,
96+
.bitwidth = self->width,
97+
};
98+
return adc_cali_create_scheme_line_fitting(&cali_config, &self->handle[atten]);
12099
#endif
100+
}
101+
102+
mp_int_t madcblock_read_uv_helper(machine_adc_block_obj_t *self, adc_channel_t channel_id, adc_atten_t atten) {
103+
int raw = madcblock_read_helper(self, channel_id);
104+
int uv;
105+
106+
check_esp_err(ensure_adc_calibration(self, atten));
107+
check_esp_err(adc_cali_raw_to_voltage(self->handle[atten], raw, &uv));
108+
121109
return (mp_int_t)uv * 1000;
122110
}

ports/esp32/adc.h

+1-5
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,7 @@ typedef struct _machine_adc_block_obj_t {
3939
adc_unit_t unit_id;
4040
mp_int_t bits;
4141
adc_bits_width_t width;
42-
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 2, 1)
43-
adc_cali_handle_t *handle[ADC_ATTEN_MAX];
44-
#else
45-
esp_adc_cal_characteristics_t *characteristics[ADC_ATTEN_MAX];
46-
#endif
42+
adc_cali_handle_t handle[ADC_ATTEN_MAX];
4743
} machine_adc_block_obj_t;
4844

4945
typedef struct _machine_adc_obj_t {

0 commit comments

Comments
 (0)