mirror of
https://github.com/iNavFlight/inav.git
synced 2025-07-26 01:35:35 +03:00
Reset the biquad filter used for servos to 1500 on startup
Filter was initialized at zero, which delayed the servo centering by ~2 seconds. The filter is now reset to 1500 during initialization, so the servos receive 1500 from the start. Coupled with #3540, this completely eliminates all servo twitching during boot. Thanks to @shellixyz for testing!
This commit is contained in:
parent
d1862ecec2
commit
1022ada9a7
3 changed files with 9 additions and 0 deletions
|
@ -205,6 +205,13 @@ float biquadFilterApply(biquadFilter_t *filter, float input)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float biquadFilterReset(biquadFilter_t *filter, float value)
|
||||||
|
{
|
||||||
|
filter->d1 = value - (value * filter->b0);
|
||||||
|
filter->d2 = (filter->b2 - filter->a2) * value;
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* FIR filter
|
* FIR filter
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -73,6 +73,7 @@ void biquadFilterInitNotch(biquadFilter_t *filter, uint32_t samplingIntervalUs,
|
||||||
void biquadFilterInitLPF(biquadFilter_t *filter, uint16_t filterFreq, uint32_t samplingIntervalUs);
|
void biquadFilterInitLPF(biquadFilter_t *filter, uint16_t filterFreq, uint32_t samplingIntervalUs);
|
||||||
void biquadFilterInit(biquadFilter_t *filter, uint16_t filterFreq, uint32_t samplingIntervalUs, float Q, biquadFilterType_e filterType);
|
void biquadFilterInit(biquadFilter_t *filter, uint16_t filterFreq, uint32_t samplingIntervalUs, float Q, biquadFilterType_e filterType);
|
||||||
float biquadFilterApply(biquadFilter_t *filter, float sample);
|
float biquadFilterApply(biquadFilter_t *filter, float sample);
|
||||||
|
float biquadFilterReset(biquadFilter_t *filter, float value);
|
||||||
float filterGetNotchQ(uint16_t centerFreq, uint16_t cutoff);
|
float filterGetNotchQ(uint16_t centerFreq, uint16_t cutoff);
|
||||||
|
|
||||||
void firFilterInit(firFilter_t *filter, float *buf, uint8_t bufLength, const float *coeffs);
|
void firFilterInit(firFilter_t *filter, float *buf, uint8_t bufLength, const float *coeffs);
|
||||||
|
|
|
@ -177,6 +177,7 @@ static void filterServos(void)
|
||||||
if (!servoFilterIsSet) {
|
if (!servoFilterIsSet) {
|
||||||
for (int i = 0; i < MAX_SUPPORTED_SERVOS; i++) {
|
for (int i = 0; i < MAX_SUPPORTED_SERVOS; i++) {
|
||||||
biquadFilterInitLPF(&servoFilter[i], servoConfig()->servo_lowpass_freq, gyro.targetLooptime);
|
biquadFilterInitLPF(&servoFilter[i], servoConfig()->servo_lowpass_freq, gyro.targetLooptime);
|
||||||
|
biquadFilterReset(&servoFilter[i], servo[i]);
|
||||||
}
|
}
|
||||||
servoFilterIsSet = true;
|
servoFilterIsSet = true;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue