1
0
Fork 0
mirror of https://github.com/betaflight/betaflight.git synced 2025-07-27 02:05:31 +03:00

added adjustable k-factor

This commit is contained in:
skyfpv 2024-07-23 21:02:03 -06:00
parent 19e8bc498f
commit 0aa21dfdc5
6 changed files with 15 additions and 8 deletions

View file

@ -1,2 +1 @@
HOBBYWING_XROTORF7CONV
BetafpvF411RX

1 HOBBYWING_XROTORF7CONV BetafpvF411RX

View file

@ -946,7 +946,9 @@ const clivalue_t valueTable[] = {
{ "rpm_limiter_afterburner_hold_to_use", VAR_INT8 | MASTER_VALUE | MODE_LOOKUP, .config.lookup = { TABLE_OFF_ON }, PG_MIXER_CONFIG, offsetof(mixerConfig_t, govenor_rpm_afterburner_hold_to_use) },
{ "rpm_limiter_afterburner_tank_count", VAR_UINT8 | MASTER_VALUE, .config.minmaxUnsigned = { 0, 255 }, PG_MIXER_CONFIG, offsetof(mixerConfig_t, govenor_rpm_afterburner_tank_count) },
{ "rpm_limiter_afterburner_reset", VAR_INT8 | MASTER_VALUE | MODE_LOOKUP, .config.lookup = { TABLE_OFF_ON }, PG_MIXER_CONFIG, offsetof(mixerConfig_t, govenor_rpm_afterburner_reset) },
{ "rpm_limiter_acceleration_limit", VAR_UINT16 | MASTER_VALUE, .config.minmaxUnsigned = { 0, 1000 }, PG_MIXER_CONFIG, offsetof(mixerConfig_t, govenor_acceleration_limit) },
{ "rpm_limiter_acceleration_limit", VAR_UINT16 | MASTER_VALUE, .config.minmaxUnsigned = { 0, 10000 }, PG_MIXER_CONFIG, offsetof(mixerConfig_t, govenor_acceleration_limit) },
{ "rpm_limiter_deceleration_limit", VAR_UINT16 | MASTER_VALUE, .config.minmaxUnsigned = { 0, 10000 }, PG_MIXER_CONFIG, offsetof(mixerConfig_t, govenor_deceleration_limit) },
{ "rpm_limiter_k_factor", VAR_UINT16 | MASTER_VALUE, .config.minmaxUnsigned = { 1, 3000 }, PG_MIXER_CONFIG, offsetof(mixerConfig_t, govenor_k_factor) },
//Street League customization
{ "rpm_limiter_idle_rpm", VAR_UINT16 | MASTER_VALUE, .config.minmaxUnsigned = { 0, 999 }, PG_MIXER_CONFIG, offsetof(mixerConfig_t, govenor_idle_rpm) },
{ "rpm_limiter_full_linearization", VAR_INT8 | MASTER_VALUE | MODE_LOOKUP, .config.lookup = { TABLE_OFF_ON }, PG_MIXER_CONFIG, offsetof(mixerConfig_t, govenor_rpm_linearization) },

View file

@ -527,10 +527,11 @@ static void applyRPMLimiter(void)
mixerRuntime.govenorPreviousSmoothedRPMError = smoothedRPMError;
mixerRuntime.govenorPreviousRPMLimit = RPM_GOVENOR_LIMIT;
DEBUG_SET(DEBUG_RPM_LIMITER, 0, averageRPM);
DEBUG_SET(DEBUG_RPM_LIMITER, 1, smoothedRPMError);
DEBUG_SET(DEBUG_RPM_LIMITER, 2, mixerRuntime.govenorI*100.0f);
DEBUG_SET(DEBUG_RPM_LIMITER, 3, govenorD*10000.0f);
DEBUG_SET(DEBUG_RPM_LIMITER, 0, averageRPM);//unfiltered average rpm
DEBUG_SET(DEBUG_RPM_LIMITER, 1, averageRPM_smoothed); //filtered average rpm
DEBUG_SET(DEBUG_RPM_LIMITER, 2, smoothedRPMError); //P term
DEBUG_SET(DEBUG_RPM_LIMITER, 3, mixerRuntime.govenorI*100.0f); // I term
DEBUG_SET(DEBUG_RPM_LIMITER, 4, govenorD*10000.0f); // D term
/*DEBUG_SET(DEBUG_RPM_LIMITER, 0, mixerRuntime.afterburnerInitiated);
DEBUG_SET(DEBUG_RPM_LIMITER, 1, mixerRuntime.afterburnerTankPercent);

View file

@ -101,6 +101,7 @@ typedef struct mixerConfig_s {
uint8_t govenor_rpm_afterburner_tank_count;
uint16_t govenor_acceleration_limit;
uint16_t govenor_deceleration_limit;
uint16_t govenor_k_factor;
bool govenor_rpm_linearization;
uint16_t govenorThrottleLimitLearningTimeMS;
uint16_t govenor_idle_rpm;

View file

@ -59,6 +59,7 @@ PG_RESET_TEMPLATE(mixerConfig_t, mixerConfig,
.govenor_idle_rpm = 17,
.govenor_acceleration_limit = 60,
.govenor_deceleration_limit = 60,
.govenor_k_factor = 800,
.govenor_rpm_limit = 130.0f,
.govenor_rpm_afterburner = 16,
.govenor_rpm_afterburner_duration = 5,
@ -332,6 +333,7 @@ mixerRuntime.govenorIGain = 15.0f * 0.0001f * pidGetDT();
mixerRuntime.govenorDGain = 10.0f * 0.00000003f * pidGetPidFrequency();
mixerRuntime.govenorAccelerationLimit = 60.0f * 1000.0f * pidGetDT();
mixerRuntime.govenorDecelerationLimit = 60.0f * 1000.0f * pidGetDT();
mixerRuntime.govenorKFactor = 800;
mixerRuntime.afterburnerRPM = 16;
mixerRuntime.afterburnerReset = false;
mixerRuntime.afterburnerDuration = 5;
@ -348,6 +350,7 @@ mixerRuntime.govenorIGain = mixerConfig()->govenor_i * 0.0001f * pidGetDT();
mixerRuntime.govenorDGain = mixerConfig()->govenor_d * 0.00000003f * pidGetPidFrequency();
mixerRuntime.govenorAccelerationLimit = mixerConfig()->govenor_acceleration_limit * 1000.0f * pidGetDT();
mixerRuntime.govenorDecelerationLimit = mixerConfig()->govenor_deceleration_limit * 1000.0f * pidGetDT();
mixerRuntime.govenorKFactor = mixerConfig()->govenor_k_factor;
mixerRuntime.afterburnerRPM = mixerConfig()->govenor_rpm_afterburner;
mixerRuntime.afterburnerReset = mixerConfig()->govenor_rpm_afterburner_reset;
mixerRuntime.afterburnerDuration = mixerConfig()->govenor_rpm_afterburner_duration;
@ -368,7 +371,7 @@ mixerRuntime.afterburnerInitiated = false;
// mixerRuntime.govenorAverageStickThrottle = 0;
mixerRuntime.govenorPreviousSmoothedRPMError = 0;
// mixerRuntime.govenorIterationStep = 1.0f/(pidGetPidFrequency() * mixerConfig()->govenor_learning_threshold_window); // 3 is the averaging
mixerRuntime.govenorDelayK = 800 * pidGetDT() / 20.0f;
mixerRuntime.govenorDelayK = mixerRuntime.govenorKFactor * pidGetDT() / 20.0f;
mixerRuntime.govenorLearningThrottleK = 0.5 / (pidGetPidFrequency() * mixerConfig()->govenorThrottleLimitLearningTimeMS / 1000); // 0.5 = value ^ (4000 * time) 0.99^(4000*(20/1000))
mixerRuntime.govenor_init = false;

View file

@ -56,6 +56,7 @@ typedef struct mixerRuntime_s {
float govenorExpectedThrottleLimit;
float govenorAccelerationLimit;
float govenorDecelerationLimit;
float govenorKFactor;
float prevAverageRPM;
float govenorPreviousSmoothedRPMError;
float minRPMDelayK;