diff --git a/src/main/drivers/pwm_mapping.c b/src/main/drivers/pwm_mapping.c index 3cec1ab3e..1ddd6f878 100755 --- a/src/main/drivers/pwm_mapping.c +++ b/src/main/drivers/pwm_mapping.c @@ -293,8 +293,8 @@ pwmOutputConfiguration_t *pwmInit(drv_pwm_config_t *init) if (type == MAP_TO_PPM_INPUT) { #ifndef SKIP_RX_PWM_PPM #if defined(SPARKY) || defined(ALIENFLIGHTF3) - if (init->useFastPwm || init->pwmProtocolType == PWM_TYPE_BRUSHED) { - ppmAvoidPWMTimerClash(timerHardwarePtr, TIM2); + if (!(init->pwmProtocolType == PWM_TYPE_CONVENTIONAL)) { + ppmAvoidPWMTimerClash(timerHardwarePtr, TIM2, init->pwmProtocolType); } #endif ppmInConfig(timerHardwarePtr); @@ -307,7 +307,7 @@ pwmOutputConfiguration_t *pwmInit(drv_pwm_config_t *init) } else if (type == MAP_TO_MOTOR_OUTPUT) { #ifdef CC3D - if (init->useFastPwm || init->pwmProtocolType == PWM_TYPE_BRUSHED) { + if (!(init->pwmProtocolType == PWM_TYPE_CONVENTIONAL)) { // Skip it if it would cause PPM capture timer to be reconfigured or manually overflowed if (timerHardwarePtr->tim == TIM2) continue; diff --git a/src/main/drivers/pwm_output.c b/src/main/drivers/pwm_output.c index 44504f680..4cc9edede 100644 --- a/src/main/drivers/pwm_output.c +++ b/src/main/drivers/pwm_output.c @@ -26,18 +26,6 @@ #include "pwm_mapping.h" #include "pwm_output.h" -#if defined(STM32F40_41xxx) // must be multiples of timer clock -#define ONESHOT125_TIMER_MHZ 12 -#define ONESHOT42_TIMER_MHZ 21 -#define MULTISHOT_TIMER_MHZ 84 -#define PWM_BRUSHED_TIMER_MHZ 21 -#else -#define ONESHOT125_TIMER_MHZ 8 -#define ONESHOT42_TIMER_MHZ 24 -#define MULTISHOT_TIMER_MHZ 72 -#define PWM_BRUSHED_TIMER_MHZ 24 -#endif - #define MULTISHOT_5US_PW (MULTISHOT_TIMER_MHZ * 5) #define MULTISHOT_20US_MULT (MULTISHOT_TIMER_MHZ * 20 / 1000.0f) diff --git a/src/main/drivers/pwm_output.h b/src/main/drivers/pwm_output.h index b9bc62c68..b8443ac40 100644 --- a/src/main/drivers/pwm_output.h +++ b/src/main/drivers/pwm_output.h @@ -25,6 +25,18 @@ typedef enum { PWM_TYPE_BRUSHED } motorPwmProtocolTypes_e; +#if defined(STM32F40_41xxx) // must be multiples of timer clock +#define ONESHOT125_TIMER_MHZ 12 +#define ONESHOT42_TIMER_MHZ 21 +#define MULTISHOT_TIMER_MHZ 84 +#define PWM_BRUSHED_TIMER_MHZ 21 +#else +#define ONESHOT125_TIMER_MHZ 8 +#define ONESHOT42_TIMER_MHZ 24 +#define MULTISHOT_TIMER_MHZ 72 +#define PWM_BRUSHED_TIMER_MHZ 24 +#endif + struct timerHardware_s; void pwmBrushedMotorConfig(const struct timerHardware_s *timerHardware, uint8_t motorIndex, uint16_t motorPwmRate); void pwmBrushlessMotorConfig(const struct timerHardware_s *timerHardware, uint8_t motorIndex, uint16_t motorPwmRate, uint16_t idlePulse); diff --git a/src/main/drivers/pwm_rx.c b/src/main/drivers/pwm_rx.c index 42f0a2fed..3c72d104d 100644 --- a/src/main/drivers/pwm_rx.c +++ b/src/main/drivers/pwm_rx.c @@ -33,6 +33,7 @@ #include "gpio.h" #include "timer.h" +#include "pwm_output.h" #include "pwm_mapping.h" #include "pwm_rx.h" @@ -85,7 +86,7 @@ static uint16_t captures[PWM_PORTS_OR_PPM_CAPTURE_COUNT]; static uint8_t ppmFrameCount = 0; static uint8_t lastPPMFrameCount = 0; -static uint8_t ppmCountShift = 0; +static uint8_t ppmCountDivisor = 1; typedef struct ppmDevice_s { uint8_t pulseIndex; @@ -204,14 +205,14 @@ static void ppmEdgeCallback(timerCCHandlerRec_t* cbRec, captureCompare_t capture } } - // Divide by 8 if Oneshot125 is active and this is a CC3D board - currentTime = currentTime >> ppmCountShift; + // Divide value if Oneshot, Multishot or brushed motors are active and the timer is shared + currentTime = currentTime / ppmCountDivisor; /* Capture computation */ if (currentTime > previousTime) { - ppmDev.deltaTime = currentTime - (previousTime + (ppmDev.overflowed ? (PPM_TIMER_PERIOD >> ppmCountShift) : 0)); + ppmDev.deltaTime = currentTime - (previousTime + (ppmDev.overflowed ? (PPM_TIMER_PERIOD / ppmCountDivisor) : 0)); } else { - ppmDev.deltaTime = (PPM_TIMER_PERIOD >> ppmCountShift) + currentTime - previousTime; + ppmDev.deltaTime = (PPM_TIMER_PERIOD / ppmCountDivisor) + currentTime - previousTime; } ppmDev.overflowed = false; @@ -383,11 +384,25 @@ void pwmInConfig(const timerHardware_t *timerHardwarePtr, uint8_t channel) #define UNUSED_PPM_TIMER_REFERENCE 0 #define FIRST_PWM_PORT 0 -void ppmAvoidPWMTimerClash(const timerHardware_t *timerHardwarePtr, TIM_TypeDef *sharedPwmTimer) +void ppmAvoidPWMTimerClash(const timerHardware_t *timerHardwarePtr, TIM_TypeDef *sharedPwmTimer, uint8_t pwmProtocol) { - if (timerHardwarePtr->tim == sharedPwmTimer) { - ppmCountShift = 3; // Divide by 8 if the timer is running at 8 MHz - } + if (timerHardwarePtr->tim == sharedPwmTimer) { + switch (pwmProtocol) + { + case PWM_TYPE_ONESHOT125: + ppmCountDivisor = ONESHOT125_TIMER_MHZ; + break; + case PWM_TYPE_ONESHOT42: + ppmCountDivisor = ONESHOT42_TIMER_MHZ; + break; + case PWM_TYPE_MULTISHOT: + ppmCountDivisor = MULTISHOT_TIMER_MHZ; + break; + case PWM_TYPE_BRUSHED: + ppmCountDivisor = PWM_BRUSHED_TIMER_MHZ; + break; + } + } } void ppmInConfig(const timerHardware_t *timerHardwarePtr) diff --git a/src/main/drivers/pwm_rx.h b/src/main/drivers/pwm_rx.h index 46afd388c..1eb792b7f 100644 --- a/src/main/drivers/pwm_rx.h +++ b/src/main/drivers/pwm_rx.h @@ -26,7 +26,7 @@ typedef enum { void ppmInConfig(const timerHardware_t *timerHardwarePtr); -void ppmAvoidPWMTimerClash(const timerHardware_t *timerHardwarePtr, TIM_TypeDef *sharedPwmTimer); +void ppmAvoidPWMTimerClash(const timerHardware_t *timerHardwarePtr, TIM_TypeDef *sharedPwmTimer, uint8_t pwmProtocol); void pwmInConfig(const timerHardware_t *timerHardwarePtr, uint8_t channel); uint16_t pwmRead(uint8_t channel);