From 366df6080e915aa5ee76fe58e751aa013849f0e2 Mon Sep 17 00:00:00 2001 From: 3djc Date: Wed, 30 Oct 2024 02:14:14 +0100 Subject: [PATCH] chore: improve VBAT measurement (#5635) --- radio/src/hal/adc_driver.cpp | 5 ++++- radio/src/targets/simu/adc_driver.cpp | 5 ++++- radio/src/targets/taranis/board.h | 28 ++++++++++++++------------- 3 files changed, 23 insertions(+), 15 deletions(-) diff --git a/radio/src/hal/adc_driver.cpp b/radio/src/hal/adc_driver.cpp index 41688e8e12d..89827a18613 100644 --- a/radio/src/hal/adc_driver.cpp +++ b/radio/src/hal/adc_driver.cpp @@ -314,7 +314,10 @@ uint16_t getBatteryVoltage() int32_t instant_vbat = anaIn(adcGetInputOffset(ADC_INPUT_VBAT)); // TODO: remove BATT_SCALE / BATTERY_DIVIDER defines -#if defined(BATT_SCALE) +#if defined(VBAT_MOSFET_DROP) + // 1000 is used as multiplier for both numerator and denominator to allow to stay in integer domain + return (uint16_t)((instant_vbat * ADC_VREF_PREC2 * ((((1000 + g_eeGeneral.txVoltageCalibration)) * (VBAT_DIV_R2 + VBAT_DIV_R1)) / VBAT_DIV_R1)) / (2*RESX*1000)) + VBAT_MOSFET_DROP; +#elif defined(BATT_SCALE) instant_vbat = (instant_vbat * BATT_SCALE * (128 + g_eeGeneral.txVoltageCalibration)) / BATTERY_DIVIDER; diff --git a/radio/src/targets/simu/adc_driver.cpp b/radio/src/targets/simu/adc_driver.cpp index d164cf24eec..3e6f6deda1e 100644 --- a/radio/src/targets/simu/adc_driver.cpp +++ b/radio/src/targets/simu/adc_driver.cpp @@ -43,10 +43,13 @@ static bool simu_start_conversion() // set VBAT / RTC_BAT if (adcGetMaxInputs(ADC_INPUT_VBAT) > 0) { +#if defined(VBAT_MOSFET_DROP) + uint32_t vbat = (2 * (BATTERY_MAX + BATTERY_MIN) * (VBAT_DIV_R2 + VBAT_DIV_R1)) / VBAT_DIV_R1; +#elif defined(BATT_SCALE) uint32_t vbat = (BATTERY_MAX + BATTERY_MIN) * 5; // * 10 / 2 -#if defined(BATT_SCALE) vbat = ((vbat - VOLTAGE_DROP) * BATTERY_DIVIDER) / (BATT_SCALE * 128); #else + uint32_t vbat = (BATTERY_MAX + BATTERY_MIN) * 5; // * 10 / 2 vbat = (vbat * BATTERY_DIVIDER) / 1000; #endif setAnalogValue(adcGetInputOffset(ADC_INPUT_VBAT), vbat * 2); diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index 3e7201eb668..5ad4ed5b05f 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -408,25 +408,27 @@ void setTopBatteryValue(uint32_t volts); #define INTMODULE_FIFO_SIZE 128 -#if defined (RADIO_TX12) - #define BATTERY_DIVIDER 22830 -#elif defined (RADIO_T8) || defined(RADIO_COMMANDO8) +#if defined(MANUFACTURER_RADIOMASTER) || defined(MANUFACTURER_JUMPER) +// --- MOSFET ---- R2 --- MCU +// |__ R1 --- GND +// +#define VBAT_DIV_R1 160 // kOhms +#define VBAT_DIV_R2 499 // kOhms +#if defined(MANUFACTURER_JUMPER) +#define VBAT_MOSFET_DROP 50 // * 10mV +#else +#define VBAT_MOSFET_DROP 25 // * 10mV +#endif +#else //--- MOSFET ---- R2 --- MCU +#if defined (RADIO_T8) || defined(RADIO_COMMANDO8) #define BATTERY_DIVIDER 50000 -#elif defined (RADIO_ZORRO) || defined(RADIO_TX12MK2) || defined(RADIO_BOXER) || defined(RADIO_MT12) || defined(RADIO_POCKET) - #define BATTERY_DIVIDER 23711 // = 2047*128*BATT_SCALE/(100*(VREF*(160+499)/160)) #elif defined (RADIO_LR3PRO) #define BATTERY_DIVIDER 39500 #else #define BATTERY_DIVIDER 26214 #endif - -#if defined(RADIO_ZORRO) || defined(RADIO_TX12MK2) || defined(RADIO_BOXER) || defined(RADIO_MT12) || defined(RADIO_POCKET) - #define VOLTAGE_DROP 45 -#elif defined(RADIO_TPROV2) || defined(RADIO_TPROS) || defined(RADIO_FAMILY_T20) - #define VOLTAGE_DROP 60 -#else - #define VOLTAGE_DROP 20 -#endif +#define VOLTAGE_DROP 20 +#endif //--- MOSFET ---- R2 --- MCU #if defined(RADIO_FAMILY_T20) #define NUM_TRIMS 8