aboutsummaryrefslogtreecommitdiff
path: root/src/lib/ecl/attitude_fw/ecl_pitch_controller.cpp
diff options
context:
space:
mode:
authorThomas Gubler <thomasgubler@gmail.com>2013-10-19 14:14:44 +0200
committerThomas Gubler <thomasgubler@gmail.com>2013-10-24 17:47:22 +0200
commit8f74aab468d565101eaa1e0f104b0297343fe2ed (patch)
treec0b376656cd1e147c0572db3def03429f0b10703 /src/lib/ecl/attitude_fw/ecl_pitch_controller.cpp
parentb9ef3636f5210588d0aa219a163d3ef5edd6a204 (diff)
downloadpx4-firmware-8f74aab468d565101eaa1e0f104b0297343fe2ed.tar.gz
px4-firmware-8f74aab468d565101eaa1e0f104b0297343fe2ed.tar.bz2
px4-firmware-8f74aab468d565101eaa1e0f104b0297343fe2ed.zip
fw att control: bugfixes for integrator
Diffstat (limited to 'src/lib/ecl/attitude_fw/ecl_pitch_controller.cpp')
-rw-r--r--src/lib/ecl/attitude_fw/ecl_pitch_controller.cpp11
1 files changed, 4 insertions, 7 deletions
diff --git a/src/lib/ecl/attitude_fw/ecl_pitch_controller.cpp b/src/lib/ecl/attitude_fw/ecl_pitch_controller.cpp
index e1f4d3eef..5fe55163f 100644
--- a/src/lib/ecl/attitude_fw/ecl_pitch_controller.cpp
+++ b/src/lib/ecl/attitude_fw/ecl_pitch_controller.cpp
@@ -116,8 +116,7 @@ float ECL_PitchController::control_bodyrate(float roll, float pitch,
/* get the usual dt estimate */
uint64_t dt_micros = ecl_elapsed_time(&_last_run);
_last_run = ecl_absolute_time();
-
- float dt = dt_micros / 1000000;
+ float dt = (dt_micros > 500000) ? 0.0f : (float)dt_micros * 1e-6f;
/* lock integral for long intervals */
if (dt_micros > 500000)
@@ -142,11 +141,9 @@ float ECL_PitchController::control_bodyrate(float roll, float pitch,
_rate_error = _bodyrate_setpoint - pitch_bodyrate;
- float ilimit_scaled = 0.0f;
-
if (!lock_integrator && k_i_rate > 0.0f && airspeed > 0.5f * airspeed_min) {
- float id = _rate_error * k_i_rate * dt * scaler;
+ float id = _rate_error * dt;
/*
* anti-windup: do not allow integrator to increase into the
@@ -164,9 +161,9 @@ float ECL_PitchController::control_bodyrate(float roll, float pitch,
}
/* integrator limit */
- _integrator = math::constrain(_integrator, -ilimit_scaled, ilimit_scaled);
+ _integrator = math::constrain(_integrator, -_integrator_max, _integrator_max);
/* store non-limited output */
- _last_output = ((_rate_error * _k_d * scaler) + _integrator + (_rate_setpoint * k_roll_ff)) * scaler;
+ _last_output = ((_rate_error * _k_d * scaler) + _integrator * k_i_rate * scaler + (_rate_setpoint * k_roll_ff)) * scaler;
return math::constrain(_last_output, -_max_deflection_rad, _max_deflection_rad);
}