Libary for control.
Diff: PID_Cntrl.h
- Revision:
- 4:1cbd6af9836c
- Child:
- 6:e93f67d98616
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PID_Cntrl.h Thu Apr 22 06:57:43 2021 +0000 @@ -0,0 +1,71 @@ +#ifndef PID_CNTRL_H_ +#define PID_CNTRL_H_ + +class PID_Cntrl +{ + +public: + + PID_Cntrl(float I, float Ts, float uMin, float uMax); + PID_Cntrl(float P, float I, float Ts, float uMin, float uMax); + PID_Cntrl(float P, float I, float D, float Ts, float uMin, float uMax); + PID_Cntrl(float P, float I, float D, float tau_f, float Ts, float uMin, float uMax); + PID_Cntrl(float P, float I, float D, float tau_f, float tau_ro, float Ts, float uMin, float uMax); + + PID_Cntrl() {}; + + float operator()(float e) + { + return update(e); + } + float operator()(float e, float y) + { + return update(e, y); + } + + virtual ~PID_Cntrl(); + + void reset(float initValue); + + void setCoefficients(float I, float Ts, float uMin, float uMax); + void setCoefficients(float P, float I, float Ts, float uMin, float uMax); + void setCoefficients(float P, float I, float D, float Ts, float uMin, float uMax); + void setCoefficients(float P, float I, float D, float tau_f, float Ts, float uMin, float uMax); + void setCoefficients(float P, float I, float D, float tau_f, float tau_ro, float Ts, float uMin, float uMax); + + void setCoeff_P(float P); + void setCoeff_I(float D); + void setCoeff_D(float D); + + void scale_PIDT2_param(float scale); + + float update(float e); + float update(float e, float y); + + bool update_param(int cntrlr_param, float value); + + void set_limits(float uMin, float uMax); + + float get_ulimit(); + float get_P_gain(); + float get_bd(); + float get_ad(); + +private: + + float IPart, Dpart, d_old, u_old, uf; + float P, I, D, tau_f, tau_ro, Ts, uMin, uMax; + float bi, bd, ad, bf, af; + float P_init, I_init, D_init; + + void setInternalCoefficients(float P, float I, float D, float tau_f, float tau_ro, float Ts); + + void updateCoeff_I(float I, float Ts); + void updateCoeff_D(float D, float Ts, float tau_f); + void updateCoeff_RO(float Ts, float tau_ro); + + float saturate(float u, float uMin, float uMax); + +}; + +#endif \ No newline at end of file