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:
parent
92e3b75e2c
commit
617a892c06
9 changed files with 50 additions and 19 deletions
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -287,6 +287,8 @@ void boardInit()
|
|||
enableSpeaker();
|
||||
|
||||
initHeadphoneTrainerSwitch();
|
||||
|
||||
vbattRTC = getRTCBattVoltage();
|
||||
#endif // !defined(SIMU)
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue