1
0
Fork 0
mirror of https://github.com/iNavFlight/inav.git synced 2025-07-23 16:25:26 +03:00

Merge pull request #4475 from iNavFlight/dzikuvx-dterm-fir-configurable

Make Dterm FIR filter configurable
This commit is contained in:
Konstantin Sharlaimov 2019-03-09 21:23:44 +01:00 committed by GitHub
commit 973eb94df5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 21 additions and 4 deletions

View file

@ -956,6 +956,9 @@ groups:
- name: dterm_lpf_hz - name: dterm_lpf_hz
min: 0 min: 0
max: 200 max: 200
- name: use_dterm_fir_filter
field: use_dterm_fir_filter
type: bool
- name: yaw_lpf_hz - name: yaw_lpf_hz
min: 0 min: 0
max: 200 max: 200

View file

@ -183,6 +183,7 @@ PG_RESET_TEMPLATE(pidProfile_t, pidProfile,
.dterm_lpf_hz = 40, .dterm_lpf_hz = 40,
.yaw_lpf_hz = 30, .yaw_lpf_hz = 30,
.dterm_setpoint_weight = 1.0f, .dterm_setpoint_weight = 1.0f,
.use_dterm_fir_filter = 1,
.itermWindupPointPercent = 50, // Percent .itermWindupPointPercent = 50, // Percent
@ -211,8 +212,10 @@ void pidInit(void)
// by Pavel Holoborodko, see http://www.holoborodko.com/pavel/numerical-methods/numerical-derivative/smooth-low-noise-differentiators/ // by Pavel Holoborodko, see http://www.holoborodko.com/pavel/numerical-methods/numerical-derivative/smooth-low-noise-differentiators/
// h[0] = 5/8, h[-1] = 1/4, h[-2] = -1, h[-3] = -1/4, h[-4] = 3/8 // h[0] = 5/8, h[-1] = 1/4, h[-2] = -1, h[-3] = -1/4, h[-4] = 3/8
static const float dtermCoeffs[PID_GYRO_RATE_BUF_LENGTH] = {5.0f/8, 2.0f/8, -8.0f/8, -2.0f/8, 3.0f/8}; static const float dtermCoeffs[PID_GYRO_RATE_BUF_LENGTH] = {5.0f/8, 2.0f/8, -8.0f/8, -2.0f/8, 3.0f/8};
for (int axis = 0; axis < 3; ++ axis) { if (pidProfile()->use_dterm_fir_filter) {
firFilterInit(&pidState[axis].gyroRateFilter, pidState[axis].gyroRateBuf, PID_GYRO_RATE_BUF_LENGTH, dtermCoeffs); for (int axis = 0; axis < 3; ++ axis) {
firFilterInit(&pidState[axis].gyroRateFilter, pidState[axis].gyroRateBuf, PID_GYRO_RATE_BUF_LENGTH, dtermCoeffs);
}
} }
pidResetTPAFilter(); pidResetTPAFilter();
@ -566,9 +569,19 @@ static void pidApplyMulticopterRateController(pidState_t *pidState, flight_dynam
deltaFiltered = biquadFilterApply(&pidState->deltaLpfState, deltaFiltered); deltaFiltered = biquadFilterApply(&pidState->deltaLpfState, deltaFiltered);
} }
/*
* Apply "Classical" INAV noise robust differentiator if configured to do so
* This filter is not configurable in any way, it only can be enabled or disabled
*/
if (pidProfile()->use_dterm_fir_filter) {
firFilterUpdate(&pidState->gyroRateFilter, deltaFiltered);
newDTerm = firFilterApply(&pidState->gyroRateFilter);
} else {
newDTerm = deltaFiltered;
}
// Calculate derivative // Calculate derivative
firFilterUpdate(&pidState->gyroRateFilter, deltaFiltered); newDTerm = newDTerm * (pidState->kD / dT);
newDTerm = firFilterApply(&pidState->gyroRateFilter) * (pidState->kD / dT);
// Additionally constrain D // Additionally constrain D
newDTerm = constrainf(newDTerm, -300.0f, 300.0f); newDTerm = constrainf(newDTerm, -300.0f, 300.0f);

View file

@ -83,6 +83,7 @@ typedef struct pidProfile_s {
uint16_t dterm_soft_notch_hz; // Dterm Notch frequency uint16_t dterm_soft_notch_hz; // Dterm Notch frequency
uint16_t dterm_soft_notch_cutoff; // Dterm Notch Cutoff frequency uint16_t dterm_soft_notch_cutoff; // Dterm Notch Cutoff frequency
uint8_t dterm_lpf_hz; // (default 17Hz, Range 1-50Hz) Used for PT1 element in PID1, PID2 and PID5 uint8_t dterm_lpf_hz; // (default 17Hz, Range 1-50Hz) Used for PT1 element in PID1, PID2 and PID5
uint8_t use_dterm_fir_filter; // Use classical INAV FIR differentiator. Very noise robust, can be quite slowish
uint8_t yaw_pterm_lpf_hz; // Used for filering Pterm noise on noisy frames uint8_t yaw_pterm_lpf_hz; // Used for filering Pterm noise on noisy frames
uint8_t yaw_lpf_hz; uint8_t yaw_lpf_hz;