AC_PID: added AC_PI controller

will be used by IMU heater
This commit is contained in:
Andrew Tridgell 2019-11-02 13:31:40 +11:00 committed by Randy Mackay
parent 7df56a8533
commit 3b63a8a2c3
2 changed files with 81 additions and 0 deletions

View File

@ -0,0 +1,47 @@
/*
Generic PI algorithm for controllers that don't need filtering (such as heaters)
*/
#include <AP_Math/AP_Math.h>
#include "AC_PI.h"
const AP_Param::GroupInfo AC_PI::var_info[] = {
// @Param: P
// @DisplayName: PID Proportional Gain
// @Description: P Gain which produces an output value that is proportional to the current error value
AP_GROUPINFO("P", 1, AC_PI, kP, 0),
// @Param: I
// @DisplayName: PID Integral Gain
// @Description: I Gain which produces an output that is proportional to both the magnitude and the duration of the error
AP_GROUPINFO("I", 2, AC_PI, kI, 0),
// @Param: IMAX
// @DisplayName: PID Integral Maximum
// @Description: The maximum/minimum value that the I term can output
AP_GROUPINFO("IMAX", 3, AC_PI, imax, 0),
AP_GROUPEND
};
// Constructor
AC_PI::AC_PI(float initial_p, float initial_i, float initial_imax)
{
// load parameter values from eeprom
AP_Param::setup_object_defaults(this, var_info);
kP.set(initial_p);
kI.set(initial_i);
imax.set(initial_imax);
}
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;
}

34
libraries/AC_PID/AC_PI.h Normal file
View File

@ -0,0 +1,34 @@
#pragma once
/*
Generic PI for systems like heater control, no filtering
*/
#include <AP_Common/AP_Common.h>
#include <AP_Param/AP_Param.h>
class AC_PI {
public:
// Constructor
AC_PI(float initial_p, float initial_i, float initial_imax);
// update controller
float update(float measurement, float target, float dt);
// parameter var table
static const struct AP_Param::GroupInfo var_info[];
float get_P() {
return output_P;
}
float get_I() {
return integrator;
}
protected:
AP_Float kP;
AP_Float kI;
AP_Float imax;
float integrator;
float output_P;
};