#include <AP_Math/AP_Math.h>
#include "AC_PI.h"
const AP_Param::GroupInfo AC_PI::var_info[] = {
AP_GROUPINFO_FLAGS_DEFAULT_POINTER("P", 1, AC_PI, kP, default_kp),
AP_GROUPINFO_FLAGS_DEFAULT_POINTER("I", 2, AC_PI, kI, default_ki),
AP_GROUPINFO_FLAGS_DEFAULT_POINTER("IMAX", 3, AC_PI, imax, default_imax),
AP_GROUPEND
};
AC_PI::AC_PI(float initial_p, float initial_i, float initial_imax) :
default_kp(initial_p),
default_ki(initial_i),
default_imax(initial_imax)
{
AP_Param::setup_object_defaults(this, var_info);
}
float AC_PI::update(float measurement, float target, float dt)
{
const float err = target - measurement;
integrator += kI * err * dt;
integrator = constrain_float(integrator, 0, imax);
output_P = kP * err;
return output_P + integrator;
}