esp32/adc: Add support for v5.2.1 calibration api.

This new calibration routine exists for S3 in v5.1.1.
It works for all platforms in 5.2.1.

Signed-off-by: Andrew Leech <andrew@alelec.net>
Andrea Milazzo 2024-03-12 09:45:19 +01:00 zatwierdzone przez Andrew Leech
rodzic 7e344a3b9a
commit 2a3a8f8f53
2 zmienionych plików z 38 dodań i 3 usunięć

Wyświetl plik

@ -28,6 +28,7 @@
#include "py/mphal.h"
#include "adc.h"
#include "driver/adc.h"
#include "esp_adc/adc_cali_scheme.h"
#define DEFAULT_VREF 1100
@ -63,30 +64,59 @@ void madcblock_bits_helper(machine_adc_block_obj_t *self, mp_int_t bits) {
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) {
int raw;
int raw = 0;
if (self->unit_id == ADC_UNIT_1) {
raw = adc1_get_raw(channel_id);
} else {
#if (SOC_ADC_PERIPH_NUM >= 2)
check_esp_err(adc2_get_raw(channel_id, self->width, &raw));
#endif
}
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;
}
int uv;
check_esp_err(adc_cali_raw_to_voltage(*adc_handle, raw, &uv));
#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) * 1000;
return uv;
mp_int_t uv = esp_adc_cal_raw_to_voltage(raw, adc_chars);
#endif
return (mp_int_t)uv * 1000;
}

Wyświetl plik

@ -30,6 +30,7 @@
#include "py/runtime.h"
#include "esp_adc_cal.h"
#include "esp_adc/adc_cali_scheme.h"
#define ADC_ATTEN_MAX SOC_ADC_ATTEN_NUM
@ -38,7 +39,11 @@ typedef struct _machine_adc_block_obj_t {
adc_unit_t unit_id;
mp_int_t bits;
adc_bits_width_t width;
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 2, 1)
adc_cali_handle_t *handle[ADC_ATTEN_MAX];
#else
esp_adc_cal_characteristics_t *characteristics[ADC_ATTEN_MAX];
#endif
} machine_adc_block_obj_t;
typedef struct _machine_adc_obj_t {