From a24dba13f46b00ace5ec42ae9851ed811ba3565c Mon Sep 17 00:00:00 2001 From: rusefi Date: Thu, 14 Sep 2017 21:49:26 -0400 Subject: [PATCH] PID auto tune --- firmware/controllers/math/pid_auto_tune.cpp | 4 +- unit_tests/test_pid_auto.cpp | 47 +++++++++++++++++++++ 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/firmware/controllers/math/pid_auto_tune.cpp b/firmware/controllers/math/pid_auto_tune.cpp index 9ab39de050..06459876ef 100644 --- a/firmware/controllers/math/pid_auto_tune.cpp +++ b/firmware/controllers/math/pid_auto_tune.cpp @@ -75,9 +75,9 @@ int PID_AutoTune::Runtime(Logging *logging) { for (int i = nLookBack - 1; i >= 0; i--) { float val = lastInputs[i]; if (isMax) - isMax = input > val; + isMax = input >= val; if (isMin) - isMin = input < val; + isMin = input <= val; lastInputs[i + 1] = lastInputs[i]; } lastInputs[0] = input; diff --git a/unit_tests/test_pid_auto.cpp b/unit_tests/test_pid_auto.cpp index 2414f5ef17..0a7c194128 100644 --- a/unit_tests/test_pid_auto.cpp +++ b/unit_tests/test_pid_auto.cpp @@ -8,6 +8,7 @@ #include "main.h" #include "test_pid_auto.h" +#include "pid_auto_tune.h" efitimems_t mockTimeMs = 0; @@ -15,7 +16,53 @@ efitimems_t currentTimeMillis(void) { return mockTimeMs; } +Logging logging; + +static zigZagValue(int index) { + int i = index % 20; + if ( i <= 10) + return i * 10; + return (20 - i) * 10; + +} + void testPidAutoZigZag() { mockTimeMs = 0; + PID_AutoTune at; + + at.outputStart = 50; + + at.input = zigZagValue(mockTimeMs); + at.Runtime(&logging); + + mockTimeMs++; + at.input = zigZagValue(mockTimeMs); + at.Runtime(&logging); + assertEqualsLM("min@1", 0, at.absMin); + assertEqualsLM("max@1", 10, at.absMax); + assertEqualsM("peakCount", 0, at.peakCount); + + for (;mockTimeMs<=11;mockTimeMs++) { + at.input = zigZagValue(mockTimeMs); + at.Runtime(&logging); + + } + assertEqualsLM("min@11", 0, at.absMin); + assertEqualsLM("max@11", 100, at.absMax); + assertEqualsM("peakCount", 0, at.peakCount); + + for (;mockTimeMs<=21;mockTimeMs++) { + at.input = zigZagValue(mockTimeMs); + at.Runtime(&logging); + } + assertEqualsM("peakCount", 1, at.peakCount); + + for (;mockTimeMs<=41;mockTimeMs++) { + at.input = zigZagValue(mockTimeMs); + at.Runtime(&logging); + } + assertEqualsM("peakCount", 2, at.peakCount); + + }