From a3af63edad5f1a1fdb402f396889ce83f137a003 Mon Sep 17 00:00:00 2001 From: Damjan Adamic Date: Sun, 20 Mar 2016 16:05:17 +0100 Subject: [PATCH] Re #3371: tx battery measuring code moved to board_xxx.cpp, battery check code rewritten for ARM platforms, Horus battery calibrated. --- .../src/gui/taranis/menu_general_diaganas.cpp | 8 +-- radio/src/main_arm.cpp | 67 ++++++++++++++++++- radio/src/opentx.cpp | 3 + radio/src/simu.cpp | 10 ++- radio/src/targets/horus/board_horus.cpp | 6 ++ radio/src/targets/horus/board_horus.h | 7 +- radio/src/targets/taranis/board_taranis.cpp | 8 +++ radio/src/targets/taranis/board_taranis.h | 1 + 8 files changed, 95 insertions(+), 15 deletions(-) diff --git a/radio/src/gui/taranis/menu_general_diaganas.cpp b/radio/src/gui/taranis/menu_general_diaganas.cpp index 19f453a0c..99bc08cf3 100644 --- a/radio/src/gui/taranis/menu_general_diaganas.cpp +++ b/radio/src/gui/taranis/menu_general_diaganas.cpp @@ -42,11 +42,7 @@ void menuGeneralDiagAna(uint8_t event) } lcd_putsLeft(MENU_HEADER_HEIGHT+1+6*FH, STR_BATT_CALIB); - static int32_t adcBatt; - adcBatt = ((adcBatt * 7) + anaIn(TX_VOLTAGE)) / 8; - uint32_t batCalV = (adcBatt + (adcBatt*g_eeGeneral.txVoltageCalibration)/128) * BATT_SCALE; - batCalV >>= 11; - batCalV += 2; // because of the diode - putsVolts(LEN_CALIB_FIELDS*FW+4*FW, MENU_HEADER_HEIGHT+1+6*FH, batCalV, s_editMode > 0 ? BLINK|INVERS : INVERS); + uint32_t batCalV = getBatteryVoltage(); + putsVolts(LEN_CALIB_FIELDS*FW+4*FW, MENU_HEADER_HEIGHT+1+6*FH, getBatteryVoltage(), (s_editMode > 0 ? BLINK : 0) | INVERS | PREC2); if (s_editMode > 0) CHECK_INCDEC_GENVAR(event, g_eeGeneral.txVoltageCalibration, -127, 127); } diff --git a/radio/src/main_arm.cpp b/radio/src/main_arm.cpp index 9b64283a4..6b5103aee 100644 --- a/radio/src/main_arm.cpp +++ b/radio/src/main_arm.cpp @@ -98,6 +98,71 @@ void checkEeprom() } #endif +#define BAT_AVG_SAMPLES 8 + +void checkBatteryAlarms() +{ + // TRACE("checkBatteryAlarms()"); + if (IS_TXBATT_WARNING() && g_vbat100mV>50) { + AUDIO_TX_BATTERY_LOW(); + // TRACE("checkBatteryAlarms(): battery low"); + } +#if defined(PCBSKY9X) + else if (g_eeGeneral.temperatureWarn && getTemperature() >= g_eeGeneral.temperatureWarn) { + AUDIO_TX_TEMP_HIGH(); + } + else if (g_eeGeneral.mAhWarn && (g_eeGeneral.mAhUsed + Current_used * (488 + g_eeGeneral.txCurrentCalibration)/8192/36) / 500 >= g_eeGeneral.mAhWarn) { // TODO move calculation into board file + AUDIO_TX_MAH_HIGH(); + } +#endif +} + +void checkBattery() +{ + static uint32_t batSum; + static uint8_t sampleCount; + // filter battery voltage by averaging it + if (g_vbat100mV == 0) { + g_vbat100mV = (getBatteryVoltage() + 5) / 10; + batSum = 0; + sampleCount = 0; + } + else { + batSum += getBatteryVoltage(); + // TRACE("checkBattery(): sampled = %d", getBatteryVoltage()); + if (++sampleCount >= BAT_AVG_SAMPLES) { + g_vbat100mV = (batSum + BAT_AVG_SAMPLES * 5 ) / (BAT_AVG_SAMPLES * 10); + batSum = 0; + sampleCount = 0; + // TRACE("checkBattery(): g_vbat100mV = %d", g_vbat100mV); + } + } +} + +void periodicTick_1s() +{ + checkBattery(); +} + +void periodicTick_10s() +{ + checkBatteryAlarms(); +} + +void periodicTick() +{ + static uint8_t count10s; + static uint32_t lastTime; + if ( (get_tmr10ms() - lastTime) >= 100 ) { + lastTime += 100; + periodicTick_1s(); + if (++count10s >= 10) { + count10s = 0; + periodicTick_10s(); + } + } +} + #if defined(GUI) && defined(COLORLCD) void guiMain(evt_t evt) { @@ -328,7 +393,7 @@ void perMain() writeLogs(); handleUsbConnection(); checkTrainerSettings(); - checkBattery(); + periodicTick(); evt_t evt = getEvent(false); if (evt && (g_eeGeneral.backlightMode & e_backlight_mode_keys)) backlightOn(); // on keypress turn the light on diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 83cdc4cff..f7336b4a6 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -2153,6 +2153,7 @@ uint8_t getSticksNavigationEvent() } #endif +#if !defined(CPUARM) void checkBattery() { static uint8_t counter = 0; @@ -2222,6 +2223,8 @@ void checkBattery() } } } +#endif // #if !defined(CPUARM) + #if !defined(SIMU) && !defined(CPUARM) diff --git a/radio/src/simu.cpp b/radio/src/simu.cpp index 911eb7f52..57f7c4201 100644 --- a/radio/src/simu.cpp +++ b/radio/src/simu.cpp @@ -544,9 +544,15 @@ uint16_t anaIn(uint8_t chan) return th9xSim->sliders[chan]->getValue(); else if (chanknobs[chan-NUM_STICKS]->getValue(); -#if defined(PCBTARANIS) || defined(PCBFLAMENCO) || defined(PCBHORUS) +#if defined(PCBHORUS) else if (chan == TX_VOLTAGE) - return 1000; + return 1737; //~10.6V +#elif (defined(PCBTARANIS) && defined(REV9E)) + else if (chan == TX_VOLTAGE) + return 1420; //~10.6V +#elif defined(PCBTARANIS) || defined(PCBFLAMENCO) + else if (chan == TX_VOLTAGE) + return 1000; //~7.4V #elif defined(PCBSKY9X) else if (chan == TX_VOLTAGE) return 5.1*1500/11.3; diff --git a/radio/src/targets/horus/board_horus.cpp b/radio/src/targets/horus/board_horus.cpp index 9898f2a47..f930c45bf 100644 --- a/radio/src/targets/horus/board_horus.cpp +++ b/radio/src/targets/horus/board_horus.cpp @@ -266,3 +266,9 @@ void checkTrainerSettings() } } } + +uint16_t getBatteryVoltage() +{ + int32_t instant_vbat = anaIn(TX_VOLTAGE); // using filtered ADC value on purpose + return (uint16_t)((instant_vbat * (1000 + g_eeGeneral.txVoltageCalibration) ) / 1637); +} diff --git a/radio/src/targets/horus/board_horus.h b/radio/src/targets/horus/board_horus.h index 031e272b0..7ee5498cb 100644 --- a/radio/src/targets/horus/board_horus.h +++ b/radio/src/targets/horus/board_horus.h @@ -242,12 +242,7 @@ extern uint16_t adcValues[NUMBER_ANALOG]; void adcInit(void); void adcRead(void); uint16_t getAnalogValue(uint8_t index); - -#if defined(REV3) - #define BATT_SCALE 120 -#else - #define BATT_SCALE 150 -#endif +uint16_t getBatteryVoltage(); // returns current battery voltage in 10mV steps #if defined(__cplusplus) && !defined(SIMU) extern "C" { diff --git a/radio/src/targets/taranis/board_taranis.cpp b/radio/src/targets/taranis/board_taranis.cpp index 09344fb8c..9894d1379 100644 --- a/radio/src/targets/taranis/board_taranis.cpp +++ b/radio/src/targets/taranis/board_taranis.cpp @@ -316,3 +316,11 @@ void checkTrainerSettings() } } } + +uint16_t getBatteryVoltage() +{ + int32_t instant_vbat = anaIn(TX_VOLTAGE); // using filtered ADC value on purpose + instant_vbat = (instant_vbat * BATT_SCALE * (128 + g_eeGeneral.txVoltageCalibration) ) / 26214; + instant_vbat += 20; // add 0.2V because of the diode TODO check if this is needed, but removal will beak existing calibrations!!! + return (uint16_t)instant_vbat; +} diff --git a/radio/src/targets/taranis/board_taranis.h b/radio/src/targets/taranis/board_taranis.h index 8f7adf706..00b28505f 100644 --- a/radio/src/targets/taranis/board_taranis.h +++ b/radio/src/targets/taranis/board_taranis.h @@ -268,6 +268,7 @@ void adcInit(void); void adcRead(void); extern uint16_t adcValues[NUMBER_ANALOG]; uint16_t getAnalogValue(uint8_t index); +uint16_t getBatteryVoltage(); // returns current battery voltage in 10mV steps #define BATT_SCALE 150