From 56b44e8d1e6f5c408a37ec801dd73d38f10065f6 Mon Sep 17 00:00:00 2001 From: Thomas Kolb Date: Sun, 21 Aug 2016 19:04:22 +0200 Subject: [PATCH] Replaced exponential avg. by block-average for MPP measurement --- src/main.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/src/main.c b/src/main.c index fb34d16..a3b4e24 100644 --- a/src/main.c +++ b/src/main.c @@ -373,9 +373,12 @@ struct MPPState { fxp_t maxPower; int32_t maxPWM; + + fxp_t powerAccu; + int32_t powerSamples; }; -#define MPP_TEST_DURATION 25 /* ms */ +#define MPP_TEST_DURATION 10 /* ms */ #define MPP_TEST_STEPS 4 const int32_t mpp_pwm_offsets[MPP_TEST_STEPS] = {-51, -4, 5, 50}; @@ -397,12 +400,24 @@ static void mpp_run( mpp_state->maxPower = 0; mpp_state->maxPWM = *pwm; + mpp_state->powerAccu = 0; + mpp_state->powerSamples = 0; + *pwm = *pwm + mpp_pwm_offsets[0]; } else if(mpp_state->testIdx < MPP_TEST_STEPS) { /* test running */ + + /* accumulation */ + mpp_state->powerAccu = fxp_add(mpp_state->powerAccu, + fxp_mult(power_state->vout, power_state->current)); + mpp_state->powerSamples++; + if(time_in_state > mpp_state->nextTestStepTime) { - if(power_state->power_avg > mpp_state->maxPower) { - mpp_state->maxPower = power_state->power_avg; + /* averaging */ + mpp_state->powerAccu = fxp_div(mpp_state->powerAccu, fxp_from_int(mpp_state->powerSamples)); + + if(mpp_state->powerAccu > mpp_state->maxPower) { + mpp_state->maxPower = mpp_state->powerAccu; mpp_state->maxPWM = *pwm; } @@ -412,6 +427,10 @@ static void mpp_run( *pwm = mpp_state->refPWM + mpp_pwm_offsets[mpp_state->testIdx]; mpp_state->nextTestStepTime = time_in_state + MPP_TEST_DURATION; + + mpp_state->powerAccu = 0; + mpp_state->powerSamples = 0; + } }