|
|
@@ -36,6 +36,7 @@ typedef struct {
|
|
|
float Ui;
|
|
|
float sat;
|
|
|
float DT;
|
|
|
+ bool is_sat;
|
|
|
}PI_Controller;
|
|
|
|
|
|
static __INLINE void PI_Controller_max(PI_Controller *pi, float max, float min) {
|
|
|
@@ -45,6 +46,7 @@ static __INLINE void PI_Controller_max(PI_Controller *pi, float max, float min)
|
|
|
static __INLINE void PI_Controller_Reset(PI_Controller *pi, float init) {
|
|
|
pi->Ui = (init);
|
|
|
pi->sat = 0.0f;
|
|
|
+ pi->is_sat = false;
|
|
|
}
|
|
|
|
|
|
static __INLINE float PI_Controller_run(PI_Controller *pi, float err) {
|
|
|
@@ -53,7 +55,13 @@ static __INLINE float PI_Controller_run(PI_Controller *pi, float err) {
|
|
|
float integral = ki_err * pi->DT;
|
|
|
pi->Ui = MATH_sat(pi->Ui + integral, pi->min, pi->max);
|
|
|
float out = pi->Ui + kp_err;
|
|
|
- return (MATH_sat(out, pi->min, pi->max));
|
|
|
+ float sat_out = (MATH_sat(out, pi->min, pi->max));
|
|
|
+ if (out != sat_out) {
|
|
|
+ pi->is_sat = true;
|
|
|
+ }else {
|
|
|
+ pi->is_sat = false;
|
|
|
+ }
|
|
|
+ return sat_out;
|
|
|
}
|
|
|
|
|
|
static __INLINE float PI_Controller_RunSat(PI_Controller *pi, float err) {
|
|
|
@@ -63,6 +71,11 @@ static __INLINE float PI_Controller_RunSat(PI_Controller *pi, float err) {
|
|
|
pi->Ui = pi->Ui + integral + pi->sat * pi->kb;
|
|
|
float out = pi->Ui + kp_err ;
|
|
|
float out_sat = MATH_sat(out, pi->min, pi->max);
|
|
|
+ if (out != out_sat) {
|
|
|
+ pi->is_sat = true;
|
|
|
+ }else {
|
|
|
+ pi->is_sat = false;
|
|
|
+ }
|
|
|
pi->sat = out_sat - out;
|
|
|
if (pi->sat >= 0.0f) {
|
|
|
pi->sat = 0.0f;
|
|
|
@@ -77,7 +90,13 @@ static __INLINE float PI_Controller_RunSerial(PI_Controller *pi, float err) {
|
|
|
float integral = ki_err * pi->DT;
|
|
|
pi->Ui = MATH_sat(pi->Ui + integral, pi->min, pi->max);
|
|
|
float out = pi->Ui + kp_err;
|
|
|
- return (MATH_sat(out, pi->min, pi->max));
|
|
|
+ float sat_out = (MATH_sat(out, pi->min, pi->max));
|
|
|
+ if (out != sat_out) {
|
|
|
+ pi->is_sat = true;
|
|
|
+ }else {
|
|
|
+ pi->is_sat = false;
|
|
|
+ }
|
|
|
+ return sat_out;
|
|
|
}
|
|
|
|
|
|
static __INLINE float _fmod(float v, s32 m) {
|