summaryrefslogtreecommitdiffstatshomepage
path: root/ports/esp32/adc.c
diff options
context:
space:
mode:
Diffstat (limited to 'ports/esp32/adc.c')
-rw-r--r--ports/esp32/adc.c64
1 files changed, 26 insertions, 38 deletions
diff --git a/ports/esp32/adc.c b/ports/esp32/adc.c
index 7c9e0cfad6..91db9ec525 100644
--- a/ports/esp32/adc.c
+++ b/ports/esp32/adc.c
@@ -63,22 +63,6 @@ void madcblock_bits_helper(machine_adc_block_obj_t *self, mp_int_t bits) {
if (self->unit_id == ADC_UNIT_1) {
adc1_config_width(self->width);
}
- for (adc_atten_t atten = ADC_ATTEN_DB_0; atten < ADC_ATTEN_MAX; atten++) {
- #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 2, 1)
- if (self->handle[atten] != NULL) {
- adc_cali_curve_fitting_config_t cali_config = {
- .unit_id = self->unit_id,
- .atten = atten,
- .bitwidth = self->width,
- };
- check_esp_err(adc_cali_create_scheme_curve_fitting(&cali_config, self->handle[atten]));
- }
- #else
- if (self->characteristics[atten] != NULL) {
- esp_adc_cal_characterize(self->unit_id, atten, self->width, DEFAULT_VREF, self->characteristics[atten]);
- }
- #endif
- }
}
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
return raw;
}
-mp_int_t madcblock_read_uv_helper(machine_adc_block_obj_t *self, adc_channel_t channel_id, adc_atten_t atten) {
- int raw = madcblock_read_helper(self, channel_id);
- #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 2, 1)
- adc_cali_handle_t *adc_handle = self->handle[atten];
- if (adc_handle == NULL) {
- adc_cali_curve_fitting_config_t cali_config = {
- .unit_id = self->unit_id,
- .atten = atten,
- .bitwidth = self->width,
- };
- adc_handle = malloc(sizeof(adc_cali_handle_t));
- check_esp_err(adc_cali_create_scheme_curve_fitting(&cali_config, adc_handle));
- self->handle[atten] = adc_handle;
+static esp_err_t ensure_adc_calibration(machine_adc_block_obj_t *self, adc_atten_t atten) {
+ if (self->handle[atten] != NULL) {
+ return ESP_OK;
}
- int uv;
- check_esp_err(adc_cali_raw_to_voltage(*adc_handle, raw, &uv));
+
+ #if ADC_CALI_SCHEME_CURVE_FITTING_SUPPORTED
+ adc_cali_curve_fitting_config_t cali_config = {
+ .unit_id = self->unit_id,
+ .atten = atten,
+ .bitwidth = self->width,
+ };
+ return adc_cali_create_scheme_curve_fitting(&cali_config, &self->handle[atten]);
#else
- esp_adc_cal_characteristics_t *adc_chars = self->characteristics[atten];
- if (adc_chars == NULL) {
- adc_chars = malloc(sizeof(esp_adc_cal_characteristics_t));
- esp_adc_cal_characterize(self->unit_id, atten, self->width, DEFAULT_VREF, adc_chars);
- self->characteristics[atten] = adc_chars;
- }
- mp_int_t uv = esp_adc_cal_raw_to_voltage(raw, adc_chars);
+ adc_cali_line_fitting_config_t cali_config = {
+ .unit_id = self->unit_id,
+ .atten = atten,
+ .bitwidth = self->width,
+ };
+ return adc_cali_create_scheme_line_fitting(&cali_config, &self->handle[atten]);
#endif
+}
+
+mp_int_t madcblock_read_uv_helper(machine_adc_block_obj_t *self, adc_channel_t channel_id, adc_atten_t atten) {
+ int raw = madcblock_read_helper(self, channel_id);
+ int uv;
+
+ check_esp_err(ensure_adc_calibration(self, atten));
+ check_esp_err(adc_cali_raw_to_voltage(self->handle[atten], raw, &uv));
+
return (mp_int_t)uv * 1000;
}