|
|
@@ -35,15 +35,21 @@ static __INLINE float PI_Controller_Run(PI_Controller *pi, float err) {
|
|
|
float kp_err = (err) * pi->kp;
|
|
|
float ki_err = (err) * pi->ki;
|
|
|
float integral = ki_err * pi->ts;
|
|
|
- pi->ui = fclamp(pi->ui + integral, pi->min, pi->max);
|
|
|
+
|
|
|
+ pi->ui = pi->ui + integral;
|
|
|
float out = pi->ui + kp_err;
|
|
|
- float sat_out = fclamp(out, pi->min, pi->max);
|
|
|
- if (out != sat_out) {
|
|
|
+ if (out > pi->max) {
|
|
|
+ out = pi->max;
|
|
|
+ pi->ui = out - kp_err;
|
|
|
+ pi->is_sat = true;
|
|
|
+ }else if (out < pi->min) {
|
|
|
+ out = pi->min;
|
|
|
+ pi->ui = out - kp_err;
|
|
|
pi->is_sat = true;
|
|
|
}else {
|
|
|
pi->is_sat = false;
|
|
|
}
|
|
|
- return sat_out;
|
|
|
+ return out;
|
|
|
}
|
|
|
|
|
|
static __INLINE float PI_Controller_RunVel(PI_Controller *pi, float err) {
|
|
|
@@ -56,9 +62,13 @@ static __INLINE float PI_Controller_RunVel(PI_Controller *pi, float err) {
|
|
|
if (out > pi->max) {
|
|
|
out = pi->max;
|
|
|
pi->ui = out - kp_err;
|
|
|
+ pi->is_sat = true;
|
|
|
}else if (out < pi->min) {
|
|
|
out = pi->min;
|
|
|
pi->ui = out - kp_err;
|
|
|
+ pi->is_sat = true;
|
|
|
+ }else {
|
|
|
+ pi->is_sat = false;
|
|
|
}
|
|
|
return out;
|
|
|
}
|