1
0
Fork 0
mirror of https://github.com/betaflight/betaflight.git synced 2025-07-26 01:35:41 +03:00

use different max for dterm and gyro based on each sample rate

This commit is contained in:
Thorsten Laux 2019-02-21 13:52:45 +01:00
parent f90e9e51f9
commit 836985cf47

View file

@ -45,7 +45,8 @@ static pt1Filter_t rpmFilters[MAX_SUPPORTED_MOTORS];
typedef struct rpmNotchFilter_s typedef struct rpmNotchFilter_s
{ {
uint8_t harmonics; uint8_t harmonics;
uint8_t minHz; float minHz;
float maxHz;
float q; float q;
float loopTime; float loopTime;
@ -61,7 +62,6 @@ static float pidLooptime;
static rpmNotchFilter_t filters[2]; static rpmNotchFilter_t filters[2];
static rpmNotchFilter_t* gyroFilter; static rpmNotchFilter_t* gyroFilter;
static rpmNotchFilter_t* dtermFilter; static rpmNotchFilter_t* dtermFilter;
static float maxFrequency;
PG_REGISTER_WITH_RESET_FN(rpmFilterConfig_t, rpmFilterConfig, PG_RPM_FILTER_CONFIG, 3); PG_REGISTER_WITH_RESET_FN(rpmFilterConfig_t, rpmFilterConfig, PG_RPM_FILTER_CONFIG, 3);
@ -108,11 +108,15 @@ void rpmFilterInit(const rpmFilterConfig_t *config)
gyroFilter = &filters[numberRpmNotchFilters++]; gyroFilter = &filters[numberRpmNotchFilters++];
rpmNotchFilterInit(gyroFilter, config->gyro_rpm_notch_harmonics, rpmNotchFilterInit(gyroFilter, config->gyro_rpm_notch_harmonics,
config->gyro_rpm_notch_min, config->gyro_rpm_notch_q, gyro.targetLooptime); config->gyro_rpm_notch_min, config->gyro_rpm_notch_q, gyro.targetLooptime);
// don't go quite to nyquist to avoid oscillations
gyroFilter->maxHz = 0.48f / (gyro.targetLooptime * 1e-6f);
} }
if (config->dterm_rpm_notch_harmonics) { if (config->dterm_rpm_notch_harmonics) {
dtermFilter = &filters[numberRpmNotchFilters++]; dtermFilter = &filters[numberRpmNotchFilters++];
rpmNotchFilterInit(dtermFilter, config->dterm_rpm_notch_harmonics, rpmNotchFilterInit(dtermFilter, config->dterm_rpm_notch_harmonics,
config->dterm_rpm_notch_min, config->dterm_rpm_notch_q, pidLooptime); config->dterm_rpm_notch_min, config->dterm_rpm_notch_q, pidLooptime);
// don't go quite to nyquist to avoid oscillations
dtermFilter->maxHz = 0.48f / (pidLooptime * 1e-6f);
} }
for (int i = 0; i < getMotorCount(); i++) { for (int i = 0; i < getMotorCount(); i++) {
@ -125,8 +129,6 @@ void rpmFilterInit(const rpmFilterConfig_t *config)
numberFilters = getMotorCount() * (filters[0].harmonics + filters[1].harmonics); numberFilters = getMotorCount() * (filters[0].harmonics + filters[1].harmonics);
const float filtersPerLoopIteration = numberFilters / loopIterationsPerUpdate; const float filtersPerLoopIteration = numberFilters / loopIterationsPerUpdate;
filterUpdatesPerIteration = rintf(filtersPerLoopIteration + 0.49f); filterUpdatesPerIteration = rintf(filtersPerLoopIteration + 0.49f);
// don't go quite to nyquist to avoid oscillations
maxFrequency = 0.48f / (gyro.targetLooptime * 1e-6f);
} }
static float applyFilter(rpmNotchFilter_t* filter, int axis, float value) static float applyFilter(rpmNotchFilter_t* filter, int axis, float value)
@ -174,7 +176,8 @@ void rpmFilterUpdate()
for (int i = 0; i < filterUpdatesPerIteration; i++) { for (int i = 0; i < filterUpdatesPerIteration; i++) {
float frequency = constrainf((harmonic + 1) * motorFrequency[motor], currentFilter->minHz, maxFrequency); float frequency = constrainf(
(harmonic + 1) * motorFrequency[motor], currentFilter->minHz, currentFilter->maxHz);
biquadFilter_t* template = &currentFilter->notch[0][motor][harmonic]; biquadFilter_t* template = &currentFilter->notch[0][motor][harmonic];
// uncomment below to debug filter stepping. Need to also comment out motor rpm DEBUG_SET above // uncomment below to debug filter stepping. Need to also comment out motor rpm DEBUG_SET above
/* DEBUG_SET(DEBUG_RPM_FILTER, 0, harmonic); */ /* DEBUG_SET(DEBUG_RPM_FILTER, 0, harmonic); */