From c2228ee0f9386978ada1ce0148bce64eebf55ef2 Mon Sep 17 00:00:00 2001 From: Bill Sideris Date: Wed, 3 Jan 2024 17:48:16 +0200 Subject: [PATCH] Settable analogio vref for espressif --- ports/espressif/common-hal/analogio/AnalogIn.c | 17 +++++++++++++++-- ports/espressif/common-hal/analogio/AnalogIn.h | 1 + shared-bindings/analogio/AnalogIn.c | 16 ++++++++++++++-- shared-bindings/analogio/AnalogIn.h | 1 + 4 files changed, 31 insertions(+), 4 deletions(-) diff --git a/ports/espressif/common-hal/analogio/AnalogIn.c b/ports/espressif/common-hal/analogio/AnalogIn.c index 51ee5a9cb27bc..ffd829a555f93 100644 --- a/ports/espressif/common-hal/analogio/AnalogIn.c +++ b/ports/espressif/common-hal/analogio/AnalogIn.c @@ -71,6 +71,7 @@ void common_hal_analogio_analogin_construct(analogio_analogin_obj_t *self, // Turn off the pull-up as soon as we know the pin will be used for analog reads, // since it may take a while for the voltage to stabilize if the input is high-impedance. gpio_pullup_dis(pin->number); + self->vref = 3300; } bool common_hal_analogio_analogin_deinited(analogio_analogin_obj_t *self) { @@ -86,6 +87,10 @@ void common_hal_analogio_analogin_deinit(analogio_analogin_obj_t *self) { } uint16_t common_hal_analogio_analogin_get_value(analogio_analogin_obj_t *self) { + if (!self->vref) { + // Do not divide by zero. + return 65535; + } adc_oneshot_unit_handle_t adc_handle; adc_oneshot_unit_init_cfg_t adc_config = { .unit_id = self->pin->adc_index, @@ -166,9 +171,17 @@ uint16_t common_hal_analogio_analogin_get_value(analogio_analogin_obj_t *self) { } #endif adc_oneshot_del_unit(adc_handle); - return voltage * ((1 << 16) - 1) / 3300; + return voltage * ((1 << 16) - 1) / self->vref; } float common_hal_analogio_analogin_get_reference_voltage(analogio_analogin_obj_t *self) { - return 3.3f; + return (float)self->vref * 0.001f; +} + +void common_hal_analogio_analogin_set_reference_voltage(analogio_analogin_obj_t *self, mp_float_t value) { + if (value <= 0.0f) { + self->vref = 0; + } else { + self->vref = (int)(value * 1000); + } } diff --git a/ports/espressif/common-hal/analogio/AnalogIn.h b/ports/espressif/common-hal/analogio/AnalogIn.h index 5ac9c63f4dbe1..f2550c3c9ca53 100644 --- a/ports/espressif/common-hal/analogio/AnalogIn.h +++ b/ports/espressif/common-hal/analogio/AnalogIn.h @@ -37,6 +37,7 @@ typedef struct { mp_obj_base_t base; const mcu_pin_obj_t *pin; + mp_int_t vref; } analogio_analogin_obj_t; #endif // MICROPY_INCLUDED_ESPRESSIF_COMMON_HAL_ANALOGIO_ANALOGIN_H diff --git a/shared-bindings/analogio/AnalogIn.c b/shared-bindings/analogio/AnalogIn.c index cff9e10b89533..494b74038b706 100644 --- a/shared-bindings/analogio/AnalogIn.c +++ b/shared-bindings/analogio/AnalogIn.c @@ -136,8 +136,20 @@ STATIC mp_obj_t analogio_analogin_obj_get_reference_voltage(mp_obj_t self_in) { MP_DEFINE_CONST_FUN_OBJ_1(analogio_analogin_get_reference_voltage_obj, analogio_analogin_obj_get_reference_voltage); -MP_PROPERTY_GETTER(analogio_analogin_reference_voltage_obj, - (mp_obj_t)&analogio_analogin_get_reference_voltage_obj); +STATIC mp_obj_t analogio_analogin_obj_set_reference_voltage(mp_obj_t self_in, mp_obj_t value) { + analogio_analogin_obj_t *self = MP_OBJ_TO_PTR(self_in); + check_for_deinit(self); + + common_hal_analogio_analogin_set_reference_voltage(self, mp_obj_get_float(value)); + return mp_const_none; +} + +MP_DEFINE_CONST_FUN_OBJ_2(analogio_analogin_set_reference_voltage_obj, + analogio_analogin_obj_set_reference_voltage); + +MP_PROPERTY_GETSET(analogio_analogin_reference_voltage_obj, + (mp_obj_t)&analogio_analogin_get_reference_voltage_obj, + (mp_obj_t)&analogio_analogin_set_reference_voltage_obj); STATIC const mp_rom_map_elem_t analogio_analogin_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&analogio_analogin_deinit_obj) }, diff --git a/shared-bindings/analogio/AnalogIn.h b/shared-bindings/analogio/AnalogIn.h index 7d667ed3f4683..d2446ad68ad24 100644 --- a/shared-bindings/analogio/AnalogIn.h +++ b/shared-bindings/analogio/AnalogIn.h @@ -38,5 +38,6 @@ void common_hal_analogio_analogin_deinit(analogio_analogin_obj_t *self); bool common_hal_analogio_analogin_deinited(analogio_analogin_obj_t *self); uint16_t common_hal_analogio_analogin_get_value(analogio_analogin_obj_t *self); float common_hal_analogio_analogin_get_reference_voltage(analogio_analogin_obj_t *self); +void common_hal_analogio_analogin_set_reference_voltage(analogio_analogin_obj_t *self, mp_float_t value); #endif // __MICROPY_INCLUDED_SHARED_BINDINGS_ANALOGIO_ANALOGIN_H__