diff --git a/src/cli.c b/src/cli.c index 7ff8ace243..f7e394f8af 100644 --- a/src/cli.c +++ b/src/cli.c @@ -153,6 +153,7 @@ const clivalue_t valueTable[] = { { "failsafe_throttle", VAR_UINT16, &cfg.failsafe_throttle, 1000, 2000 }, { "failsafe_detect_threshold", VAR_UINT16, &cfg.failsafe_detect_threshold, 100, 2000 }, { "yaw_direction", VAR_INT8, &cfg.yaw_direction, -1, 1 }, + { "tri_unarmed_servo", VAR_INT8, &cfg.tri_unarmed_servo, 0, 1 }, { "tri_yaw_middle", VAR_UINT16, &cfg.tri_yaw_middle, 0, 2000 }, { "tri_yaw_min", VAR_UINT16, &cfg.tri_yaw_min, 0, 2000 }, { "tri_yaw_max", VAR_UINT16, &cfg.tri_yaw_max, 0, 2000 }, diff --git a/src/config.c b/src/config.c index 27cd927fcb..2bdb138145 100755 --- a/src/config.c +++ b/src/config.c @@ -13,7 +13,7 @@ master_t mcfg; // master config struct with data independent from profiles config_t cfg; // profile config struct const char rcChannelLetters[] = "AERT1234"; -static const uint8_t EEPROM_CONF_VERSION = 49; +static const uint8_t EEPROM_CONF_VERSION = 50; static uint32_t enabledSensors = 0; static void resetConf(void); @@ -274,6 +274,7 @@ static void resetConf(void) // servos cfg.yaw_direction = 1; + cfg.tri_unarmed_servo = 1; cfg.tri_yaw_middle = 1500; cfg.tri_yaw_min = 1020; cfg.tri_yaw_max = 2000; diff --git a/src/drv_pwm.c b/src/drv_pwm.c index 9c6438a5a2..4da89cf961 100755 --- a/src/drv_pwm.c +++ b/src/drv_pwm.c @@ -151,23 +151,23 @@ static void pwmOCConfig(TIM_TypeDef *tim, uint8_t channel, uint16_t value) TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set; - switch (channel) { - case TIM_Channel_1: - TIM_OC1Init(tim, &TIM_OCInitStructure); - TIM_OC1PreloadConfig(tim, TIM_OCPreload_Enable); - break; - case TIM_Channel_2: - TIM_OC2Init(tim, &TIM_OCInitStructure); - TIM_OC2PreloadConfig(tim, TIM_OCPreload_Enable); - break; - case TIM_Channel_3: - TIM_OC3Init(tim, &TIM_OCInitStructure); - TIM_OC3PreloadConfig(tim, TIM_OCPreload_Enable); - break; - case TIM_Channel_4: - TIM_OC4Init(tim, &TIM_OCInitStructure); - TIM_OC4PreloadConfig(tim, TIM_OCPreload_Enable); - break; + switch (channel) { + case TIM_Channel_1: + TIM_OC1Init(tim, &TIM_OCInitStructure); + TIM_OC1PreloadConfig(tim, TIM_OCPreload_Enable); + break; + case TIM_Channel_2: + TIM_OC2Init(tim, &TIM_OCInitStructure); + TIM_OC2PreloadConfig(tim, TIM_OCPreload_Enable); + break; + case TIM_Channel_3: + TIM_OC3Init(tim, &TIM_OCInitStructure); + TIM_OC3PreloadConfig(tim, TIM_OCPreload_Enable); + break; + case TIM_Channel_4: + TIM_OC4Init(tim, &TIM_OCInitStructure); + TIM_OC4PreloadConfig(tim, TIM_OCPreload_Enable); + break; } } diff --git a/src/mixer.c b/src/mixer.c index fc4be84d7b..b453d2096e 100755 --- a/src/mixer.c +++ b/src/mixer.c @@ -206,7 +206,16 @@ void writeServos(void) break; case MULTITYPE_TRI: - pwmWriteServo(0, servo[5]); + if (cfg.tri_unarmed_servo) { + // if unarmed flag set, we always move servo + pwmWriteServo(0, servo[5]); + } else { + // otherwise, only move servo when copter is armed + if (f.ARMED) + pwmWriteServo(0, servo[5]); + else + pwmWriteServo(0, 0); // kill servo signal completely. + } break; case MULTITYPE_AIRPLANE: diff --git a/src/mw.h b/src/mw.h index e97560c4a8..2632960eef 100755 --- a/src/mw.h +++ b/src/mw.h @@ -189,6 +189,7 @@ typedef struct config_t { // mixer-related configuration int8_t yaw_direction; + uint8_t tri_unarmed_servo; // send tail servo correction pulses even when unarmed uint16_t tri_yaw_middle; // tail servo center pos. - use this for initial trim uint16_t tri_yaw_min; // tail servo min uint16_t tri_yaw_max; // tail servo max