added anti integral windup and changed how the integral term is calculated

pull/35/head
topquark12 2020-12-26 11:09:09 +08:00
parent 3afe34b95f
commit 3e859ecafb
1 changed files with 9 additions and 2 deletions

View File

@ -66,14 +66,21 @@ impl Controller {
let p = f64::from(self.parameters.kp) * error;
// integral
self.integral += f64::from(self.parameters.ki) * error * time_delta;
if let Some(last_output_val) = self.last_output
{
//anti integral windup
if last_output_val < self.parameters.output_max.into() && last_output_val > self.parameters.output_min.into()
{
self.integral += error * time_delta;
}
}
if self.integral < self.parameters.integral_min.into() {
self.integral = self.parameters.integral_min.into();
}
if self.integral > self.parameters.integral_max.into() {
self.integral = self.parameters.integral_max.into();
}
let i = self.integral;
let i = self.integral * f64::from(self.parameters.ki);
// derivative
let d = match self.last_input {