mirror of
https://github.com/ArduPilot/ardupilot
synced 2025-03-03 12:14:10 -04:00
AC_PID: added AC_PI controller
will be used by IMU heater
This commit is contained in:
parent
d623da0de6
commit
ad69f6802f
47
libraries/AC_PID/AC_PI.cpp
Normal file
47
libraries/AC_PID/AC_PI.cpp
Normal 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
34
libraries/AC_PID/AC_PI.h
Normal 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;
|
||||||
|
};
|
Loading…
Reference in New Issue
Block a user