make the accZ lpf used for althold configurable
set the variable accz_lpf_cutoff to the desired cutoff frequency this can help to make althold smoother on copters with lots of vibrations Conflicts: src/cli.c src/config.c src/imu.c src/mw.h
This commit is contained in:
parent
c53268b7be
commit
1bf806f54c
|
@ -85,7 +85,7 @@ static uint32_t flashWriteAddress = (0x08000000 + (uint32_t)((FLASH_PAGE_SIZE *
|
||||||
master_t masterConfig; // master config struct with data independent from profiles
|
master_t masterConfig; // master config struct with data independent from profiles
|
||||||
profile_t currentProfile; // profile config struct
|
profile_t currentProfile; // profile config struct
|
||||||
|
|
||||||
static const uint8_t EEPROM_CONF_VERSION = 73;
|
static const uint8_t EEPROM_CONF_VERSION = 74;
|
||||||
|
|
||||||
static void resetAccelerometerTrims(flightDynamicsTrims_t *accelerometerTrims)
|
static void resetAccelerometerTrims(flightDynamicsTrims_t *accelerometerTrims)
|
||||||
{
|
{
|
||||||
|
@ -305,6 +305,7 @@ static void resetConf(void)
|
||||||
|
|
||||||
currentProfile.mag_declination = 0;
|
currentProfile.mag_declination = 0;
|
||||||
currentProfile.acc_lpf_factor = 4;
|
currentProfile.acc_lpf_factor = 4;
|
||||||
|
currentProfile.accz_lpf_cutoff = 5.0f;
|
||||||
currentProfile.accDeadband.xy = 40;
|
currentProfile.accDeadband.xy = 40;
|
||||||
currentProfile.accDeadband.z = 40;
|
currentProfile.accDeadband.z = 40;
|
||||||
|
|
||||||
|
@ -425,6 +426,7 @@ void activateConfig(void)
|
||||||
configureImu(&imuRuntimeConfig, ¤tProfile.pidProfile, ¤tProfile.barometerConfig, ¤tProfile.accDeadband);
|
configureImu(&imuRuntimeConfig, ¤tProfile.pidProfile, ¤tProfile.barometerConfig, ¤tProfile.accDeadband);
|
||||||
|
|
||||||
calculateThrottleAngleScale(currentProfile.throttle_correction_angle);
|
calculateThrottleAngleScale(currentProfile.throttle_correction_angle);
|
||||||
|
calculateAccZLowPassFilterRCTimeConstant(currentProfile.accz_lpf_cutoff);
|
||||||
|
|
||||||
#ifdef BARO
|
#ifdef BARO
|
||||||
useBarometerConfig(¤tProfile.barometerConfig);
|
useBarometerConfig(¤tProfile.barometerConfig);
|
||||||
|
|
|
@ -34,6 +34,7 @@ typedef struct profile_s {
|
||||||
|
|
||||||
// sensor-related stuff
|
// sensor-related stuff
|
||||||
uint8_t acc_lpf_factor; // Set the Low Pass Filter factor for ACC. Increasing this value would reduce ACC noise (visible in GUI), but would increase ACC lag time. Zero = no filter
|
uint8_t acc_lpf_factor; // Set the Low Pass Filter factor for ACC. Increasing this value would reduce ACC noise (visible in GUI), but would increase ACC lag time. Zero = no filter
|
||||||
|
float accz_lpf_cutoff; // cutoff frequency for the low pass filter used on the acc z-axis for althold in Hz
|
||||||
accDeadband_t accDeadband;
|
accDeadband_t accDeadband;
|
||||||
|
|
||||||
barometerConfig_t barometerConfig;
|
barometerConfig_t barometerConfig;
|
||||||
|
@ -46,7 +47,7 @@ typedef struct profile_s {
|
||||||
// Radio/ESC-related configuration
|
// Radio/ESC-related configuration
|
||||||
uint8_t deadband; // introduce a deadband around the stick center for pitch and roll axis. Must be greater than zero.
|
uint8_t deadband; // introduce a deadband around the stick center for pitch and roll axis. Must be greater than zero.
|
||||||
uint8_t yaw_deadband; // introduce a deadband around the stick center for yaw axis. Must be greater than zero.
|
uint8_t yaw_deadband; // introduce a deadband around the stick center for yaw axis. Must be greater than zero.
|
||||||
uint8_t alt_hold_deadband; // defines the neutral zone of throttle stick during altitude hold, default setting is +/-40
|
uint8_t alt_hold_deadband; // defines the neutral zone of throttle stick during altitude hold, default setting is +/-40
|
||||||
uint8_t alt_hold_fast_change; // when disabled, turn off the althold when throttle stick is out of deadband defined with alt_hold_deadband; when enabled, altitude changes slowly proportional to stick movement
|
uint8_t alt_hold_fast_change; // when disabled, turn off the althold when throttle stick is out of deadband defined with alt_hold_deadband; when enabled, altitude changes slowly proportional to stick movement
|
||||||
|
|
||||||
uint16_t throttle_correction_angle; // the angle when the throttle correction is maximal. in 0.1 degres, ex 225 = 22.5 ,30.0, 450 = 45.0 deg
|
uint16_t throttle_correction_angle; // the angle when the throttle correction is maximal. in 0.1 degres, ex 225 = 22.5 ,30.0, 450 = 45.0 deg
|
||||||
|
|
|
@ -61,6 +61,7 @@ int32_t errorAltitudeI = 0;
|
||||||
int32_t vario = 0; // variometer in cm/s
|
int32_t vario = 0; // variometer in cm/s
|
||||||
|
|
||||||
float throttleAngleScale;
|
float throttleAngleScale;
|
||||||
|
float fc_acc;
|
||||||
|
|
||||||
int32_t BaroPID = 0;
|
int32_t BaroPID = 0;
|
||||||
|
|
||||||
|
@ -103,6 +104,11 @@ void calculateThrottleAngleScale(uint16_t throttle_correction_angle)
|
||||||
throttleAngleScale = (1800.0f / M_PI) * (900.0f / throttle_correction_angle);
|
throttleAngleScale = (1800.0f / M_PI) * (900.0f / throttle_correction_angle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void calculateAccZLowPassFilterRCTimeConstant(float accz_lpf_cutoff)
|
||||||
|
{
|
||||||
|
fc_acc = 0.5f / (M_PI * accz_lpf_cutoff); // calculate RC time constant used in the accZ lpf
|
||||||
|
}
|
||||||
|
|
||||||
void computeIMU(rollAndPitchTrims_t *accelerometerTrims, uint8_t mixerConfiguration)
|
void computeIMU(rollAndPitchTrims_t *accelerometerTrims, uint8_t mixerConfiguration)
|
||||||
{
|
{
|
||||||
static int16_t gyroYawSmooth = 0;
|
static int16_t gyroYawSmooth = 0;
|
||||||
|
@ -207,9 +213,6 @@ int32_t applyDeadband(int32_t value, int32_t deadband)
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define F_CUT_ACCZ 10.0f // 10Hz should still be fast enough
|
|
||||||
static const float fc_acc = 0.5f / (M_PI * F_CUT_ACCZ);
|
|
||||||
|
|
||||||
// rotate acc into Earth frame and calculate acceleration in it
|
// rotate acc into Earth frame and calculate acceleration in it
|
||||||
void acc_calc(uint32_t deltaT)
|
void acc_calc(uint32_t deltaT)
|
||||||
{
|
{
|
||||||
|
|
|
@ -35,3 +35,4 @@ void calculateEstimatedAltitude(uint32_t currentTime);
|
||||||
void computeIMU(rollAndPitchTrims_t *accelerometerTrims, uint8_t mixerConfiguration);
|
void computeIMU(rollAndPitchTrims_t *accelerometerTrims, uint8_t mixerConfiguration);
|
||||||
void calculateThrottleAngleScale(uint16_t throttle_correction_angle);
|
void calculateThrottleAngleScale(uint16_t throttle_correction_angle);
|
||||||
int16_t calculateThrottleAngleCorrection(uint8_t throttle_correction_value);
|
int16_t calculateThrottleAngleCorrection(uint8_t throttle_correction_value);
|
||||||
|
void calculateAccZLowPassFilterRCTimeConstant(float accz_lpf_cutoff);
|
||||||
|
|
|
@ -296,6 +296,7 @@ const clivalue_t valueTable[] = {
|
||||||
{ "acc_lpf_factor", VAR_UINT8, ¤tProfile.acc_lpf_factor, 0, 250 },
|
{ "acc_lpf_factor", VAR_UINT8, ¤tProfile.acc_lpf_factor, 0, 250 },
|
||||||
{ "accxy_deadband", VAR_UINT8, ¤tProfile.accDeadband.xy, 0, 100 },
|
{ "accxy_deadband", VAR_UINT8, ¤tProfile.accDeadband.xy, 0, 100 },
|
||||||
{ "accz_deadband", VAR_UINT8, ¤tProfile.accDeadband.z, 0, 100 },
|
{ "accz_deadband", VAR_UINT8, ¤tProfile.accDeadband.z, 0, 100 },
|
||||||
|
{ "accz_lpf_cutoff", VAR_FLOAT, ¤tProfile.accz_lpf_cutoff, 1, 20 },
|
||||||
{ "acc_unarmedcal", VAR_UINT8, ¤tProfile.acc_unarmedcal, 0, 1 },
|
{ "acc_unarmedcal", VAR_UINT8, ¤tProfile.acc_unarmedcal, 0, 1 },
|
||||||
{ "acc_trim_pitch", VAR_INT16, ¤tProfile.accelerometerTrims.values.pitch, -300, 300 },
|
{ "acc_trim_pitch", VAR_INT16, ¤tProfile.accelerometerTrims.values.pitch, -300, 300 },
|
||||||
{ "acc_trim_roll", VAR_INT16, ¤tProfile.accelerometerTrims.values.roll, -300, 300 },
|
{ "acc_trim_roll", VAR_INT16, ¤tProfile.accelerometerTrims.values.roll, -300, 300 },
|
||||||
|
|
Loading…
Reference in New Issue