mirror of
https://github.com/betaflight/betaflight.git
synced 2025-07-18 22:05:17 +03:00
Increase PID performance by removing Dterm for Yaw
This commit is contained in:
parent
feea25edcc
commit
cbc7bc2a61
1 changed files with 44 additions and 38 deletions
|
@ -225,31 +225,34 @@ static void pidLuxFloat(pidProfile_t *pidProfile, controlRateConfig_t *controlRa
|
||||||
ITerm = errorGyroIf[axis];
|
ITerm = errorGyroIf[axis];
|
||||||
|
|
||||||
//-----calculate D-term
|
//-----calculate D-term
|
||||||
if (pidProfile->deltaMethod == DELTA_FROM_ERROR) {
|
if (axis == YAW) {
|
||||||
delta = RateError - lastErrorForDelta[axis];
|
if (pidProfile->yaw_lpf_hz) PTerm = filterApplyPt1(PTerm, &yawFilterState, pidProfile->yaw_lpf_hz, getdT());
|
||||||
lastErrorForDelta[axis] = RateError;
|
DTerm = 0;
|
||||||
} else {
|
} else {
|
||||||
delta = -(gyroRate - lastErrorForDelta[axis]); // 16 bits is ok here, the dif between 2 consecutive gyro reads is limited to 800
|
if (pidProfile->deltaMethod == DELTA_FROM_ERROR) {
|
||||||
lastErrorForDelta[axis] = gyroRate;
|
delta = RateError - lastErrorForDelta[axis];
|
||||||
|
lastErrorForDelta[axis] = RateError;
|
||||||
|
} else {
|
||||||
|
delta = -(gyroRate - lastErrorForDelta[axis]); // 16 bits is ok here, the dif between 2 consecutive gyro reads is limited to 800
|
||||||
|
lastErrorForDelta[axis] = gyroRate;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Correct difference by cycle time. Cycle time is jittery (can be different 2 times), so calculated difference
|
||||||
|
// would be scaled by different dt each time. Division by dT fixes that.
|
||||||
|
delta *= (1.0f / getdT());
|
||||||
|
|
||||||
|
// Filter delta
|
||||||
|
if (pidProfile->dterm_lpf_hz) delta = filterApplyPt1(delta, &deltaFilterState[axis], pidProfile->dterm_lpf_hz, getdT());
|
||||||
|
|
||||||
|
// Apply moving average
|
||||||
|
if (pidProfile->dterm_average_count) delta = filterApplyAveragef(delta, pidProfile->dterm_average_count, deltaState[axis]);
|
||||||
|
|
||||||
|
DTerm = constrainf(delta * (float)pidProfile->D8[axis] * 0.001f * tpaFactor, -300.0f, 300.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Correct difference by cycle time. Cycle time is jittery (can be different 2 times), so calculated difference
|
|
||||||
// would be scaled by different dt each time. Division by dT fixes that.
|
|
||||||
delta *= (1.0f / getdT());
|
|
||||||
|
|
||||||
// Filter delta
|
|
||||||
if (pidProfile->dterm_lpf_hz) delta = filterApplyPt1(delta, &deltaFilterState[axis], pidProfile->dterm_lpf_hz, getdT());
|
|
||||||
|
|
||||||
// Apply moving average
|
|
||||||
if (pidProfile->dterm_average_count) delta = filterApplyAveragef(delta, pidProfile->dterm_average_count, deltaState[axis]);
|
|
||||||
|
|
||||||
DTerm = constrainf(delta * (float)pidProfile->D8[axis] * 0.001f * tpaFactor, -300.0f, 300.0f);
|
|
||||||
|
|
||||||
// -----calculate total PID output
|
// -----calculate total PID output
|
||||||
axisPID[axis] = constrain(lrintf(PTerm + ITerm + DTerm), -1000, 1000);
|
axisPID[axis] = constrain(lrintf(PTerm + ITerm + DTerm), -1000, 1000);
|
||||||
|
|
||||||
if (pidProfile->yaw_lpf_hz && axis == YAW) axisPID[axis] = filterApplyPt1(axisPID[axis], &yawFilterState, pidProfile->yaw_lpf_hz, getdT());
|
|
||||||
|
|
||||||
if (lowThrottlePidReduction) axisPID[axis] /= 3;
|
if (lowThrottlePidReduction) axisPID[axis] /= 3;
|
||||||
|
|
||||||
#ifdef GTUNE
|
#ifdef GTUNE
|
||||||
|
@ -511,31 +514,34 @@ static void pidMultiWiiRewrite(pidProfile_t *pidProfile, controlRateConfig_t *co
|
||||||
ITerm = errorGyroI[axis] >> 13;
|
ITerm = errorGyroI[axis] >> 13;
|
||||||
|
|
||||||
//-----calculate D-term
|
//-----calculate D-term
|
||||||
if (pidProfile->deltaMethod == DELTA_FROM_ERROR) {
|
if (axis == YAW) {
|
||||||
delta = RateError - lastErrorForDelta[axis]; // 16 bits is ok here, the dif between 2 consecutive gyro reads is limited to 800
|
if (pidProfile->yaw_lpf_hz) PTerm = filterApplyPt1(PTerm, &yawFilterState, pidProfile->yaw_lpf_hz, getdT());
|
||||||
lastErrorForDelta[axis] = RateError;
|
DTerm = 0;
|
||||||
} else {
|
} else {
|
||||||
delta = -(gyroRate - lastErrorForDelta[axis]); // 16 bits is ok here, the dif between 2 consecutive gyro reads is limited to 800
|
if (pidProfile->deltaMethod == DELTA_FROM_ERROR) {
|
||||||
lastErrorForDelta[axis] = gyroRate;
|
delta = RateError - lastErrorForDelta[axis]; // 16 bits is ok here, the dif between 2 consecutive gyro reads is limited to 800
|
||||||
|
lastErrorForDelta[axis] = RateError;
|
||||||
|
} else {
|
||||||
|
delta = -(gyroRate - lastErrorForDelta[axis]); // 16 bits is ok here, the dif between 2 consecutive gyro reads is limited to 800
|
||||||
|
lastErrorForDelta[axis] = gyroRate;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Correct difference by cycle time. Cycle time is jittery (can be different 2 times), so calculated difference
|
||||||
|
// would be scaled by different dt each time. Division by dT fixes that.
|
||||||
|
delta = (delta * ((uint16_t) 0xFFFF / ((uint16_t)targetPidLooptime >> 4))) >> 6;
|
||||||
|
|
||||||
|
// Filter delta
|
||||||
|
if (pidProfile->dterm_lpf_hz) delta = filterApplyPt1((float)delta, &deltaFilterState[axis], pidProfile->dterm_lpf_hz, getdT());
|
||||||
|
|
||||||
|
// Apply moving average
|
||||||
|
if (pidProfile->dterm_average_count) delta = filterApplyAverage(delta, pidProfile->dterm_average_count, deltaState[axis]) * 2;
|
||||||
|
|
||||||
|
DTerm = (delta * pidProfile->D8[axis] * PIDweight[axis] / 100) >> 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Correct difference by cycle time. Cycle time is jittery (can be different 2 times), so calculated difference
|
|
||||||
// would be scaled by different dt each time. Division by dT fixes that.
|
|
||||||
delta = (delta * ((uint16_t) 0xFFFF / ((uint16_t)targetPidLooptime >> 4))) >> 6;
|
|
||||||
|
|
||||||
// Filter delta
|
|
||||||
if (pidProfile->dterm_lpf_hz) delta = filterApplyPt1((float)delta, &deltaFilterState[axis], pidProfile->dterm_lpf_hz, getdT());
|
|
||||||
|
|
||||||
// Apply moving average
|
|
||||||
if (pidProfile->dterm_average_count) delta = filterApplyAverage(delta, pidProfile->dterm_average_count, deltaState[axis]) * 2;
|
|
||||||
|
|
||||||
DTerm = (delta * pidProfile->D8[axis] * PIDweight[axis] / 100) >> 8;
|
|
||||||
|
|
||||||
// -----calculate total PID output
|
// -----calculate total PID output
|
||||||
axisPID[axis] = PTerm + ITerm + DTerm;
|
axisPID[axis] = PTerm + ITerm + DTerm;
|
||||||
|
|
||||||
if (pidProfile->yaw_lpf_hz && axis == YAW) axisPID[axis] = filterApplyPt1(axisPID[axis], &yawFilterState, pidProfile->yaw_lpf_hz, getdT());
|
|
||||||
|
|
||||||
if (lowThrottlePidReduction) axisPID[axis] /= 3;
|
if (lowThrottlePidReduction) axisPID[axis] /= 3;
|
||||||
|
|
||||||
#ifdef GTUNE
|
#ifdef GTUNE
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue