From 617a892c066e51b5352db9e3ca48dd3274f7ea3e Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Fri, 22 Mar 2019 16:45:42 +0100 Subject: [PATCH] ADC Voltage displayed in HARDWARE page --- radio/src/gui/128x64/radio_hardware.cpp | 17 ++++++++++-- radio/src/opentx.cpp | 5 ++-- radio/src/opentx.h | 2 ++ .../targets/common/arm/stm32/adc_driver.cpp | 27 ++++++++++++------- radio/src/targets/horus/board.h | 8 +++--- radio/src/targets/horus/hal.h | 1 + radio/src/targets/taranis/board.cpp | 2 ++ radio/src/targets/taranis/board.h | 6 +++-- radio/src/targets/taranis/hal.h | 1 + 9 files changed, 50 insertions(+), 19 deletions(-) diff --git a/radio/src/gui/128x64/radio_hardware.cpp b/radio/src/gui/128x64/radio_hardware.cpp index 01a412394..9203b40ea 100644 --- a/radio/src/gui/128x64/radio_hardware.cpp +++ b/radio/src/gui/128x64/radio_hardware.cpp @@ -118,6 +118,9 @@ enum MenuRadioHardwareItems { ITEM_RADIO_HARDWARE_SH, #endif ITEM_RADIO_HARDWARE_BATTERY_CALIB, +#if defined(STM32) + ITEM_RADIO_HARDWARE_RTC_BATTERY, +#endif #if defined(TX_CAPACITY_MEASUREMENT) ITEM_RADIO_HARDWARE_CAPACITY_CALIB, #endif @@ -190,6 +193,9 @@ void menuRadioHardware(event_t event) LABEL(Switches), SWITCHES_ROWS, 0 /* battery calib */, +#if defined(STM32) + READONLY_ROW, +#endif #if defined(TX_CAPACITY_MEASUREMENT) 0, #endif @@ -307,10 +313,17 @@ void menuRadioHardware(event_t event) } break; +#if defined(STM32) + case ITEM_RADIO_HARDWARE_RTC_BATTERY: + lcdDrawTextAlignedLeft(y, "RTC Batt"); + putsVolts(HW_SETTINGS_COLUMN2, y, vbattRTC, PREC2|LEFT); + break; +#endif + #if defined(TX_CAPACITY_MEASUREMENT) - case ITEM_RADIO_HARDWARE_BATTERY_CALIB: + case ITEM_RADIO_HARDWARE_CAPACITY_CALIB: lcdDrawTextAlignedLeft(y, STR_CURRENT_CALIB); - drawValueWithUnit(HW_SETTINGS_COLUMN2, y, getCurrent(), UNIT_MILLIAMPS, attr) ; + drawValueWithUnit(HW_SETTINGS_COLUMN2, y, getCurrent(), UNIT_MILLIAMPS, attr); if (attr) { CHECK_INCDEC_GENVAR(event, g_eeGeneral.txCurrentCalibration, -49, 49); } diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 32f1db946..2aef36ba0 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -27,14 +27,13 @@ ModelData g_model; Clipboard clipboard; #endif - uint8_t unexpectedShutdown = 0; -/* AVR: mixer duration in 1/16ms */ +uint16_t vbattRTC; + /* ARM: mixer duration in 0.5us */ uint16_t maxMixerDuration; - uint8_t heartbeat; #if defined(OVERRIDE_CHANNEL_FUNCTION) diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 9558e2141..76c44777e 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -572,6 +572,8 @@ void flightReset(uint8_t check=true); extern uint8_t unexpectedShutdown; +extern uint16_t vbattRTC; + extern uint16_t maxMixerDuration; #define DURATION_MS_PREC2(x) ((x)/20) diff --git a/radio/src/targets/common/arm/stm32/adc_driver.cpp b/radio/src/targets/common/arm/stm32/adc_driver.cpp index 6b21ec03d..eea2776fe 100644 --- a/radio/src/targets/common/arm/stm32/adc_driver.cpp +++ b/radio/src/targets/common/arm/stm32/adc_driver.cpp @@ -60,7 +60,7 @@ #define NUM_ANALOGS_ADC NUM_ANALOGS #endif -uint16_t adcValues[NUM_ANALOGS] __DMA; +uint16_t adcValues[NUM_ANALOGS + 1/*RTC*/] __DMA; void adcInit() { @@ -92,7 +92,7 @@ void adcInit() ADC_MAIN->CR1 = ADC_CR1_SCAN; ADC_MAIN->CR2 = ADC_CR2_ADON | ADC_CR2_DMA | ADC_CR2_DDS; - ADC_MAIN->SQR1 = (NUM_ANALOGS_ADC - 1) << 20; // bits 23:20 = number of conversions + ADC_MAIN->SQR1 = (NUM_ANALOGS_ADC + 1/*RTC*/ - 1) << 20; // bits 23:20 = number of conversions #if defined(PCBX10) if (STICKS_PWM_ENABLED()) { @@ -104,25 +104,26 @@ void adcInit() ADC_MAIN->SQR3 = (ADC_CHANNEL_STICK_LH<<0) + (ADC_CHANNEL_STICK_LV<<5) + (ADC_CHANNEL_STICK_RV<<10) + (ADC_CHANNEL_STICK_RH<<15) + (ADC_CHANNEL_POT1<<20) + (ADC_CHANNEL_POT2<<25); // conversions 1 to 6 } #elif defined(PCBX9E) - ADC_MAIN->SQR2 = (ADC_CHANNEL_POT4<<0) + (ADC_CHANNEL_SLIDER3<<5) + (ADC_CHANNEL_SLIDER4<<10) + (ADC_CHANNEL_BATT<<15); // conversions 7 and more + ADC_MAIN->SQR2 = (ADC_CHANNEL_POT4<<0) + (ADC_CHANNEL_SLIDER3<<5) + (ADC_CHANNEL_SLIDER4<<10) + (ADC_CHANNEL_BATT<<15) + (ADC_CHANNEL_RTC<<20); // conversions 7 and more ADC_MAIN->SQR3 = (ADC_CHANNEL_STICK_LH<<0) + (ADC_CHANNEL_STICK_LV<<5) + (ADC_CHANNEL_STICK_RV<<10) + (ADC_CHANNEL_STICK_RH<<15) + (ADC_CHANNEL_POT2<<20) + (ADC_CHANNEL_POT3<<25); // conversions 1 to 6 #elif defined(PCBXLITE) if (STICKS_PWM_ENABLED()) { ADC_MAIN->SQR2 = 0; - ADC_MAIN->SQR3 = (ADC_CHANNEL_POT1<<0) + (ADC_CHANNEL_POT2<<5) + (ADC_CHANNEL_BATT<<10); + ADC_MAIN->SQR3 = (ADC_CHANNEL_POT1<<0) + (ADC_CHANNEL_POT2<<5) + (ADC_CHANNEL_BATT<<10) + (ADC_CHANNEL_RTC<<15); } else { - ADC_MAIN->SQR2 = (ADC_CHANNEL_BATT<<0); + ADC_MAIN->SQR2 = (ADC_CHANNEL_BATT<<0) + (ADC_CHANNEL_RTC<<5); ADC_MAIN->SQR3 = (ADC_CHANNEL_STICK_LH<<0) + (ADC_CHANNEL_STICK_LV<<5) + (ADC_CHANNEL_STICK_RV<<10) + (ADC_CHANNEL_STICK_RH<<15) + (ADC_CHANNEL_POT1<<20) + (ADC_CHANNEL_POT2<<25); // conversions 1 to 6 } #elif defined(PCBX7) // TODO why do we invert POT1 and POT2 here? - ADC_MAIN->SQR2 = (ADC_CHANNEL_BATT<<0); // conversions 7 and more + ADC_MAIN->SQR2 = (ADC_CHANNEL_BATT<<0) + (ADC_CHANNEL_RTC<<5); // conversions 7 and more ADC_MAIN->SQR3 = (ADC_CHANNEL_STICK_LH<<0) + (ADC_CHANNEL_STICK_LV<<5) + (ADC_CHANNEL_STICK_RV<<10) + (ADC_CHANNEL_STICK_RH<<15) + (ADC_CHANNEL_POT1<<25) + (ADC_CHANNEL_POT2<<20); // conversions 1 to 6 #elif defined(PCBX3) + ADC_MAIN->SQR2 = (ADC_CHANNEL_RTC<<0); // conversions 7 and more ADC_MAIN->SQR3 = (ADC_CHANNEL_STICK_LH<<0) + (ADC_CHANNEL_STICK_LV<<5) + (ADC_CHANNEL_STICK_RV<<10) + (ADC_CHANNEL_STICK_RH<<15) + (ADC_CHANNEL_POT1<<20) + (ADC_CHANNEL_BATT<<25); // conversions 1 to 6 #else - ADC_MAIN->SQR2 = (ADC_CHANNEL_POT3<<0) + (ADC_CHANNEL_SLIDER1<<5) + (ADC_CHANNEL_SLIDER2<<10) + (ADC_CHANNEL_BATT<<15); // conversions 7 and more + ADC_MAIN->SQR2 = (ADC_CHANNEL_POT3<<0) + (ADC_CHANNEL_SLIDER1<<5) + (ADC_CHANNEL_SLIDER2<<10) + (ADC_CHANNEL_BATT<<15) + (ADC_CHANNEL_RTC<<20); // conversions 7 and more ADC_MAIN->SQR3 = (ADC_CHANNEL_STICK_LH<<0) + (ADC_CHANNEL_STICK_LV<<5) + (ADC_CHANNEL_STICK_RV<<10) + (ADC_CHANNEL_STICK_RH<<15) + (ADC_CHANNEL_POT1<<20) + (ADC_CHANNEL_POT2<<25); // conversions 1 to 6 #endif @@ -134,13 +135,13 @@ void adcInit() ADC_DMA_Stream->CR = DMA_SxCR_PL | ADC_DMA_SxCR_CHSEL | DMA_SxCR_MSIZE_0 | DMA_SxCR_PSIZE_0 | DMA_SxCR_MINC; ADC_DMA_Stream->PAR = CONVERT_PTR_UINT(&ADC_MAIN->DR); ADC_DMA_Stream->M0AR = CONVERT_PTR_UINT(&adcValues[FIRST_ANALOG_ADC]); - ADC_DMA_Stream->NDTR = NUM_ANALOGS_ADC; + ADC_DMA_Stream->NDTR = NUM_ANALOGS_ADC + 1/*RTC*/; ADC_DMA_Stream->FCR = DMA_SxFCR_DMDIS | DMA_SxFCR_FTH_0; #if defined(PCBX9E) ADC_EXT->CR1 = ADC_CR1_SCAN; ADC_EXT->CR2 = ADC_CR2_ADON | ADC_CR2_DMA | ADC_CR2_DDS; - ADC_EXT->SQR1 = (NUM_ANALOGS_ADC_EXT-1) << 20; + ADC_EXT->SQR1 = (NUM_ANALOGS_ADC_EXT - 1) << 20; ADC_EXT->SQR2 = 0; ADC_EXT->SQR3 = (ADC_CHANNEL_POT1<<0) + (ADC_CHANNEL_SLIDER1<<5) + (ADC_CHANNEL_SLIDER2<<10); // conversions 1 to 3 ADC_EXT->SMPR1 = 0; @@ -227,6 +228,14 @@ void adcStop() { } +uint16_t getRTCBattVoltage() +{ + ADC->CCR |= ADC_CCR_VBATE; + adcSingleRead(); + ADC->CCR &= ADC_CCR_VBATE; + return adcValues[TX_RTC] * 330 / 2048; +} + #if !defined(SIMU) uint16_t getAnalogValue(uint8_t index) { diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h index 54531aaff..03fd11070 100644 --- a/radio/src/targets/horus/board.h +++ b/radio/src/targets/horus/board.h @@ -394,9 +394,10 @@ enum Analogs { #endif SLIDER_LAST = SLIDER_FIRST + NUM_SLIDERS - 1, TX_VOLTAGE, - MOUSE1, + MOUSE1, // TODO why after voltage? MOUSE2, - NUM_ANALOGS + NUM_ANALOGS, + TX_RTC = NUM_ANALOGS }; enum CalibratedAnalogs { @@ -423,9 +424,10 @@ enum CalibratedAnalogs { #define IS_POT(x) ((x)>=POT_FIRST && (x)<=POT_LAST) #define IS_SLIDER(x) ((x)>=SLIDER_FIRST && (x)<=SLIDER_LAST) -extern uint16_t adcValues[NUM_ANALOGS]; +extern uint16_t adcValues[NUM_ANALOGS + 1/*RTC*/]; void adcInit(void); void adcRead(void); +uint16_t getRTCBattVoltage(); uint16_t getAnalogValue(uint8_t index); #define NUM_MOUSE_ANALOGS 2 #if defined(PCBX10) diff --git a/radio/src/targets/horus/hal.h b/radio/src/targets/horus/hal.h index 1336e5f13..88f6c0d83 100644 --- a/radio/src/targets/horus/hal.h +++ b/radio/src/targets/horus/hal.h @@ -234,6 +234,7 @@ #define ADC_CHANNEL_BATT ADC_Channel_5 // ADC3_IN5 #define ADC_CHANNEL_EXT1 ADC_Channel_6 // ADC3_IN6 #define ADC_CHANNEL_EXT2 ADC_Channel_7 // ADC3_IN7 + #define ADC_CHANNEL_RTC 0 // TODO later ... ADC1_IN18 #define ADC_MAIN ADC3 #define ADC_SAMPTIME 3 #define ADC_DMA DMA2 diff --git a/radio/src/targets/taranis/board.cpp b/radio/src/targets/taranis/board.cpp index 0ef1cc30e..fd3b88ca1 100644 --- a/radio/src/targets/taranis/board.cpp +++ b/radio/src/targets/taranis/board.cpp @@ -287,6 +287,8 @@ void boardInit() enableSpeaker(); initHeadphoneTrainerSwitch(); + + vbattRTC = getRTCBattVoltage(); #endif // !defined(SIMU) } diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index 7e070d33d..650e6625e 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -461,7 +461,8 @@ enum Analogs { SLIDER2, #endif TX_VOLTAGE, - NUM_ANALOGS + NUM_ANALOGS, + TX_RTC = NUM_ANALOGS }; #define NUM_POTS (POT_LAST-POT_FIRST+1) @@ -526,8 +527,9 @@ enum CalibratedAnalogs { void adcInit(void); void adcRead(void); -extern uint16_t adcValues[NUM_ANALOGS]; +extern uint16_t adcValues[NUM_ANALOGS + 1/*RTC*/]; uint16_t getAnalogValue(uint8_t index); +uint16_t getRTCBattVoltage(); // Battery driver uint16_t getBatteryVoltage(); // returns current battery voltage in 10mV steps diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index 0cab9aab7..0d35df0e0 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -549,6 +549,7 @@ #define ADC_CHANNEL_POT1 ADC_Channel_11 // ADC1_IN11 #define ADC_CHANNEL_POT2 ADC_Channel_12 // ADC1_IN12 #define ADC_CHANNEL_BATT ADC_Channel_10 // ADC1_IN10 + #define ADC_CHANNEL_RTC ADC_Channel_18 // ADC1_IN18 #elif defined(PCBX7) #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA2) #define ADC_RCC_APB1Periph 0