1
0
Fork 0
mirror of https://github.com/opentx/opentx.git synced 2025-07-15 20:35:17 +03:00

X-Lite PWM sticks (#5632)

X-Lite PWM sticks
This commit is contained in:
Bertrand Songis 2018-01-26 18:50:39 +01:00 committed by GitHub
parent c7df47703e
commit 0832a5c254
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
11 changed files with 65 additions and 67 deletions

View file

@ -1003,8 +1003,9 @@ void menuModelSetup(event_t event)
lcdDrawTextAlignedLeft(y, STR_RECEIVER_NUM);
}
if (IS_MODULE_PXX(moduleIdx) || IS_MODULE_DSM2(moduleIdx) || IS_MODULE_MULTIMODULE(moduleIdx)) {
if (xOffsetBind) lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], (l_posHorz==0 ? attr : 0) | LEADING0|LEFT, 2);
if (attr && l_posHorz==0) {
if (xOffsetBind)
lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.header.modelId[moduleIdx], (l_posHorz==0 ? attr : 0) | LEADING0|LEFT, 2);
if (attr && l_posHorz == 0) {
if (editMode>0 || p1valdiff) {
CHECK_INCDEC_MODELVAR_ZERO(event, g_model.header.modelId[moduleIdx], MAX_RX_NUM(moduleIdx));
if (checkIncDec_Ret) {
@ -1021,7 +1022,7 @@ void menuModelSetup(event_t event)
#if defined(MULTIMODULE)
if (multiBindStatus == MULTI_BIND_FINISHED) {
multiBindStatus = MULTI_NORMAL_OPERATION;
s_editMode=0;
s_editMode = 0;
}
#endif
#if defined(PCBTARANIS)
@ -1029,7 +1030,8 @@ void menuModelSetup(event_t event)
if (s_editMode > 0) {
if (l_posHorz == 1) {
if (IS_MODULE_R9M(moduleIdx) || (IS_MODULE_XJT(moduleIdx) && g_model.moduleData[moduleIdx].rfProtocol== RF_PROTO_X16)) {
if (event == EVT_KEY_BREAK(KEY_ENTER)) {
if (EVT_KEY_MASK(event) == KEY_ENTER) {
killEvents(event);
uint8_t default_selection;
if (IS_MODULE_R9M_LBT(moduleIdx)) {
POPUP_MENU_ADD_ITEM(STR_BINDING_25MW_CH1_8_TELEM_OFF);

View file

@ -2597,7 +2597,7 @@ void opentxInit(OPENTX_INIT_ARGS)
}
#if NUM_PWMANALOGS > 0
pwmCheck();
analogPwmCheck();
#endif
if (!unexpectedShutdown) {

View file

@ -103,8 +103,14 @@ void adcInit()
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->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)
ADC_MAIN->SQR2 = (ADC_CHANNEL_BATT<<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<<25) + (ADC_CHANNEL_POT2<<20); // conversions 1 to 6
if (ANALOGS_PWM_ENABLED()) {
ADC_MAIN->SQR2 = 0;
ADC_MAIN->SQR3 = (ADC_CHANNEL_POT1<<25) + (ADC_CHANNEL_POT2<<20) + (ADC_CHANNEL_BATT<<0);
}
else {
ADC_MAIN->SQR2 = (ADC_CHANNEL_BATT<<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<<25) + (ADC_CHANNEL_POT2<<20); // conversions 1 to 6
}
#elif defined(PCBX7)
ADC_MAIN->SQR2 = (ADC_CHANNEL_BATT<<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<<25) + (ADC_CHANNEL_POT2<<20); // conversions 1 to 6
@ -142,7 +148,7 @@ void adcInit()
#if NUM_PWMANALOGS > 0
if (ANALOGS_PWM_ENABLED()) {
pwmInit();
analogPwmInit();
}
#endif
}
@ -204,7 +210,7 @@ void adcRead()
#if NUM_PWMANALOGS > 0
if (ANALOGS_PWM_ENABLED()) {
pwmRead(adcValues);
analogPwmRead(adcValues);
}
#endif
}

View file

@ -29,7 +29,7 @@ volatile uint32_t timer_capture_rising_time[4];
volatile uint32_t timer_capture_values[4][TIMESAMPLE_COUNT];
volatile uint8_t timer_capture_indexes[4];
void pwmInit()
void analogPwmInit()
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = PWM_GPIOA_PINS;
@ -75,56 +75,17 @@ inline uint32_t TIM_GetCapture(uint8_t n)
inline void TIM_SetPolarityRising(uint8_t n)
{
switch (n) {
case 0:
PWM_TIMER->CCER &= ~TIM_CCER_CC1P;
break;
case 1:
PWM_TIMER->CCER &= ~TIM_CCER_CC2P;
break;
case 2:
PWM_TIMER->CCER &= ~TIM_CCER_CC3P;
break;
case 3:
PWM_TIMER->CCER &= ~TIM_CCER_CC4P;
break;
}
PWM_TIMER->CCER &= ~(TIM_CCER_CC1P << (n * 4));
}
inline void TIM_SetPolarityFalling(uint8_t n)
{
switch (n) {
case 0:
PWM_TIMER->CCER |= TIM_CCER_CC1P;
break;
case 1:
PWM_TIMER->CCER |= TIM_CCER_CC2P;
break;
case 2:
PWM_TIMER->CCER |= TIM_CCER_CC3P;
break;
case 3:
PWM_TIMER->CCER |= TIM_CCER_CC4P;
break;
}
PWM_TIMER->CCER |= (TIM_CCER_CC1P << (n * 4));
}
inline void TIM_ClearITPendingBit(uint8_t n)
{
switch (n) {
case 0:
PWM_TIMER->SR = ~TIM_IT_CC1;
break;
case 1:
PWM_TIMER->SR = ~TIM_IT_CC2;
break;
case 2:
PWM_TIMER->SR = ~TIM_IT_CC3;
break;
case 3:
PWM_TIMER->SR = ~TIM_IT_CC4;
break;
}
PWM_TIMER->SR = ~(TIM_IT_CC1 << n);
}
inline uint32_t diff_with_16bits_overflow(uint32_t a, uint32_t b)
@ -160,7 +121,7 @@ extern "C" void PWM_IRQHandler(void)
}
}
void pwmRead(uint16_t * values)
void analogPwmRead(uint16_t * values)
{
uint32_t tmp[4];
@ -186,7 +147,7 @@ void pwmRead(uint16_t * values)
values[3] = tmp[2];
}
void pwmCheck()
void analogPwmCheck()
{
// I have ~1860 interrupts with only one stick
if (pwm_interrupt_count < 1000) {

View file

@ -28,8 +28,8 @@ if (PCB STREQUAL X10)
set(TARGET_SRC
${TARGET_SRC}
../common/arm/stm32/audio_dac_driver.cpp
../common/arm/stm32/adc_driver.cpp
pwm_driver.cpp
../common/arm/stm32/analog_adc_driver.cpp
../common/arm/stm32/analog_pwm_driver.cpp
)
set(BITMAPS_TARGET x10_bitmaps)

View file

@ -400,9 +400,9 @@ uint16_t getBatteryVoltage(); // returns current battery voltage in 10mV steps
#if NUM_PWMANALOGS > 0
extern uint8_t analogs_pwm_disabled;
#define ANALOGS_PWM_ENABLED() (analogs_pwm_disabled == false)
void pwmInit(void);
void pwmRead(uint16_t * values);
void pwmCheck();
void analogPwmInit(void);
void analogPwmRead(uint16_t * values);
void analogPwmCheck();
extern volatile uint32_t pwm_interrupt_count;
#endif

View file

@ -158,9 +158,16 @@ set(TARGET_SRC
backlight_driver.cpp
extmodule_driver.cpp
../common/arm/stm32/audio_dac_driver.cpp
../common/arm/stm32/adc_driver.cpp
../common/arm/stm32/analog_adc_driver.cpp
)
if(PCB STREQUAL XLITE)
set(TARGET_SRC
${TARGET_SRC}
../common/arm/stm32/analog_pwm_driver.cpp
)
endif()
set(FIRMWARE_TARGET_SRC
${FIRMWARE_TARGET_SRC}
${LCD_DRIVER}

View file

@ -157,7 +157,7 @@ void boardInit()
SERIAL_RCC_AHB1Periph | TRAINER_RCC_AHB1Periph |
HEARTBEAT_RCC_AHB1Periph | BT_RCC_AHB1Periph, ENABLE);
RCC_APB1PeriphClockCmd(LCD_RCC_APB1Periph | AUDIO_RCC_APB1Periph |
RCC_APB1PeriphClockCmd(LCD_RCC_APB1Periph | AUDIO_RCC_APB1Periph | ADC_RCC_APB1Periph |
BACKLIGHT_RCC_APB1Periph | HAPTIC_RCC_APB1Periph | INTERRUPT_xMS_RCC_APB1Periph |
TIMER_2MHz_RCC_APB1Periph | I2C_RCC_APB1Periph |
SD_RCC_APB1Periph | TRAINER_RCC_APB1Periph |

View file

@ -428,6 +428,16 @@ enum Analogs {
#define NUM_XPOTS NUM_POTS
#define NUM_SLIDERS (TX_VOLTAGE-POT_LAST-1)
#if defined(PCBXLITE)
#define NUM_PWMANALOGS 4
extern uint8_t analogs_pwm_disabled;
#define ANALOGS_PWM_ENABLED() (analogs_pwm_disabled == false)
void analogPwmInit(void);
void analogPwmRead(uint16_t * values);
void analogPwmCheck();
extern volatile uint32_t pwm_interrupt_count;
#endif
enum CalibratedAnalogs {
CALIBRATED_STICK1,
CALIBRATED_STICK2,

View file

@ -388,6 +388,7 @@
#define ADC_SAMPTIME 2 // sample time = 28 cycles
#if defined(PCBX9E)
#define ADC_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOF | RCC_AHB1Periph_DMA2)
#define ADC_RCC_APB1Periph 0
#define ADC_RCC_APB2Periph (RCC_APB2Periph_ADC1 | RCC_APB2Periph_ADC3)
#define ADC_GPIO_PIN_STICK_RV GPIO_Pin_0 // PA.00
#define ADC_GPIO_PIN_STICK_RH GPIO_Pin_1 // PA.01
@ -406,10 +407,10 @@
#define ADC_GPIO_PIN_SLIDER3 GPIO_Pin_6 // PA.06
#define ADC_GPIO_PIN_SLIDER4 GPIO_Pin_1 // PB.01
#define ADC_GPIO_PIN_BATT GPIO_Pin_0 // PC.00
#define ADC_GPIOA_PINS (ADC_GPIO_PIN_STICK_RV | ADC_GPIO_PIN_STICK_RH | ADC_GPIO_PIN_STICK_LH | ADC_GPIO_PIN_STICK_LV | ADC_GPIO_PIN_SLIDER3)
#define ADC_GPIOB_PINS (ADC_GPIO_PIN_POT2 | ADC_GPIO_PIN_SLIDER4)
#define ADC_GPIOC_PINS (ADC_GPIO_PIN_POT3 | ADC_GPIO_PIN_POT4 | ADC_GPIO_PIN_SLIDER1 | ADC_GPIO_PIN_SLIDER2 | ADC_GPIO_PIN_BATT)
#define ADC_GPIOF_PINS (ADC_GPIO_PIN_POT1 | ADC_GPIO_PIN_SLIDER1 | ADC_GPIO_PIN_SLIDER2)
#define ADC_GPIOA_PINS (ADC_GPIO_PIN_STICK_RV | ADC_GPIO_PIN_STICK_RH | ADC_GPIO_PIN_STICK_LH | ADC_GPIO_PIN_STICK_LV | ADC_GPIO_PIN_SLIDER3)
#define ADC_GPIOB_PINS (ADC_GPIO_PIN_POT2 | ADC_GPIO_PIN_SLIDER4)
#define ADC_GPIOC_PINS (ADC_GPIO_PIN_POT3 | ADC_GPIO_PIN_POT4 | ADC_GPIO_PIN_SLIDER1 | ADC_GPIO_PIN_SLIDER2 | ADC_GPIO_PIN_BATT)
#define ADC_GPIOF_PINS (ADC_GPIO_PIN_POT1 | ADC_GPIO_PIN_SLIDER1 | ADC_GPIO_PIN_SLIDER2)
#define ADC_CHANNEL_POT1 ADC_Channel_6 // ADC3_IN6
#define ADC_CHANNEL_POT2 ADC_Channel_8 // ADC1_IN8
#define ADC_CHANNEL_POT3 ADC_Channel_15 // ADC1_IN15
@ -427,6 +428,7 @@
#define ADC_EXT_SAMPTIME 3 // sample time = 56 cycles
#elif defined(PCBX9DP)
#define ADC_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA2)
#define ADC_RCC_APB1Periph 0
#define ADC_RCC_APB2Periph RCC_APB2Periph_ADC1
#define ADC_GPIO_PIN_STICK_RV GPIO_Pin_0 // PA.00
#define ADC_GPIO_PIN_STICK_RH GPIO_Pin_1 // PA.01
@ -453,11 +455,17 @@
#define ADC_CHANNEL_BATT ADC_Channel_10
#elif defined(PCBXLITE)
#define ADC_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA2)
#define ADC_RCC_APB1Periph RCC_APB1Periph_TIM5
#define ADC_RCC_APB2Periph RCC_APB2Periph_ADC1
#define ADC_GPIO_PIN_STICK_RV GPIO_Pin_0 // PA.00
#define ADC_GPIO_PIN_STICK_RH GPIO_Pin_1 // PA.01
#define ADC_GPIO_PIN_STICK_LV GPIO_Pin_2 // PA.02
#define ADC_GPIO_PIN_STICK_LH GPIO_Pin_3 // PA.03
#define PWM_TIMER TIM5
#define PWM_GPIO GPIOA
#define PWM_GPIO_AF GPIO_AF_TIM5
#define PWM_IRQHandler TIM5_IRQHandler
#define PWM_IRQn TIM5_IRQn
#define ADC_CHANNEL_STICK_RV ADC_Channel_0 // ADC1_IN0
#define ADC_CHANNEL_STICK_RH ADC_Channel_1 // ADC1_IN1
#define ADC_CHANNEL_STICK_LV ADC_Channel_2 // ADC1_IN2
@ -465,7 +473,9 @@
#define ADC_GPIO_PIN_POT1 GPIO_Pin_1 // PC.01
#define ADC_GPIO_PIN_POT2 GPIO_Pin_2 // PC.02
#define ADC_GPIO_PIN_BATT GPIO_Pin_0 // PC.00
#define ADC_GPIOA_PINS (ADC_GPIO_PIN_STICK_RV | ADC_GPIO_PIN_STICK_RH | ADC_GPIO_PIN_STICK_LH | ADC_GPIO_PIN_STICK_LV | ADC_GPIO_PIN_POT1)
#define STICKS_GPIOA_PINS (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3)
#define PWM_GPIOA_PINS STICKS_GPIOA_PINS
#define ADC_GPIOA_PINS (ADC_GPIO_PIN_POT1 | (ANALOGS_PWM_ENABLED() ? 0 : STICKS_GPIOA_PINS))
#define ADC_GPIOB_PINS ADC_GPIO_PIN_POT2
#define ADC_GPIOC_PINS ADC_GPIO_PIN_BATT
#define ADC_CHANNEL_POT1 ADC_Channel_6
@ -473,6 +483,7 @@
#define ADC_CHANNEL_BATT ADC_Channel_10
#elif defined(PCBX7)
#define ADC_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA2)
#define ADC_RCC_APB1Periph 0
#define ADC_RCC_APB2Periph RCC_APB2Periph_ADC1
#define ADC_GPIO_PIN_STICK_RV GPIO_Pin_0 // PA.00
#define ADC_GPIO_PIN_STICK_RH GPIO_Pin_1 // PA.01
@ -493,6 +504,7 @@
#define ADC_CHANNEL_BATT ADC_Channel_10
#else
#define ADC_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA2)
#define ADC_RCC_APB1Periph 0
#define ADC_RCC_APB2Periph RCC_APB2Periph_ADC1
#define ADC_GPIO_PIN_STICK_RV GPIO_Pin_0 // PA.00
#define ADC_GPIO_PIN_STICK_RH GPIO_Pin_1 // PA.01

View file

@ -70,7 +70,7 @@ void intmoduleSendNextFrame()
INTMODULE_DMA_STREAM->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA
}
#if defined(TARANIS_INTERNAL_PPM)
else if (s_current_protocol[INTERNAL_MODULE] == PROTO_PPM) {
else if (s_current_protocol[INTERNAL_MODULE] == PROTO_PPM) {
INTMODULE_TIMER->CCR3 = GET_PPM_DELAY(INTERNAL_MODULE)*2;
INTMODULE_TIMER->CCER = TIM_CCER_CC3E | (GET_PPM_POLARITY(INTERNAL_MODULE) ? 0 : TIM_CCER_CC3P);
INTMODULE_TIMER->CCR2 = *(modulePulsesData[INTERNAL_MODULE].ppm.ptr - 1) - 4000; // 2mS in advance