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,
#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,8 +313,15 @@ 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);
if (attr) {

View file

@ -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)

View file

@ -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)

View file

@ -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,7 +135,7 @@ 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)
@ -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)
{

View file

@ -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)

View file

@ -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

View file

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

View file

@ -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

View file

@ -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