From 0ac2b51c60228b1b6016d578c6637d37c726f776 Mon Sep 17 00:00:00 2001 From: Dominic Clifton Date: Wed, 30 Jul 2014 21:58:20 +0100 Subject: [PATCH] Make ppm/pwm input filtering configurable. --- docs/Rx.md | 14 ++++++++++++++ src/main/config/config.c | 3 +++ src/main/config/config_master.h | 1 + src/main/drivers/pwm_rx.c | 20 ++++++++++++++++---- src/main/drivers/pwm_rx.h | 7 +++++++ src/main/flight/altitudehold.c | 1 + src/main/io/serial_cli.c | 2 ++ src/main/io/serial_msp.c | 1 + src/main/main.c | 3 +++ src/main/mw.c | 1 + 10 files changed, 49 insertions(+), 4 deletions(-) diff --git a/docs/Rx.md b/docs/Rx.md index 8e5bf19ef7..eb9d11857a 100644 --- a/docs/Rx.md +++ b/docs/Rx.md @@ -26,4 +26,18 @@ Allows you to use MSP commands as the RC input. Only 8 channel support to maint 12 channels via serial supported currently. +### Configuration + +See the Configuration document some some RX configuration examples. + +#### PPM/PWM input filtering. + +Hardware input filtering can be enabled if you are experiencing interference on the signal sent via your PWM/PPM RX. + +Use the `input_filtering_mode` cli command to select a mode. + +| Value | Meaning | +| ----- | --------- | +| 0 | Disabled | +| 1 | Enabled | diff --git a/src/main/config/config.c b/src/main/config/config.c index 8270f2c442..98bde5cde5 100755 --- a/src/main/config/config.c +++ b/src/main/config/config.c @@ -27,6 +27,7 @@ #include "drivers/accgyro.h" #include "drivers/system.h" +#include "drivers/pwm_rx.h" #include "sensors/sensors.h" #include "sensors/gyro.h" @@ -244,6 +245,8 @@ static void resetConf(void) masterConfig.rxConfig.maxcheck = 1900; masterConfig.rxConfig.rssi_channel = 0; + masterConfig.inputFilteringMode = INPUT_FILTERING_DISABLED; + masterConfig.retarded_arm = 0; // disable arm/disarm on roll left/right masterConfig.airplaneConfig.flaps_speed = 0; masterConfig.fixedwing_althold_dir = 1; diff --git a/src/main/config/config_master.h b/src/main/config/config_master.h index c4095cfa51..7386053807 100644 --- a/src/main/config/config_master.h +++ b/src/main/config/config_master.h @@ -57,6 +57,7 @@ typedef struct master_t { batteryConfig_t batteryConfig; rxConfig_t rxConfig; + inputFilteringMode_e inputFilteringMode; // Use hardware input filtering, e.g. for OrangeRX PPM/PWM receivers. uint8_t retarded_arm; // allow disarsm/arm on throttle down + roll left/right diff --git a/src/main/drivers/pwm_rx.c b/src/main/drivers/pwm_rx.c index 5d10c6555c..af3e00f9cf 100644 --- a/src/main/drivers/pwm_rx.c +++ b/src/main/drivers/pwm_rx.c @@ -38,7 +38,11 @@ #define PWM_PORTS_OR_PPM_CAPTURE_COUNT PWM_INPUT_PORT_COUNT #endif -void pwmICConfig(TIM_TypeDef *tim, uint8_t channel, uint16_t polarity); // from pwm_output.c +#define INPUT_FILTER_TO_HELP_WITH_NOISE_FROM_OPENLRS_TELEMETRY_RX 0x03 + +static inputFilteringMode_e inputFilteringMode; + +void pwmICConfig(TIM_TypeDef *tim, uint8_t channel, uint16_t polarity); typedef enum { INPUT_MODE_PPM, @@ -105,6 +109,11 @@ void resetPPMDataReceivedState(void) #define MIN_CHANNELS_BEFORE_PPM_FRAME_CONSIDERED_VALID 4 +void pwmRxInit(inputFilteringMode_e initialInputFilteringMode) +{ + inputFilteringMode = initialInputFilteringMode; +} + static void ppmInit(void) { ppmDev.pulseIndex = 0; @@ -232,8 +241,6 @@ static void pwmGPIOConfig(GPIO_TypeDef *gpio, uint32_t pin, GPIO_Mode mode) gpioInit(gpio, &cfg); } -#define INPUT_FILTER_TO_HELP_WITH_NOISE_FROM_OPENLRS_TELEMETRY_RX 0x03 - void pwmICConfig(TIM_TypeDef *tim, uint8_t channel, uint16_t polarity) { TIM_ICInitTypeDef TIM_ICInitStructure; @@ -243,7 +250,12 @@ void pwmICConfig(TIM_TypeDef *tim, uint8_t channel, uint16_t polarity) TIM_ICInitStructure.TIM_ICPolarity = polarity; TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; - TIM_ICInitStructure.TIM_ICFilter = INPUT_FILTER_TO_HELP_WITH_NOISE_FROM_OPENLRS_TELEMETRY_RX; + + if (inputFilteringMode == INPUT_FILTERING_ENABLED) { + TIM_ICInitStructure.TIM_ICFilter = INPUT_FILTER_TO_HELP_WITH_NOISE_FROM_OPENLRS_TELEMETRY_RX; + } else { + TIM_ICInitStructure.TIM_ICFilter = 0x00; + } TIM_ICInit(tim, &TIM_ICInitStructure); } diff --git a/src/main/drivers/pwm_rx.h b/src/main/drivers/pwm_rx.h index 6aa68368f3..e73241045f 100644 --- a/src/main/drivers/pwm_rx.h +++ b/src/main/drivers/pwm_rx.h @@ -17,6 +17,11 @@ #pragma once +typedef enum { + INPUT_FILTERING_DISABLED = 0, + INPUT_FILTERING_ENABLED +} inputFilteringMode_e; + void ppmInConfig(uint8_t timerIndex); void pwmInConfig(uint8_t timerIndex, uint8_t channel); @@ -24,3 +29,5 @@ uint16_t pwmRead(uint8_t channel); bool isPPMDataBeingReceived(void); void resetPPMDataReceivedState(void); + +void pwmRxInit(inputFilteringMode_e initialInputFilteringMode); diff --git a/src/main/flight/altitudehold.c b/src/main/flight/altitudehold.c index 2eb1ccb7d8..5c9acfb32b 100644 --- a/src/main/flight/altitudehold.c +++ b/src/main/flight/altitudehold.c @@ -26,6 +26,7 @@ #include "drivers/accgyro.h" #include "drivers/serial.h" +#include "drivers/pwm_rx.h" // FIXME remove dependency on currentProfile and masterConfig globals and clean up include file list. diff --git a/src/main/io/serial_cli.c b/src/main/io/serial_cli.c index 3a5505eb63..49c1b7e878 100644 --- a/src/main/io/serial_cli.c +++ b/src/main/io/serial_cli.c @@ -32,6 +32,7 @@ #include "drivers/accgyro.h" #include "drivers/serial.h" #include "drivers/bus_i2c.h" +#include "drivers/pwm_rx.h" #include "flight/flight.h" #include "flight/mixer.h" #include "flight/failsafe.h" @@ -167,6 +168,7 @@ const clivalue_t valueTable[] = { { "min_check", VAR_UINT16, &masterConfig.rxConfig.mincheck, PWM_RANGE_ZERO, PWM_RANGE_MAX }, { "max_check", VAR_UINT16, &masterConfig.rxConfig.maxcheck, PWM_RANGE_ZERO, PWM_RANGE_MAX }, { "rssi_channel", VAR_INT8, &masterConfig.rxConfig.rssi_channel, 0, MAX_SUPPORTED_RC_CHANNEL_COUNT }, + { "input_filtering_mode", VAR_INT8, &masterConfig.inputFilteringMode, 0, 1 }, { "min_throttle", VAR_UINT16, &masterConfig.escAndServoConfig.minthrottle, PWM_RANGE_ZERO, PWM_RANGE_MAX }, { "max_throttle", VAR_UINT16, &masterConfig.escAndServoConfig.maxthrottle, PWM_RANGE_ZERO, PWM_RANGE_MAX }, diff --git a/src/main/io/serial_msp.c b/src/main/io/serial_msp.c index 27c7a1eafc..4cc8c3eb39 100755 --- a/src/main/io/serial_msp.c +++ b/src/main/io/serial_msp.c @@ -31,6 +31,7 @@ #include "drivers/accgyro.h" #include "drivers/serial.h" #include "drivers/bus_i2c.h" +#include "drivers/pwm_rx.h" #include "flight/flight.h" #include "flight/mixer.h" diff --git a/src/main/main.c b/src/main/main.c index 7d5c9a2c94..e141f31b46 100755 --- a/src/main/main.c +++ b/src/main/main.c @@ -35,6 +35,7 @@ #include "drivers/serial_uart.h" #include "drivers/accgyro.h" #include "drivers/pwm_mapping.h" +#include "drivers/pwm_rx.h" #include "drivers/adc.h" #include "flight/flight.h" @@ -204,6 +205,8 @@ void init(void) pwm_params.idlePulse = 0; // brushed motors pwm_params.servoCenterPulse = masterConfig.rxConfig.midrc; + pwmRxInit(masterConfig.inputFilteringMode); + pwmOutputConfiguration_t *pwmOutputConfiguration = pwmInit(&pwm_params); mixerUsePWMOutputConfiguration(pwmOutputConfiguration); diff --git a/src/main/mw.c b/src/main/mw.c index b0955363c5..9b12bd74fd 100755 --- a/src/main/mw.c +++ b/src/main/mw.c @@ -32,6 +32,7 @@ #include "drivers/gpio.h" #include "drivers/system.h" #include "drivers/serial.h" +#include "drivers/pwm_rx.h" #include "flight/flight.h" #include "sensors/sensors.h"