aboutsummaryrefslogtreecommitdiffstats
path: root/os/various/pid.h
diff options
context:
space:
mode:
authorFabien Poussin <fabien.poussin@gmail.com>2018-03-22 16:30:35 +0100
committerFabien Poussin <fabien.poussin@gmail.com>2018-03-22 16:30:35 +0100
commitd66ce4b75b1904419f62f666fb231201312a4a11 (patch)
tree47aa6191f59d60090aea60c55bde84de93ed25d2 /os/various/pid.h
parentd4d384557df0e8e7a8071553448b0c42849f98c0 (diff)
downloadChibiOS-Contrib-d66ce4b75b1904419f62f666fb231201312a4a11.tar.gz
ChibiOS-Contrib-d66ce4b75b1904419f62f666fb231201312a4a11.tar.bz2
ChibiOS-Contrib-d66ce4b75b1904419f62f666fb231201312a4a11.zip
Adding PID library
Diffstat (limited to 'os/various/pid.h')
-rw-r--r--os/various/pid.h78
1 files changed, 78 insertions, 0 deletions
diff --git a/os/various/pid.h b/os/various/pid.h
new file mode 100644
index 0000000..d98df3e
--- /dev/null
+++ b/os/various/pid.h
@@ -0,0 +1,78 @@
+#ifndef PID_h
+#define PID_h
+
+#include "chtypes.h"
+
+//Constants used in some of the functions below
+#define PID_AUTOMATIC 1
+#define PID_MANUAL 0
+#define PID_DIRECT 0
+#define PID_REVERSE 1
+#define PID_P_ON_M 0
+#define PID_P_ON_E 1
+
+
+typedef struct {
+
+ float dispKp; // * we'll hold on to the tuning parameters in user-entered
+ float dispKi; // format for display purposes
+ float dispKd; //
+
+ float kp; // * (P)roportional Tuning Parameter
+ float ki; // * (I)ntegral Tuning Parameter
+ float kd; // * (D)erivative Tuning Parameter
+
+ int controllerDirection;
+ int pOn;
+
+ float *myInput; // * Pointers to the Input, Output, and Setpoint variables
+ float *myOutput; // This creates a hard link between the variables and the
+ float *mySetpoint; // PID, freeing the user from having to constantly tell us
+ // what these values are. with pointers we'll just know.
+ unsigned long lastTime;
+ float outputSum;
+ float lastInput;
+
+ unsigned long SampleTime;
+ float outMin;
+ float outMax;
+
+ bool inAuto;
+ bool pOnE;
+
+} pid_t;
+
+
+//commonly used functions **************************************************************************
+void pid_create(pid_t* p, float* Input, float* Output, float* Setpoint, // * constructor. links the PID to the Input, Output, and
+ float Kp, float Ki, float Kd, int POn, int ControllerDirection); // Setpoint. Initial tuning parameters are also set here.
+ // (overload for specifying proportional mode)
+
+void pid_setmode(pid_t* p, int mode); // * sets PID to either Manual (0) or Auto (non-0)
+
+bool pid_compute(pid_t* p); // * performs the PID calculation. it should be
+ // called every time loop() cycles. ON/OFF and
+ // calculation frequency can be set using SetMode
+ // SetSampleTime respectively
+
+void pid_setOutputLimits(pid_t* p, float Min, float Max); // * clamps the output to a specific range. 0-255 by default, but
+ // it's likely the user will want to change this depending on
+ // the application
+
+
+
+//available but not commonly used functions ********************************************************
+void pid_setTunings(pid_t* p, float Kp, float Ki, float Kd, int POn); // * While most users will set the tunings once in the
+ // constructor, this function gives the user the option
+ // of changing tunings during runtime for Adaptive control
+
+void pid_setControllerDirection(pid_t* p, int Direction); // * Sets the Direction, or "Action" of the controller. DIRECT
+ // means the output will increase when error is positive. REVERSE
+ // means the opposite. it's very unlikely that this will be needed
+ // once it is set in the constructor.
+void pid_setSampleTime(pid_t* p, int NewSampleTime); // * sets the frequency, in Milliseconds, with which
+ // the PID calculation is performed. default is 100
+
+void pid_initialize(pid_t* p);
+
+#endif