diff --git a/src/main/config/config.c b/src/main/config/config.c index 9137edfe05..b3bf5a6d92 100755 --- a/src/main/config/config.c +++ b/src/main/config/config.c @@ -332,7 +332,7 @@ void resetRcControlsConfig(rcControlsConfig_t *rcControlsConfig) { void resetMixerConfig(mixerConfig_t *mixerConfig) { mixerConfig->yaw_motor_direction = 1; - mixerConfig->agressive_airmode = 0; + mixerConfig->airmode_saturation_limit = 50; mixerConfig->yaw_jump_prevention_limit = 200; #ifdef USE_SERVOS mixerConfig->tri_unarmed_servo = 1; diff --git a/src/main/flight/mixer.c b/src/main/flight/mixer.c index 9959b7307e..6c64f28f6c 100755 --- a/src/main/flight/mixer.c +++ b/src/main/flight/mixer.c @@ -19,6 +19,7 @@ #include #include #include +#include #include "platform.h" #include "debug.h" @@ -814,12 +815,12 @@ void mixTable(void) if (rollPitchYawMixRange > throttleRange) { motorLimitReached = true; + float mixReduction = (float) throttleRange / rollPitchYawMixRange; for (i = 0; i < motorCount; i++) { - rollPitchYawMix[i] = (rollPitchYawMix[i] * throttleRange) / rollPitchYawMixRange; - - // Get the max correction from center when agressivity enabled. (Some setups don't like this option) - if (mixerConfig->agressive_airmode) throttleMin = throttleMax = throttleMin + (throttleRange / 2); + rollPitchYawMix[i] = lrintf((float) rollPitchYawMix[i] * mixReduction); } + // Get the maximum correction by setting offset to center. Only active below 50% of saturation levels to reduce spazzing out in crashes + if (mixReduction > (mixerConfig->airmode_saturation_limit / 100.0f)) throttleMin = throttleMax = throttleMin + (throttleRange / 2); } else { motorLimitReached = false; throttleMin = throttleMin + (rollPitchYawMixRange / 2); diff --git a/src/main/flight/mixer.h b/src/main/flight/mixer.h index e8c4193703..43165cdef5 100644 --- a/src/main/flight/mixer.h +++ b/src/main/flight/mixer.h @@ -71,8 +71,8 @@ typedef struct mixer_s { typedef struct mixerConfig_s { int8_t yaw_motor_direction; - uint8_t agressive_airmode; - uint16_t yaw_jump_prevention_limit; // make limit configurable (original fixed value was 100) + uint8_t airmode_saturation_limit; // Percentage in airmode where the mixer stops trying to get maximum possible correction + uint16_t yaw_jump_prevention_limit; // make limit configurable (original fixed value was 100) #ifdef USE_SERVOS uint8_t tri_unarmed_servo; // send tail servo correction pulses even when unarmed int16_t servo_lowpass_freq; // lowpass servo filter frequency selection; 1/1000ths of loop freq diff --git a/src/main/io/serial_cli.c b/src/main/io/serial_cli.c index fb1ea102ca..cf901b93bf 100644 --- a/src/main/io/serial_cli.c +++ b/src/main/io/serial_cli.c @@ -623,7 +623,7 @@ const clivalue_t valueTable[] = { { "yaw_control_direction", VAR_INT8 | MASTER_VALUE, &masterConfig.yaw_control_direction, .config.minmax = { -1, 1 } }, { "yaw_motor_direction", VAR_INT8 | MASTER_VALUE, &masterConfig.mixerConfig.yaw_motor_direction, .config.minmax = { -1, 1 } }, - { "agressive_airmode", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, &masterConfig.mixerConfig.agressive_airmode, .config.lookup = { TABLE_OFF_ON } }, + { "airmode_saturation_limit", VAR_UINT8 | MASTER_VALUE, &masterConfig.mixerConfig.airmode_saturation_limit, .config.minmax = { 0, 100 } }, { "yaw_jump_prevention_limit", VAR_UINT16 | MASTER_VALUE, &masterConfig.mixerConfig.yaw_jump_prevention_limit, .config.minmax = { YAW_JUMP_PREVENTION_LIMIT_LOW, YAW_JUMP_PREVENTION_LIMIT_HIGH } }, #ifdef USE_SERVOS { "tri_unarmed_servo", VAR_INT8 | MASTER_VALUE | MODE_LOOKUP, &masterConfig.mixerConfig.tri_unarmed_servo, .config.lookup = { TABLE_OFF_ON } },