[X-Lite] Next round of changes (#5847)

* [X-Lite] PXX is now sent every 4ms
* New option PXX_FREQUENCY (HIGH / LOW)
* [X-Lite] It now sends 16 channels per 4ms
This commit is contained in:
Bertrand Songis
2018-04-27 08:45:00 +02:00
committed by GitHub
parent 7979401675
commit a0c1beb61f
6 changed files with 72 additions and 17 deletions
Regular → Executable
+1 -1
View File
@@ -168,7 +168,7 @@ void setupPulses(uint8_t port)
switch (required_protocol) {
case PROTO_PXX:
setupPulsesPXX(port);
scheduleNextMixerCalculation(port, 9);
scheduleNextMixerCalculation(port, MODULES_TIMER_PXX_PERIOD);
break;
case PROTO_SBUS:
setupPulsesSbus(port);
+16
View File
@@ -44,6 +44,16 @@ template<class T> struct PpmPulsesData {
T * ptr;
};
#if defined(PXX_FREQUENCY_HIGH)
#define EXTMODULE_USART_PXX_BAUDRATE 420000
#define INTMODULE_USART_PXX_BAUDRATE 450000
#define MODULES_TIMER_PXX_PERIOD 4 // 4ms
#else
#define EXTMODULE_USART_PXX_BAUDRATE 115200
#define INTMODULE_USART_PXX_BAUDRATE 115200
#define MODULES_TIMER_PXX_PERIOD 9 // 9ms
#endif
#if defined(PPM_PIN_SERIAL)
PACK(struct PxxSerialPulsesData {
uint8_t pulses[64];
@@ -75,11 +85,17 @@ PACK(struct PxxUartPulsesData {
#define MULTIMODULE_BAUDRATE 100000
#if defined(INTMODULE_PULSES) || defined(EXTMODULE_PULSES)
/* PXX uses 20 bytes (as of Rev 1.1 document) with 8 changes per byte + stop bit ~= 162 max pulses */
/* DSM2 uses 2 header + 12 channel bytes, with max 10 changes (8n2) per byte + 16 bits trailer ~= 156 max pulses */
/* Multimodule uses 3 bytes header + 22 channel bytes with max 11 changes per byte (8e2) + 16 bits trailer ~= 291 max pulses */
/* Multimodule reuses some of the DSM2 function and structs since the protocols are similar enough */
/* sbus is 1 byte header, 22 channel bytes (11bit * 16ch) + 1 byte flags */
#if defined(PXX_FREQUENCY_HIGH)
#error "Pulses array needs to be increased (PXX_FREQUENCY=HIGH)"
#endif
PACK(struct PxxTimerPulsesData {
pulse_duration_t pulses[200];
pulse_duration_t * ptr;
+45 -10
View File
@@ -85,6 +85,10 @@ void uartPutPcmByte(uint8_t port, uint8_t byte)
void uartInitPcmArray(uint8_t port)
{
modulePulsesData[port].pxx_uart.ptr = modulePulsesData[port].pxx_uart.pulses;
}
void uartInitPcmCrc(uint8_t port)
{
modulePulsesData[port].pxx_uart.pcmCrc = 0;
}
@@ -159,7 +163,6 @@ void pxxPutPcmBit(uint8_t port, uint8_t bit)
pxxPutPcmPart(port, 0);
modulePulsesData[port].pxx.pcmOnesCount = 0;
}
}
void pxxPutPcmByte(uint8_t port, uint8_t byte)
@@ -179,10 +182,15 @@ void pxxInitPcmArray(uint8_t port)
#else
modulePulsesData[port].pxx.rest = 18000;
#endif
modulePulsesData[port].pxx.pcmCrc = 0;
modulePulsesData[port].pxx.pcmOnesCount = 0;
}
void pxxInitPcmCrc(uint8_t port)
{
modulePulsesData[port].pxx.pcmCrc = 0;
}
void pxxPutPcmHead(uint8_t port)
{
// send 7E, do not CRC
@@ -213,6 +221,14 @@ inline void initPcmArray(uint8_t port)
pxxInitPcmArray(port);
}
inline void initPcmCrc(uint8_t port)
{
if (IS_UART_MODULE(port))
uartInitPcmCrc(port);
else
pxxInitPcmCrc(port);
}
inline void putPcmHead(uint8_t port)
{
if (IS_UART_MODULE(port))
@@ -248,6 +264,11 @@ inline void initPcmArray(uint8_t port)
pxxInitPcmArray(port);
}
inline void initPcmCrc(uint8_t port)
{
pxxInitPcmCrc(port);
}
inline void putPcmHead(uint8_t port)
{
pxxPutPcmHead(port);
@@ -269,11 +290,11 @@ inline void putPcmTail(uint8_t port)
}
#endif
void setupPulsesPXX(uint8_t port)
inline void setupFramePXX(uint8_t port, uint8_t sendUpperChannels)
{
uint16_t pulseValue=0, pulseValueLow=0;
initPcmArray(port);
initPcmCrc(port);
/* Sync */
putPcmHead(port);
@@ -304,12 +325,7 @@ void setupPulsesPXX(uint8_t port)
/* FLAG2 */
putPcmByte(port, 0);
/* PPM */
static uint8_t pass[NUM_MODULES] = { MODULES_INIT(0) };
int sendUpperChannels = 0;
if (pass[port]++ & 0x01) {
sendUpperChannels = g_model.moduleData[port].channelsCount;
}
/* CHANNELS */
for (int i=0; i<8; i++) {
if (flag1 & PXX_SEND_FAILSAFE) {
if (g_model.moduleData[port].failsafeMode == FAILSAFE_HOLD) {
@@ -405,3 +421,22 @@ void setupPulsesPXX(uint8_t port)
putPcmTail(port);
}
void setupPulsesPXX(uint8_t port)
{
initPcmArray(port);
#if defined(PXX_FREQUENCY_HIGH)
setupFramePXX(port, 0);
if (NUM_CHANNELS(port) > 8) {
setupFramePXX(port, 8);
}
#else
static uint8_t pass[NUM_MODULES] = { MODULES_INIT(0) };
uint8_t sendUpperChannels = 0;
if (pass[port]++ & 0x01) {
sendUpperChannels = g_model.moduleData[port].channelsCount;
}
setupFramePXX(port, sendUpperChannels);
#endif
}
+3 -3
View File
@@ -86,7 +86,7 @@ void intmodulePxxStart()
// UART config
USART_DeInit(INTMODULE_USART);
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_BaudRate = INTMODULE_USART_PXX_BAUDRATE;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
@@ -98,8 +98,8 @@ void intmodulePxxStart()
// Timer
INTMODULE_TIMER->CR1 &= ~TIM_CR1_CEN;
INTMODULE_TIMER->PSC = INTMODULE_TIMER_FREQ / 2000000 - 1; // 0.5uS (2Mhz)
INTMODULE_TIMER->ARR = 18000; // 9mS
INTMODULE_TIMER->CCR2 = 15000; // Update time
INTMODULE_TIMER->ARR = 2000 * MODULES_TIMER_PXX_PERIOD;
INTMODULE_TIMER->CCR2 = (2000 * MODULES_TIMER_PXX_PERIOD) - 2000; // Update time
INTMODULE_TIMER->CCER = TIM_CCER_CC3E;
INTMODULE_TIMER->CCMR2 = 0;
INTMODULE_TIMER->EGR = 1; // Restart
+4
View File
@@ -76,6 +76,7 @@ elseif(PCB STREQUAL X7)
set(LCD_DRIVER lcd_driver_spi.cpp)
set(GVAR_SCREEN model_gvars.cpp)
elseif(PCB STREQUAL XLITE)
option(PXX_FREQUENCY "PXX Frequency (LOW / HIGH)" HIGH)
set(PWR_BUTTON "PRESS" CACHE STRING "Pwr button type (PRESS/SWITCH)")
set(CPU_TYPE STM32F2)
set(CPU_TYPE_FULL STM32F205xE) # for size report
@@ -94,6 +95,9 @@ elseif(PCB STREQUAL XLITE)
endif()
if(PCB STREQUAL XLITE)
if(PXX_FREQUENCY STREQUAL HIGH)
add_definitions(-DPXX_FREQUENCY_HIGH)
endif()
set(TARGET_SRC
${TARGET_SRC}
../common/arm/stm32/intmodule_serial_driver.cpp
@@ -138,7 +138,7 @@ void extmodulePxxStart()
// UART config
USART_DeInit(EXTMODULE_USART);
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_BaudRate = EXTMODULE_USART_PXX_BAUDRATE;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
@@ -150,8 +150,8 @@ void extmodulePxxStart()
// Timer
EXTMODULE_TIMER->CR1 &= ~TIM_CR1_CEN;
EXTMODULE_TIMER->PSC = EXTMODULE_TIMER_FREQ / 2000000 - 1; // 0.5uS from 30MHz
EXTMODULE_TIMER->ARR = 18000; // 9mS
EXTMODULE_TIMER->CCR2 = 16000; // Update time
EXTMODULE_TIMER->ARR = 2000 * MODULES_TIMER_PXX_PERIOD;
EXTMODULE_TIMER->CCR2 = (2000 * MODULES_TIMER_PXX_PERIOD) - 2000; // Update time
EXTMODULE_TIMER->EGR = 1; // Restart
EXTMODULE_TIMER->SR &= ~TIM_SR_CC2IF;
EXTMODULE_TIMER->DIER |= TIM_DIER_CC2IE; // Enable this interrupt