From e2d7e3e360e7ebfec6793f0e63ea3d3329bef8f7 Mon Sep 17 00:00:00 2001 From: Patrik Jonsson Date: Tue, 22 Oct 2024 09:31:04 +0200 Subject: [PATCH 1/2] Add filter to current shaper output. --- src/current_shaper.cpp | 9 +++++---- src/current_shaper.h | 1 + 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/current_shaper.cpp b/src/current_shaper.cpp index 100359fa..533ae1f1 100644 --- a/src/current_shaper.cpp +++ b/src/current_shaper.cpp @@ -177,15 +177,16 @@ void CurrentShaperTask::shapeCurrent() { // if (livepwr > max_pwr) { // livepwr = max_pwr; // } + double max_cur; if(!config_threephase_enabled()) { - _max_cur = ((max_pwr - livepwr) / evse.getVoltage()) + evse.getAmps(); + max_cur = ((max_pwr - livepwr) / evse.getVoltage()) + evse.getAmps(); } else { - _max_cur = ((max_pwr - livepwr) / evse.getVoltage() / 3.0) + evse.getAmps(); + max_cur = ((max_pwr - livepwr) / evse.getVoltage() / 3.0) + evse.getAmps(); } - - + // Smooth shaper output to avoid instability with delayed live power samples. + _max_cur = _outputFilter.filter(max_cur, _max_cur, current_shaper_smoothing_time); _changed = true; } diff --git a/src/current_shaper.h b/src/current_shaper.h index eee7ab28..d6474499 100644 --- a/src/current_shaper.h +++ b/src/current_shaper.h @@ -40,6 +40,7 @@ class CurrentShaperTask: public MicroTasks::Task uint32_t _pause_timer; bool _updated; InputFilter _inputFilter; + InputFilter _outputFilter; protected: void setup(); From 49b4bc9d2b08f628b0f290cbdc99cda8e815d828 Mon Sep 17 00:00:00 2001 From: Patrik Jonsson Date: Sun, 18 May 2025 19:46:54 +0200 Subject: [PATCH 2/2] Created separate filter times for shaper input and output. --- divert_sim/test_config.py | 3 ++- models/Config.yaml | 3 ++- src/app_config.cpp | 6 ++++-- src/app_config.h | 3 ++- src/current_shaper.cpp | 6 +++--- 5 files changed, 13 insertions(+), 8 deletions(-) diff --git a/divert_sim/test_config.py b/divert_sim/test_config.py index 18c98e28..033ead6b 100644 --- a/divert_sim/test_config.py +++ b/divert_sim/test_config.py @@ -91,7 +91,8 @@ def test_config_defaults() -> None: assert config["divert_decay_smoothing_time"] == 600 assert config["divert_min_charge_time"] == 600 assert config["current_shaper_max_pwr"] == 0 - assert config["current_shaper_smoothing_time"] == 60 + assert config["current_shaper_input_smoothing_time"] == 60 + assert config["current_shaper_output_smoothing_time"] == 0 assert config["current_shaper_min_pause_time"] == 300 assert config["current_shaper_data_maxinterval"] == 120 assert config["vehicle_data_src"] == 0 diff --git a/models/Config.yaml b/models/Config.yaml index 3cfddbb4..5736534f 100644 --- a/models/Config.yaml +++ b/models/Config.yaml @@ -68,7 +68,8 @@ x-examples: current_shaper_max_pwr: 9000 current_shaper_min_pause_time: 300 current_shaper_data_maxinterval: 120 - current_shaper_smoothing_time: 60 + current_shaper_input_smoothing_time: 60 + current_shaper_output_smoothing_time: 0 vehicle_data_src: 0 tesla_access_token: _DUMMY_PASSWORD tesla_refresh_token: _DUMMY_PASSWORD diff --git a/src/app_config.cpp b/src/app_config.cpp index 45d29c88..88dc3b75 100644 --- a/src/app_config.cpp +++ b/src/app_config.cpp @@ -102,7 +102,8 @@ uint32_t divert_min_charge_time; // Current Shaper settings uint32_t current_shaper_max_pwr; -uint32_t current_shaper_smoothing_time; +uint32_t current_shaper_input_smoothing_time; +uint32_t current_shaper_output_smoothing_time; uint32_t current_shaper_min_pause_time; // in seconds uint32_t current_shaper_data_maxinterval; // in seconds @@ -208,7 +209,8 @@ ConfigOpt *opts[] = // Current Shaper settings new ConfigOptDefinition(current_shaper_max_pwr, 0, "current_shaper_max_pwr", "smp"), - new ConfigOptDefinition(current_shaper_smoothing_time, 60, "current_shaper_smoothing_time", "sst"), + new ConfigOptDefinition(current_shaper_input_smoothing_time, 60, "current_shaper_input_smoothing_time", "sit"), + new ConfigOptDefinition(current_shaper_output_smoothing_time, 0, "current_shaper_output_smoothing_time", "sot"), new ConfigOptDefinition(current_shaper_min_pause_time, 300, "current_shaper_min_pause_time", "spt"), new ConfigOptDefinition(current_shaper_data_maxinterval, 120, "current_shaper_data_maxinterval", "sdm"), diff --git a/src/app_config.h b/src/app_config.h index 1209596c..c0458fcd 100644 --- a/src/app_config.h +++ b/src/app_config.h @@ -89,7 +89,8 @@ extern uint32_t scheduler_start_window; //Shaper settings extern uint32_t current_shaper_max_pwr; -extern uint32_t current_shaper_smoothing_time; +extern uint32_t current_shaper_input_smoothing_time; +extern uint32_t current_shaper_output_smoothing_time; extern uint32_t current_shaper_min_pause_time; extern uint32_t current_shaper_data_maxinterval; diff --git a/src/current_shaper.cpp b/src/current_shaper.cpp index 533ae1f1..83c97158 100644 --- a/src/current_shaper.cpp +++ b/src/current_shaper.cpp @@ -164,7 +164,7 @@ void CurrentShaperTask::shapeCurrent() { _smoothed_live_pwr = _live_pwr; } else { - _smoothed_live_pwr = _inputFilter.filter(_live_pwr, _smoothed_live_pwr, current_shaper_smoothing_time); + _smoothed_live_pwr = _inputFilter.filter(_live_pwr, _smoothed_live_pwr, current_shaper_input_smoothing_time); } livepwr = _smoothed_live_pwr; } @@ -186,7 +186,7 @@ void CurrentShaperTask::shapeCurrent() { max_cur = ((max_pwr - livepwr) / evse.getVoltage() / 3.0) + evse.getAmps(); } // Smooth shaper output to avoid instability with delayed live power samples. - _max_cur = _outputFilter.filter(max_cur, _max_cur, current_shaper_smoothing_time); + _max_cur = _outputFilter.filter(max_cur, _max_cur, current_shaper_output_smoothing_time); _changed = true; } @@ -211,4 +211,4 @@ bool CurrentShaperTask::isActive() { bool CurrentShaperTask::isUpdated() { return _updated; -} \ No newline at end of file +}