From 9a7de3cf3c691b8cfe0d2723d9cfbaf823f2df89 Mon Sep 17 00:00:00 2001 From: Dominic Clifton Date: Sat, 14 Feb 2015 23:49:55 +0000 Subject: [PATCH] Improve ESC compatibility by enabling PWM output as soon as possible. A user reported a problem where if the board was powered up before connecting the main battery the ESCs would work, however when the board and ESCs were powered at the same time the ESCs would not initialise correctly. --- src/main/main.c | 72 ++++++++++++++++++++++++------------------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/src/main/main.c b/src/main/main.c index d99a40fdc8..cbf0e50be8 100644 --- a/src/main/main.c +++ b/src/main/main.c @@ -178,6 +178,42 @@ void init(void) timerInit(); // timer must be initialized before any channel is allocated + memset(&pwm_params, 0, sizeof(pwm_params)); + // when using airplane/wing mixer, servo/motor outputs are remapped + if (masterConfig.mixerMode == MIXER_AIRPLANE || masterConfig.mixerMode == MIXER_FLYING_WING) + pwm_params.airplane = true; + else + pwm_params.airplane = false; +#if defined(USE_USART2) && defined(STM32F10X) + pwm_params.useUART2 = doesConfigurationUsePort(SERIAL_PORT_USART2); +#endif + pwm_params.useVbat = feature(FEATURE_VBAT); + pwm_params.useSoftSerial = feature(FEATURE_SOFTSERIAL); + pwm_params.useParallelPWM = feature(FEATURE_RX_PARALLEL_PWM); + pwm_params.useRSSIADC = feature(FEATURE_RSSI_ADC); + pwm_params.useCurrentMeterADC = feature(FEATURE_CURRENT_METER) + && masterConfig.batteryConfig.currentMeterType == CURRENT_SENSOR_ADC; + pwm_params.useLEDStrip = feature(FEATURE_LED_STRIP); + pwm_params.usePPM = feature(FEATURE_RX_PPM); + pwm_params.useOneshot = feature(FEATURE_ONESHOT125); + pwm_params.useSerialRx = feature(FEATURE_RX_SERIAL); + pwm_params.useServos = isMixerUsingServos(); + pwm_params.extraServos = currentProfile->gimbalConfig.gimbal_flags & GIMBAL_FORWARDAUX; + pwm_params.motorPwmRate = masterConfig.motor_pwm_rate; + pwm_params.servoPwmRate = masterConfig.servo_pwm_rate; + pwm_params.idlePulse = PULSE_1MS; // standard PWM for brushless ESC (default, overridden below) + if (feature(FEATURE_3D)) + pwm_params.idlePulse = masterConfig.flight3DConfig.neutral3d; + if (pwm_params.motorPwmRate > 500) + pwm_params.idlePulse = 0; // brushed motors + pwm_params.servoCenterPulse = masterConfig.escAndServoConfig.servoCenterPulse; + + pwmRxInit(masterConfig.inputFilteringMode); + + pwmOutputConfiguration_t *pwmOutputConfiguration = pwmInit(&pwm_params); + + mixerUsePWMOutputConfiguration(pwmOutputConfiguration); + #ifdef BEEPER beeperConfig_t beeperConfig = { .gpioPin = BEEP_PIN, @@ -289,42 +325,6 @@ void init(void) serialInit(&masterConfig.serialConfig); - memset(&pwm_params, 0, sizeof(pwm_params)); - // when using airplane/wing mixer, servo/motor outputs are remapped - if (masterConfig.mixerMode == MIXER_AIRPLANE || masterConfig.mixerMode == MIXER_FLYING_WING) - pwm_params.airplane = true; - else - pwm_params.airplane = false; -#if defined(USE_USART2) && defined(STM32F10X) - pwm_params.useUART2 = doesConfigurationUsePort(SERIAL_PORT_USART2); -#endif - pwm_params.useVbat = feature(FEATURE_VBAT); - pwm_params.useSoftSerial = feature(FEATURE_SOFTSERIAL); - pwm_params.useParallelPWM = feature(FEATURE_RX_PARALLEL_PWM); - pwm_params.useRSSIADC = feature(FEATURE_RSSI_ADC); - pwm_params.useCurrentMeterADC = feature(FEATURE_CURRENT_METER) - && masterConfig.batteryConfig.currentMeterType == CURRENT_SENSOR_ADC; - pwm_params.useLEDStrip = feature(FEATURE_LED_STRIP); - pwm_params.usePPM = feature(FEATURE_RX_PPM); - pwm_params.useOneshot = feature(FEATURE_ONESHOT125); - pwm_params.useSerialRx = feature(FEATURE_RX_SERIAL); - pwm_params.useServos = isMixerUsingServos(); - pwm_params.extraServos = currentProfile->gimbalConfig.gimbal_flags & GIMBAL_FORWARDAUX; - pwm_params.motorPwmRate = masterConfig.motor_pwm_rate; - pwm_params.servoPwmRate = masterConfig.servo_pwm_rate; - pwm_params.idlePulse = PULSE_1MS; // standard PWM for brushless ESC (default, overridden below) - if (feature(FEATURE_3D)) - pwm_params.idlePulse = masterConfig.flight3DConfig.neutral3d; - if (pwm_params.motorPwmRate > 500) - pwm_params.idlePulse = 0; // brushed motors - pwm_params.servoCenterPulse = masterConfig.escAndServoConfig.servoCenterPulse; - - pwmRxInit(masterConfig.inputFilteringMode); - - pwmOutputConfiguration_t *pwmOutputConfiguration = pwmInit(&pwm_params); - - mixerUsePWMOutputConfiguration(pwmOutputConfiguration); - failsafe = failsafeInit(&masterConfig.rxConfig); beepcodeInit(failsafe); rxInit(&masterConfig.rxConfig, failsafe);