From 4284c47e0cf52e45781442b0bc748e0f4de290eb Mon Sep 17 00:00:00 2001 From: rusefi Date: Fri, 2 Jun 2017 22:28:12 -0400 Subject: [PATCH] #435 --- firmware/controllers/math/pid.cpp | 8 ++++---- unit_tests/test_idle_controller.cpp | 10 ++++------ 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/firmware/controllers/math/pid.cpp b/firmware/controllers/math/pid.cpp index c2f8530d1a..75e3b3975d 100644 --- a/firmware/controllers/math/pid.cpp +++ b/firmware/controllers/math/pid.cpp @@ -50,11 +50,11 @@ float Pid::getValue(float target, float input, float dTime) { * If we have exceeded the ability of the controlled device to hit target, the I factor will keep accumulating and approach infinity. * Here we limit the I-term #353 */ - if (iTerm > pid->maxValue - (pTerm + dTerm + pid->offset)) - iTerm = pid->maxValue - (pTerm + dTerm + pid->offset); + if (iTerm > pid->maxValue) + iTerm = pid->maxValue; - if (iTerm < pid->minValue - (pTerm + dTerm + pid->offset)) - iTerm = pid->minValue - (pTerm + dTerm + pid->offset); + if (iTerm < pid->minValue) + iTerm = pid->minValue; float result = pTerm + iTerm + dTerm + pid->offset; if (result > pid->maxValue) { diff --git a/unit_tests/test_idle_controller.cpp b/unit_tests/test_idle_controller.cpp index 72b3cf3680..67d44cda85 100644 --- a/unit_tests/test_idle_controller.cpp +++ b/unit_tests/test_idle_controller.cpp @@ -57,14 +57,12 @@ void testPidController(void) { assertEqualsM("target=50, input=0 iTerm", 0, pid.iTerm); assertEqualsM("target=50, input=70", 0, pid.getValue(/*target*/50, /*input*/70)); - assertEqualsM("target=50, input=70 iTerm", 20, pid.iTerm); + assertEqualsM("target=50, input=70 iTerm", 0, pid.iTerm); assertEqualsM("target=50, input=70 #2", 0, pid.getValue(/*target*/50, /*input*/70)); - // WOW, we are getting non-zero iTerm while iFactor is zero?! - assertEqualsM("target=50, input=70 iTerm #2", 20, pid.iTerm); + assertEqualsM("target=50, input=70 iTerm #2", 0, pid.iTerm); - // and now we inherit this iTerm even for cases where targer==input?! NOT RIGHT - assertEqualsM("target=50, input=50", 20, pid.getValue(/*target*/50, /*input*/50)); - assertEqualsM("target=50, input=50 iTerm", 20, pid.iTerm); + assertEqualsM("target=50, input=50", 0, pid.getValue(/*target*/50, /*input*/50)); + assertEqualsM("target=50, input=50 iTerm", 0, pid.iTerm); }