1
0
Fork 0
mirror of https://github.com/opentx/opentx.git synced 2025-07-24 08:45:24 +03:00

ADC Voltage displayed in HARDWARE page

This commit is contained in:
Bertrand Songis 2019-03-22 16:45:42 +01:00
parent 92e3b75e2c
commit 617a892c06
9 changed files with 50 additions and 19 deletions

View file

@ -118,6 +118,9 @@ enum MenuRadioHardwareItems {
ITEM_RADIO_HARDWARE_SH, ITEM_RADIO_HARDWARE_SH,
#endif #endif
ITEM_RADIO_HARDWARE_BATTERY_CALIB, ITEM_RADIO_HARDWARE_BATTERY_CALIB,
#if defined(STM32)
ITEM_RADIO_HARDWARE_RTC_BATTERY,
#endif
#if defined(TX_CAPACITY_MEASUREMENT) #if defined(TX_CAPACITY_MEASUREMENT)
ITEM_RADIO_HARDWARE_CAPACITY_CALIB, ITEM_RADIO_HARDWARE_CAPACITY_CALIB,
#endif #endif
@ -190,6 +193,9 @@ void menuRadioHardware(event_t event)
LABEL(Switches), LABEL(Switches),
SWITCHES_ROWS, SWITCHES_ROWS,
0 /* battery calib */, 0 /* battery calib */,
#if defined(STM32)
READONLY_ROW,
#endif
#if defined(TX_CAPACITY_MEASUREMENT) #if defined(TX_CAPACITY_MEASUREMENT)
0, 0,
#endif #endif
@ -307,10 +313,17 @@ void menuRadioHardware(event_t event)
} }
break; 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) #if defined(TX_CAPACITY_MEASUREMENT)
case ITEM_RADIO_HARDWARE_BATTERY_CALIB: case ITEM_RADIO_HARDWARE_CAPACITY_CALIB:
lcdDrawTextAlignedLeft(y, STR_CURRENT_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) { if (attr) {
CHECK_INCDEC_GENVAR(event, g_eeGeneral.txCurrentCalibration, -49, 49); CHECK_INCDEC_GENVAR(event, g_eeGeneral.txCurrentCalibration, -49, 49);
} }

View file

@ -27,14 +27,13 @@ ModelData g_model;
Clipboard clipboard; Clipboard clipboard;
#endif #endif
uint8_t unexpectedShutdown = 0; uint8_t unexpectedShutdown = 0;
/* AVR: mixer duration in 1/16ms */ uint16_t vbattRTC;
/* ARM: mixer duration in 0.5us */ /* ARM: mixer duration in 0.5us */
uint16_t maxMixerDuration; uint16_t maxMixerDuration;
uint8_t heartbeat; uint8_t heartbeat;
#if defined(OVERRIDE_CHANNEL_FUNCTION) #if defined(OVERRIDE_CHANNEL_FUNCTION)

View file

@ -572,6 +572,8 @@ void flightReset(uint8_t check=true);
extern uint8_t unexpectedShutdown; extern uint8_t unexpectedShutdown;
extern uint16_t vbattRTC;
extern uint16_t maxMixerDuration; extern uint16_t maxMixerDuration;
#define DURATION_MS_PREC2(x) ((x)/20) #define DURATION_MS_PREC2(x) ((x)/20)

View file

@ -60,7 +60,7 @@
#define NUM_ANALOGS_ADC NUM_ANALOGS #define NUM_ANALOGS_ADC NUM_ANALOGS
#endif #endif
uint16_t adcValues[NUM_ANALOGS] __DMA; uint16_t adcValues[NUM_ANALOGS + 1/*RTC*/] __DMA;
void adcInit() void adcInit()
{ {
@ -92,7 +92,7 @@ void adcInit()
ADC_MAIN->CR1 = ADC_CR1_SCAN; ADC_MAIN->CR1 = ADC_CR1_SCAN;
ADC_MAIN->CR2 = ADC_CR2_ADON | ADC_CR2_DMA | ADC_CR2_DDS; 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 defined(PCBX10)
if (STICKS_PWM_ENABLED()) { 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 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) #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 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) #elif defined(PCBXLITE)
if (STICKS_PWM_ENABLED()) { if (STICKS_PWM_ENABLED()) {
ADC_MAIN->SQR2 = 0; 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 { 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 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) #elif defined(PCBX7)
// TODO why do we invert POT1 and POT2 here? // 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 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) #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 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 #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 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 #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->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->PAR = CONVERT_PTR_UINT(&ADC_MAIN->DR);
ADC_DMA_Stream->M0AR = CONVERT_PTR_UINT(&adcValues[FIRST_ANALOG_ADC]); 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; ADC_DMA_Stream->FCR = DMA_SxFCR_DMDIS | DMA_SxFCR_FTH_0;
#if defined(PCBX9E) #if defined(PCBX9E)
ADC_EXT->CR1 = ADC_CR1_SCAN; ADC_EXT->CR1 = ADC_CR1_SCAN;
ADC_EXT->CR2 = ADC_CR2_ADON | ADC_CR2_DMA | ADC_CR2_DDS; 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->SQR2 = 0;
ADC_EXT->SQR3 = (ADC_CHANNEL_POT1<<0) + (ADC_CHANNEL_SLIDER1<<5) + (ADC_CHANNEL_SLIDER2<<10); // conversions 1 to 3 ADC_EXT->SQR3 = (ADC_CHANNEL_POT1<<0) + (ADC_CHANNEL_SLIDER1<<5) + (ADC_CHANNEL_SLIDER2<<10); // conversions 1 to 3
ADC_EXT->SMPR1 = 0; 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) #if !defined(SIMU)
uint16_t getAnalogValue(uint8_t index) uint16_t getAnalogValue(uint8_t index)
{ {

View file

@ -394,9 +394,10 @@ enum Analogs {
#endif #endif
SLIDER_LAST = SLIDER_FIRST + NUM_SLIDERS - 1, SLIDER_LAST = SLIDER_FIRST + NUM_SLIDERS - 1,
TX_VOLTAGE, TX_VOLTAGE,
MOUSE1, MOUSE1, // TODO why after voltage?
MOUSE2, MOUSE2,
NUM_ANALOGS NUM_ANALOGS,
TX_RTC = NUM_ANALOGS
}; };
enum CalibratedAnalogs { enum CalibratedAnalogs {
@ -423,9 +424,10 @@ enum CalibratedAnalogs {
#define IS_POT(x) ((x)>=POT_FIRST && (x)<=POT_LAST) #define IS_POT(x) ((x)>=POT_FIRST && (x)<=POT_LAST)
#define IS_SLIDER(x) ((x)>=SLIDER_FIRST && (x)<=SLIDER_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 adcInit(void);
void adcRead(void); void adcRead(void);
uint16_t getRTCBattVoltage();
uint16_t getAnalogValue(uint8_t index); uint16_t getAnalogValue(uint8_t index);
#define NUM_MOUSE_ANALOGS 2 #define NUM_MOUSE_ANALOGS 2
#if defined(PCBX10) #if defined(PCBX10)

View file

@ -234,6 +234,7 @@
#define ADC_CHANNEL_BATT ADC_Channel_5 // ADC3_IN5 #define ADC_CHANNEL_BATT ADC_Channel_5 // ADC3_IN5
#define ADC_CHANNEL_EXT1 ADC_Channel_6 // ADC3_IN6 #define ADC_CHANNEL_EXT1 ADC_Channel_6 // ADC3_IN6
#define ADC_CHANNEL_EXT2 ADC_Channel_7 // ADC3_IN7 #define ADC_CHANNEL_EXT2 ADC_Channel_7 // ADC3_IN7
#define ADC_CHANNEL_RTC 0 // TODO later ... ADC1_IN18
#define ADC_MAIN ADC3 #define ADC_MAIN ADC3
#define ADC_SAMPTIME 3 #define ADC_SAMPTIME 3
#define ADC_DMA DMA2 #define ADC_DMA DMA2

View file

@ -287,6 +287,8 @@ void boardInit()
enableSpeaker(); enableSpeaker();
initHeadphoneTrainerSwitch(); initHeadphoneTrainerSwitch();
vbattRTC = getRTCBattVoltage();
#endif // !defined(SIMU) #endif // !defined(SIMU)
} }

View file

@ -461,7 +461,8 @@ enum Analogs {
SLIDER2, SLIDER2,
#endif #endif
TX_VOLTAGE, TX_VOLTAGE,
NUM_ANALOGS NUM_ANALOGS,
TX_RTC = NUM_ANALOGS
}; };
#define NUM_POTS (POT_LAST-POT_FIRST+1) #define NUM_POTS (POT_LAST-POT_FIRST+1)
@ -526,8 +527,9 @@ enum CalibratedAnalogs {
void adcInit(void); void adcInit(void);
void adcRead(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 getAnalogValue(uint8_t index);
uint16_t getRTCBattVoltage();
// Battery driver // Battery driver
uint16_t getBatteryVoltage(); // returns current battery voltage in 10mV steps uint16_t getBatteryVoltage(); // returns current battery voltage in 10mV steps

View file

@ -549,6 +549,7 @@
#define ADC_CHANNEL_POT1 ADC_Channel_11 // ADC1_IN11 #define ADC_CHANNEL_POT1 ADC_Channel_11 // ADC1_IN11
#define ADC_CHANNEL_POT2 ADC_Channel_12 // ADC1_IN12 #define ADC_CHANNEL_POT2 ADC_Channel_12 // ADC1_IN12
#define ADC_CHANNEL_BATT ADC_Channel_10 // ADC1_IN10 #define ADC_CHANNEL_BATT ADC_Channel_10 // ADC1_IN10
#define ADC_CHANNEL_RTC ADC_Channel_18 // ADC1_IN18
#elif defined(PCBX7) #elif defined(PCBX7)
#define ADC_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA2) #define ADC_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA2)
#define ADC_RCC_APB1Periph 0 #define ADC_RCC_APB1Periph 0