From 3afe34b95f9d84da69a4884c2c01e5f32d7edb5b Mon Sep 17 00:00:00 2001 From: topquark12 Date: Sat, 26 Dec 2020 11:06:52 +0800 Subject: [PATCH 1/4] changes to error calculation, polarity of kP and kI will be flipped --- src/pid.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pid.rs b/src/pid.rs index 996c538..503ad4c 100644 --- a/src/pid.rs +++ b/src/pid.rs @@ -60,7 +60,7 @@ impl Controller { let time_delta = time_delta.get::(); // error - let error = input - self.target; + let error = self.target - input; // proportional let p = f64::from(self.parameters.kp) * error; -- 2.44.1 From 3e859ecafbc0b963284221c6749cfb2eee1c691d Mon Sep 17 00:00:00 2001 From: topquark12 Date: Sat, 26 Dec 2020 11:09:09 +0800 Subject: [PATCH 2/4] added anti integral windup and changed how the integral term is calculated --- src/pid.rs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/pid.rs b/src/pid.rs index 503ad4c..dc1ea9c 100644 --- a/src/pid.rs +++ b/src/pid.rs @@ -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 { -- 2.44.1 From a632fc3a8e42ad054d28ccee6978039c6dab9e66 Mon Sep 17 00:00:00 2001 From: topquark12 Date: Sat, 26 Dec 2020 11:25:05 +0800 Subject: [PATCH 3/4] fix formatting --- src/pid.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/pid.rs b/src/pid.rs index dc1ea9c..cc8a56c 100644 --- a/src/pid.rs +++ b/src/pid.rs @@ -66,9 +66,8 @@ impl Controller { let p = f64::from(self.parameters.kp) * error; // integral - if let Some(last_output_val) = self.last_output - { - //anti integral windup + 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; -- 2.44.1 From eb5b7470508ea5d54b798384290b523604e4778e Mon Sep 17 00:00:00 2001 From: topquark12 Date: Sat, 26 Dec 2020 11:26:53 +0800 Subject: [PATCH 4/4] fix l71 formatting --- src/pid.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/pid.rs b/src/pid.rs index cc8a56c..f23d636 100644 --- a/src/pid.rs +++ b/src/pid.rs @@ -68,8 +68,7 @@ impl Controller { // integral 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() - { + if last_output_val < self.parameters.output_max.into() && last_output_val > self.parameters.output_min.into() { self.integral += error * time_delta; } } -- 2.44.1