diff --git a/boards/aerotenna/ocpoc/adc/adc.cpp b/boards/aerotenna/ocpoc/adc/adc.cpp index 61cf181bbe..f35c583607 100644 --- a/boards/aerotenna/ocpoc/adc/adc.cpp +++ b/boards/aerotenna/ocpoc/adc/adc.cpp @@ -92,6 +92,11 @@ uint32_t px4_arch_adc_sample(uint32_t base_address, unsigned channel) return atoi(buffer); } +float px4_arch_adc_reference_v() +{ + return BOARD_ADC_POS_REF_V; +} + uint32_t px4_arch_adc_dn_fullcount() { return 1 << 12; // 12 bit ADC diff --git a/boards/beaglebone/blue/adc/adc.cpp b/boards/beaglebone/blue/adc/adc.cpp index 141a80e969..7d9aec5c5e 100644 --- a/boards/beaglebone/blue/adc/adc.cpp +++ b/boards/beaglebone/blue/adc/adc.cpp @@ -92,6 +92,11 @@ uint32_t px4_arch_adc_sample(uint32_t base_address, unsigned channel) return atoi(buffer); } +float px4_arch_adc_reference_v() +{ + return BOARD_ADC_POS_REF_V; // 12-bit 1.8V ADC +} + uint32_t px4_arch_adc_dn_fullcount() { return 1 << 12; // 12 bit ADC diff --git a/boards/beaglebone/blue/src/board_config.h b/boards/beaglebone/blue/src/board_config.h index ecaac2bd8d..216b9e6169 100644 --- a/boards/beaglebone/blue/src/board_config.h +++ b/boards/beaglebone/blue/src/board_config.h @@ -61,6 +61,7 @@ // ADC channels: #define ADC_CHANNELS (1 << 5) +#define BOARD_ADC_POS_REF_V (1.8f) #define ADC_BATTERY_VOLTAGE_CHANNEL 5 #define ADC_BATTERY_CURRENT_CHANNEL ((uint8_t)(-1)) diff --git a/boards/emlid/navio2/adc/adc.cpp b/boards/emlid/navio2/adc/adc.cpp index 7a57fe68ec..017c600876 100644 --- a/boards/emlid/navio2/adc/adc.cpp +++ b/boards/emlid/navio2/adc/adc.cpp @@ -92,6 +92,11 @@ uint32_t px4_arch_adc_sample(uint32_t base_address, unsigned channel) return atoi(buffer); } +float px4_arch_adc_reference_v() +{ + return BOARD_ADC_POS_REF_V; +} + uint32_t px4_arch_adc_dn_fullcount() { return 1 << 12; // 12 bit ADC diff --git a/boards/emlid/navio2/src/board_config.h b/boards/emlid/navio2/src/board_config.h index 5a2b5a0bdb..3aa36522d4 100644 --- a/boards/emlid/navio2/src/board_config.h +++ b/boards/emlid/navio2/src/board_config.h @@ -73,6 +73,7 @@ // A4 - ADC2 (ADC port) // A5 - ADC3 (ADC port) #define ADC_CHANNELS (1 << 0) | (1 << 1) | (1 << 2) | (1 << 3) | (1 << 4) | (1 << 5) +#define BOARD_ADC_POS_REF_V (4.096f) // TODO: need confirmation #define ADC_BATTERY_VOLTAGE_CHANNEL 2 #define ADC_BATTERY_CURRENT_CHANNEL 3 diff --git a/platforms/common/include/px4_platform_common/board_common.h b/platforms/common/include/px4_platform_common/board_common.h index 30638503c0..4fb1df349d 100644 --- a/platforms/common/include/px4_platform_common/board_common.h +++ b/platforms/common/include/px4_platform_common/board_common.h @@ -147,6 +147,10 @@ #define ADC_3V3_SCALE (2.0f) // The scale factor defined by HW's resistive divider (Rt+Rb)/ Rb #endif +#ifndef BOARD_ADC_POS_REF_V +#define BOARD_ADC_POS_REF_V (3.3f) // Default reference voltage for every channels +#endif + #ifndef BOARD_ADC_POS_REF_V_FOR_CURRENT_CHAN #define BOARD_ADC_POS_REF_V_FOR_CURRENT_CHAN (3.3f) // Reference voltage for reading out the current channel #endif diff --git a/platforms/nuttx/src/px4/nxp/imxrt/adc/adc.cpp b/platforms/nuttx/src/px4/nxp/imxrt/adc/adc.cpp index ec601d8882..c23dc5b0de 100644 --- a/platforms/nuttx/src/px4/nxp/imxrt/adc/adc.cpp +++ b/platforms/nuttx/src/px4/nxp/imxrt/adc/adc.cpp @@ -186,6 +186,12 @@ uint32_t px4_arch_adc_sample(uint32_t base_address, unsigned channel) result = rR0(base_address); return result; } + +float px4_arch_adc_reference_v() +{ + return BOARD_ADC_POS_REF_V; // TODO: provide true vref +} + uint32_t px4_arch_adc_temp_sensor_mask() { return 0; diff --git a/platforms/nuttx/src/px4/nxp/kinetis/adc/adc.cpp b/platforms/nuttx/src/px4/nxp/kinetis/adc/adc.cpp index 87fee5a2b9..09abd78e9b 100644 --- a/platforms/nuttx/src/px4/nxp/kinetis/adc/adc.cpp +++ b/platforms/nuttx/src/px4/nxp/kinetis/adc/adc.cpp @@ -176,6 +176,11 @@ uint32_t px4_arch_adc_sample(uint32_t base_address, unsigned channel) return result; } +float px4_arch_adc_reference_v() +{ + return BOARD_ADC_POS_REF_V; // TODO: provide true vref +} + uint32_t px4_arch_adc_temp_sensor_mask() { return 1 << (ADC_SC1_ADCH_TEMP >> ADC_SC1_ADCH_SHIFT); diff --git a/platforms/nuttx/src/px4/nxp/s32k1xx/adc/adc.cpp b/platforms/nuttx/src/px4/nxp/s32k1xx/adc/adc.cpp index aae84e2b88..2a3356fb54 100644 --- a/platforms/nuttx/src/px4/nxp/s32k1xx/adc/adc.cpp +++ b/platforms/nuttx/src/px4/nxp/s32k1xx/adc/adc.cpp @@ -179,6 +179,11 @@ uint32_t px4_arch_adc_sample(uint32_t base_address, unsigned channel) return result; } +float px4_arch_adc_reference_v() +{ + return BOARD_ADC_POS_REF_V; // TODO: provide true vref +} + uint32_t px4_arch_adc_temp_sensor_mask() { return 1 << (ADC_SC1_ADCH_TEMP >> ADC_SC1_ADCH_SHIFT); diff --git a/platforms/nuttx/src/px4/stm/stm32_common/adc/adc.cpp b/platforms/nuttx/src/px4/stm/stm32_common/adc/adc.cpp index 1658676f79..db1b7acd12 100644 --- a/platforms/nuttx/src/px4/stm/stm32_common/adc/adc.cpp +++ b/platforms/nuttx/src/px4/stm/stm32_common/adc/adc.cpp @@ -224,6 +224,11 @@ uint32_t px4_arch_adc_sample(uint32_t base_address, unsigned channel) return result; } +float px4_arch_adc_reference_v() +{ + return BOARD_ADC_POS_REF_V; // TODO: provide true vref +} + uint32_t px4_arch_adc_temp_sensor_mask() { return 1 << 16; diff --git a/platforms/nuttx/src/px4/stm/stm32h7/adc/adc.cpp b/platforms/nuttx/src/px4/stm/stm32h7/adc/adc.cpp index 1a33d7e2f2..5831ca6529 100644 --- a/platforms/nuttx/src/px4/stm/stm32h7/adc/adc.cpp +++ b/platforms/nuttx/src/px4/stm/stm32h7/adc/adc.cpp @@ -304,6 +304,11 @@ uint32_t px4_arch_adc_sample(uint32_t base_address, unsigned channel) return result; } +float px4_arch_adc_reference_v() +{ + return BOARD_ADC_POS_REF_V; // TODO: provide true vref +} + uint32_t px4_arch_adc_temp_sensor_mask() { return 1 << 16; diff --git a/src/drivers/drv_adc.h b/src/drivers/drv_adc.h index 538384c3d5..f0accdf9e5 100644 --- a/src/drivers/drv_adc.h +++ b/src/drivers/drv_adc.h @@ -82,6 +82,13 @@ void px4_arch_adc_uninit(uint32_t base_address); */ uint32_t px4_arch_adc_sample(uint32_t base_address, unsigned channel); +/** + * Get the ADC positive reference voltage + * N.B This assume that all ADC channels share the same vref. + * @return v_ref + */ +float px4_arch_adc_reference_v(void); + /** * Get the temperature sensor channel bitmask */ @@ -93,4 +100,3 @@ uint32_t px4_arch_adc_temp_sensor_mask(void); uint32_t px4_arch_adc_dn_fullcount(void); __END_DECLS -