mirror of
https://github.com/betaflight/betaflight.git
synced 2025-07-13 19:40:31 +03:00
S-term (for wings) (#13679)
* S-term for wings * tabs Co-authored-by: Petr Ledvina <ledvinap@gmail.com> * pidData[axis].S --------- Co-authored-by: Petr Ledvina <ledvinap@gmail.com>
This commit is contained in:
parent
00ca8232d5
commit
e2e1a68ba0
8 changed files with 51 additions and 10 deletions
|
@ -1497,6 +1497,13 @@ static bool blackboxWriteSysinfo(void)
|
||||||
BLACKBOX_PRINT_HEADER_LINE(PARAM_NAME_ACC_LIMIT, "%d", currentPidProfile->rateAccelLimit);
|
BLACKBOX_PRINT_HEADER_LINE(PARAM_NAME_ACC_LIMIT, "%d", currentPidProfile->rateAccelLimit);
|
||||||
BLACKBOX_PRINT_HEADER_LINE(PARAM_NAME_PIDSUM_LIMIT, "%d", currentPidProfile->pidSumLimit);
|
BLACKBOX_PRINT_HEADER_LINE(PARAM_NAME_PIDSUM_LIMIT, "%d", currentPidProfile->pidSumLimit);
|
||||||
BLACKBOX_PRINT_HEADER_LINE(PARAM_NAME_PIDSUM_LIMIT_YAW, "%d", currentPidProfile->pidSumLimitYaw);
|
BLACKBOX_PRINT_HEADER_LINE(PARAM_NAME_PIDSUM_LIMIT_YAW, "%d", currentPidProfile->pidSumLimitYaw);
|
||||||
|
|
||||||
|
#ifdef USE_WING
|
||||||
|
BLACKBOX_PRINT_HEADER_LINE(PARAM_NAME_S_ROLL, "%d", currentPidProfile->pid[PID_ROLL].S);
|
||||||
|
BLACKBOX_PRINT_HEADER_LINE(PARAM_NAME_S_PITCH, "%d", currentPidProfile->pid[PID_PITCH].S);
|
||||||
|
BLACKBOX_PRINT_HEADER_LINE(PARAM_NAME_S_YAW, "%d", currentPidProfile->pid[PID_YAW].S);
|
||||||
|
#endif // #ifdef USE_WING
|
||||||
|
|
||||||
// End of Betaflight controller parameters
|
// End of Betaflight controller parameters
|
||||||
|
|
||||||
BLACKBOX_PRINT_HEADER_LINE(PARAM_NAME_DEADBAND, "%d", rcControlsConfig()->deadband);
|
BLACKBOX_PRINT_HEADER_LINE(PARAM_NAME_DEADBAND, "%d", rcControlsConfig()->deadband);
|
||||||
|
|
|
@ -118,4 +118,5 @@ const char * const debugModeNames[DEBUG_COUNT] = {
|
||||||
"MAG_TASK_RATE",
|
"MAG_TASK_RATE",
|
||||||
"EZLANDING",
|
"EZLANDING",
|
||||||
"TPA",
|
"TPA",
|
||||||
|
"S_TERM",
|
||||||
};
|
};
|
||||||
|
|
|
@ -120,6 +120,7 @@ typedef enum {
|
||||||
DEBUG_MAG_TASK_RATE,
|
DEBUG_MAG_TASK_RATE,
|
||||||
DEBUG_EZLANDING,
|
DEBUG_EZLANDING,
|
||||||
DEBUG_TPA,
|
DEBUG_TPA,
|
||||||
|
DEBUG_S_TERM,
|
||||||
DEBUG_COUNT
|
DEBUG_COUNT
|
||||||
} debugType_e;
|
} debugType_e;
|
||||||
|
|
||||||
|
|
|
@ -1163,6 +1163,12 @@ const clivalue_t valueTable[] = {
|
||||||
{ "d_yaw", VAR_UINT8 | PROFILE_VALUE, .config.minmaxUnsigned = { 0, PID_GAIN_MAX }, PG_PID_PROFILE, offsetof(pidProfile_t, pid[PID_YAW].D) },
|
{ "d_yaw", VAR_UINT8 | PROFILE_VALUE, .config.minmaxUnsigned = { 0, PID_GAIN_MAX }, PG_PID_PROFILE, offsetof(pidProfile_t, pid[PID_YAW].D) },
|
||||||
{ "f_yaw", VAR_UINT16 | PROFILE_VALUE, .config.minmaxUnsigned = { 0, F_GAIN_MAX }, PG_PID_PROFILE, offsetof(pidProfile_t, pid[PID_YAW].F) },
|
{ "f_yaw", VAR_UINT16 | PROFILE_VALUE, .config.minmaxUnsigned = { 0, F_GAIN_MAX }, PG_PID_PROFILE, offsetof(pidProfile_t, pid[PID_YAW].F) },
|
||||||
|
|
||||||
|
#ifdef USE_WING
|
||||||
|
{ PARAM_NAME_S_PITCH, VAR_UINT8 | PROFILE_VALUE, .config.minmaxUnsigned = { 0, PID_GAIN_MAX }, PG_PID_PROFILE, offsetof(pidProfile_t, pid[PID_PITCH].S) },
|
||||||
|
{ PARAM_NAME_S_ROLL, VAR_UINT8 | PROFILE_VALUE, .config.minmaxUnsigned = { 0, PID_GAIN_MAX }, PG_PID_PROFILE, offsetof(pidProfile_t, pid[PID_ROLL].S) },
|
||||||
|
{ PARAM_NAME_S_YAW, VAR_UINT8 | PROFILE_VALUE, .config.minmaxUnsigned = { 0, PID_GAIN_MAX }, PG_PID_PROFILE, offsetof(pidProfile_t, pid[PID_YAW].S) },
|
||||||
|
#endif // #ifdef USE_WING
|
||||||
|
|
||||||
{ PARAM_NAME_ANGLE_P_GAIN, VAR_UINT8 | PROFILE_VALUE, .config.minmaxUnsigned = { 0, 200 }, PG_PID_PROFILE, offsetof(pidProfile_t, pid[PID_LEVEL].P) },
|
{ PARAM_NAME_ANGLE_P_GAIN, VAR_UINT8 | PROFILE_VALUE, .config.minmaxUnsigned = { 0, 200 }, PG_PID_PROFILE, offsetof(pidProfile_t, pid[PID_LEVEL].P) },
|
||||||
{ PARAM_NAME_ANGLE_FEEDFORWARD, VAR_UINT8 | PROFILE_VALUE, .config.minmaxUnsigned = { 0, 200 }, PG_PID_PROFILE, offsetof(pidProfile_t, pid[PID_LEVEL].F) },
|
{ PARAM_NAME_ANGLE_FEEDFORWARD, VAR_UINT8 | PROFILE_VALUE, .config.minmaxUnsigned = { 0, 200 }, PG_PID_PROFILE, offsetof(pidProfile_t, pid[PID_LEVEL].F) },
|
||||||
{ PARAM_NAME_ANGLE_FF_SMOOTHING_MS, VAR_UINT8 | PROFILE_VALUE, .config.minmaxUnsigned = { 10, 250 }, PG_PID_PROFILE, offsetof(pidProfile_t, angle_feedforward_smoothing_ms) },
|
{ PARAM_NAME_ANGLE_FF_SMOOTHING_MS, VAR_UINT8 | PROFILE_VALUE, .config.minmaxUnsigned = { 10, 250 }, PG_PID_PROFILE, offsetof(pidProfile_t, angle_feedforward_smoothing_ms) },
|
||||||
|
|
|
@ -136,6 +136,9 @@
|
||||||
#define PARAM_NAME_ANGLE_FEEDFORWARD "angle_feedforward"
|
#define PARAM_NAME_ANGLE_FEEDFORWARD "angle_feedforward"
|
||||||
#define PARAM_NAME_ANGLE_FF_SMOOTHING_MS "angle_feedforward_smoothing_ms"
|
#define PARAM_NAME_ANGLE_FF_SMOOTHING_MS "angle_feedforward_smoothing_ms"
|
||||||
#define PARAM_NAME_ANGLE_LIMIT "angle_limit"
|
#define PARAM_NAME_ANGLE_LIMIT "angle_limit"
|
||||||
|
#define PARAM_NAME_S_PITCH "s_pitch"
|
||||||
|
#define PARAM_NAME_S_ROLL "s_roll"
|
||||||
|
#define PARAM_NAME_S_YAW "s_yaw"
|
||||||
#define PARAM_NAME_ANGLE_P_GAIN "angle_p_gain"
|
#define PARAM_NAME_ANGLE_P_GAIN "angle_p_gain"
|
||||||
#define PARAM_NAME_ANGLE_EARTH_REF "angle_earth_ref"
|
#define PARAM_NAME_ANGLE_EARTH_REF "angle_earth_ref"
|
||||||
|
|
||||||
|
|
|
@ -125,8 +125,8 @@ void resetPidProfile(pidProfile_t *pidProfile)
|
||||||
[PID_ROLL] = PID_ROLL_DEFAULT,
|
[PID_ROLL] = PID_ROLL_DEFAULT,
|
||||||
[PID_PITCH] = PID_PITCH_DEFAULT,
|
[PID_PITCH] = PID_PITCH_DEFAULT,
|
||||||
[PID_YAW] = PID_YAW_DEFAULT,
|
[PID_YAW] = PID_YAW_DEFAULT,
|
||||||
[PID_LEVEL] = { 50, 75, 75, 50 },
|
[PID_LEVEL] = { 50, 75, 75, 50, 0 },
|
||||||
[PID_MAG] = { 40, 0, 0, 0 },
|
[PID_MAG] = { 40, 0, 0, 0, 0 },
|
||||||
},
|
},
|
||||||
.pidSumLimit = PIDSUM_LIMIT,
|
.pidSumLimit = PIDSUM_LIMIT,
|
||||||
.pidSumLimitYaw = PIDSUM_LIMIT_YAW,
|
.pidSumLimitYaw = PIDSUM_LIMIT_YAW,
|
||||||
|
@ -796,6 +796,22 @@ static FAST_CODE_NOINLINE float applyLaunchControl(int axis, const rollAndPitchT
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static float getSterm(int axis, const pidProfile_t *pidProfile)
|
||||||
|
{
|
||||||
|
#ifdef USE_WING
|
||||||
|
const float sTerm = getSetpointRate(axis) / getMaxRcRate(axis) * 1000.0f *
|
||||||
|
(float)pidProfile->pid[axis].S / 100.0f;
|
||||||
|
|
||||||
|
DEBUG_SET(DEBUG_S_TERM, axis, lrintf(sTerm));
|
||||||
|
|
||||||
|
return sTerm;
|
||||||
|
#else
|
||||||
|
UNUSED(axis);
|
||||||
|
UNUSED(pidProfile);
|
||||||
|
return 0.0f;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
// Betaflight pid controller, which will be maintained in the future with additional features specialised for current (mini) multirotor usage.
|
// Betaflight pid controller, which will be maintained in the future with additional features specialised for current (mini) multirotor usage.
|
||||||
// Based on 2DOF reference design (matlab)
|
// Based on 2DOF reference design (matlab)
|
||||||
void FAST_CODE pidController(const pidProfile_t *pidProfile, timeUs_t currentTimeUs)
|
void FAST_CODE pidController(const pidProfile_t *pidProfile, timeUs_t currentTimeUs)
|
||||||
|
@ -1098,6 +1114,7 @@ void FAST_CODE pidController(const pidProfile_t *pidProfile, timeUs_t currentTim
|
||||||
pidData[axis].P = 0;
|
pidData[axis].P = 0;
|
||||||
pidData[axis].D = 0;
|
pidData[axis].D = 0;
|
||||||
pidData[axis].F = 0;
|
pidData[axis].F = 0;
|
||||||
|
pidData[axis].S = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif // USE_YAW_SPIN_RECOVERY
|
#endif // USE_YAW_SPIN_RECOVERY
|
||||||
|
@ -1133,8 +1150,10 @@ void FAST_CODE pidController(const pidProfile_t *pidProfile, timeUs_t currentTim
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pidData[axis].S = getSterm(axis, pidProfile);
|
||||||
|
|
||||||
// calculating the PID sum
|
// calculating the PID sum
|
||||||
const float pidSum = pidData[axis].P + pidData[axis].I + pidData[axis].D + pidData[axis].F;
|
const float pidSum = pidData[axis].P + pidData[axis].I + pidData[axis].D + pidData[axis].F + pidData[axis].S;
|
||||||
#ifdef USE_INTEGRATED_YAW_CONTROL
|
#ifdef USE_INTEGRATED_YAW_CONTROL
|
||||||
if (axis == FD_YAW && pidRuntime.useIntegratedYaw) {
|
if (axis == FD_YAW && pidRuntime.useIntegratedYaw) {
|
||||||
pidData[axis].Sum += pidSum * pidRuntime.dT * 100.0f;
|
pidData[axis].Sum += pidSum * pidRuntime.dT * 100.0f;
|
||||||
|
@ -1154,6 +1173,7 @@ void FAST_CODE pidController(const pidProfile_t *pidProfile, timeUs_t currentTim
|
||||||
pidData[axis].I = 0;
|
pidData[axis].I = 0;
|
||||||
pidData[axis].D = 0;
|
pidData[axis].D = 0;
|
||||||
pidData[axis].F = 0;
|
pidData[axis].F = 0;
|
||||||
|
pidData[axis].S = 0;
|
||||||
|
|
||||||
pidData[axis].Sum = 0;
|
pidData[axis].Sum = 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -59,9 +59,9 @@
|
||||||
#define ITERM_ACCELERATOR_GAIN_OFF 0
|
#define ITERM_ACCELERATOR_GAIN_OFF 0
|
||||||
#define ITERM_ACCELERATOR_GAIN_MAX 250
|
#define ITERM_ACCELERATOR_GAIN_MAX 250
|
||||||
|
|
||||||
#define PID_ROLL_DEFAULT { 45, 80, 40, 120 }
|
#define PID_ROLL_DEFAULT { 45, 80, 40, 120, 0 }
|
||||||
#define PID_PITCH_DEFAULT { 47, 84, 46, 125 }
|
#define PID_PITCH_DEFAULT { 47, 84, 46, 125, 0 }
|
||||||
#define PID_YAW_DEFAULT { 45, 80, 0, 120 }
|
#define PID_YAW_DEFAULT { 45, 80, 0, 120, 0 }
|
||||||
#define D_MIN_DEFAULT { 30, 34, 0 }
|
#define D_MIN_DEFAULT { 30, 34, 0 }
|
||||||
|
|
||||||
#define DTERM_LPF1_DYN_MIN_HZ_DEFAULT 75
|
#define DTERM_LPF1_DYN_MIN_HZ_DEFAULT 75
|
||||||
|
@ -107,6 +107,7 @@ typedef struct pidf_s {
|
||||||
uint8_t I;
|
uint8_t I;
|
||||||
uint8_t D;
|
uint8_t D;
|
||||||
uint16_t F;
|
uint16_t F;
|
||||||
|
uint8_t S;
|
||||||
} pidf_t;
|
} pidf_t;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
@ -267,6 +268,7 @@ typedef struct pidAxisData_s {
|
||||||
float I;
|
float I;
|
||||||
float D;
|
float D;
|
||||||
float F;
|
float F;
|
||||||
|
float S;
|
||||||
|
|
||||||
float Sum;
|
float Sum;
|
||||||
} pidAxisData_t;
|
} pidAxisData_t;
|
||||||
|
|
|
@ -114,10 +114,10 @@ void setDefaultTestSettings(void)
|
||||||
{
|
{
|
||||||
pgResetAll();
|
pgResetAll();
|
||||||
pidProfile = pidProfilesMutable(1);
|
pidProfile = pidProfilesMutable(1);
|
||||||
pidProfile->pid[PID_ROLL] = { 40, 40, 30, 65 };
|
pidProfile->pid[PID_ROLL] = { 40, 40, 30, 65, 0 };
|
||||||
pidProfile->pid[PID_PITCH] = { 58, 50, 35, 60 };
|
pidProfile->pid[PID_PITCH] = { 58, 50, 35, 60, 0 };
|
||||||
pidProfile->pid[PID_YAW] = { 70, 45, 20, 60 };
|
pidProfile->pid[PID_YAW] = { 70, 45, 20, 60, 0 };
|
||||||
pidProfile->pid[PID_LEVEL] = { 50, 50, 75, 50 };
|
pidProfile->pid[PID_LEVEL] = { 50, 50, 75, 50, 0 };
|
||||||
|
|
||||||
// Compensate for the upscaling done without 'use_integrated_yaw'
|
// Compensate for the upscaling done without 'use_integrated_yaw'
|
||||||
pidProfile->pid[PID_YAW].I = pidProfile->pid[PID_YAW].I / 2.5f;
|
pidProfile->pid[PID_YAW].I = pidProfile->pid[PID_YAW].I / 2.5f;
|
||||||
|
@ -183,6 +183,7 @@ void resetTest(void)
|
||||||
pidData[axis].I = 0;
|
pidData[axis].I = 0;
|
||||||
pidData[axis].D = 0;
|
pidData[axis].D = 0;
|
||||||
pidData[axis].F = 0;
|
pidData[axis].F = 0;
|
||||||
|
pidData[axis].S = 0;
|
||||||
pidData[axis].Sum = 0;
|
pidData[axis].Sum = 0;
|
||||||
simulatedSetpointRate[axis] = 0;
|
simulatedSetpointRate[axis] = 0;
|
||||||
simulatedRcDeflection[axis] = 0;
|
simulatedRcDeflection[axis] = 0;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue