State tuning; safer startup

- Added some initial values for variables
- Prevent too fast state switching to bootstrap (only bootstrap 5
  seconds after state change)
- Made threshold voltage for switching from MPP to CV different from CV
  constant voltage
This commit is contained in:
Thomas Kolb 2016-08-13 01:12:33 +02:00
parent df0db26122
commit 6fc7e27c0b
2 changed files with 17 additions and 16 deletions

View file

@ -52,7 +52,7 @@ LDFLAGS+=-Wl,--start-group -lc -lgcc -lnosys -Wl,--end-group
CFLAGS_debug=-O0 -ggdb #-DDEBUG CFLAGS_debug=-O0 -ggdb #-DDEBUG
LDFLAGS_debug= LDFLAGS_debug=
CFLAGS_release=-O3 -ggdb CFLAGS_release=-Os -ggdb
LDFLAGS_release= LDFLAGS_release=
# target configuration # target configuration

View file

@ -207,7 +207,7 @@ int main(void)
char number[FXP_STR_MAXLEN]; char number[FXP_STR_MAXLEN];
uint8_t sentSomething = 0; uint8_t sentSomething = 0;
int32_t pwm; int32_t pwm = 0;
enum OperState operState = Bootstrap; enum OperState operState = Bootstrap;
enum OperState nextState = ConvConstVoltage; enum OperState nextState = ConvConstVoltage;
@ -216,13 +216,13 @@ int main(void)
fxp_t vin, vout, current; fxp_t vin, vout, current;
fxp_t vin_avg = 0, vout_avg = 0, current_avg = 0; fxp_t vin_avg = 0, vout_avg = 0, current_avg = 0;
fxp_t pErr, iErr = 0; fxp_t pErr = 0, iErr = 0;
fxp_t controlAction; fxp_t controlAction = 0;
fxp_t power_avg, refPower; fxp_t power_avg, refPower = 0;
fxp_t testPower[2]; fxp_t testPower[2];
int32_t testPWM[2]; int32_t testPWM[2];
int testPWMStep; int testPWMStep = 5;
fxp_t PGAIN_CV = fxp_from_float( 50.000f); fxp_t PGAIN_CV = fxp_from_float( 50.000f);
fxp_t IGAIN_CV = fxp_from_float( 0.300f); fxp_t IGAIN_CV = fxp_from_float( 0.300f);
@ -231,15 +231,16 @@ int main(void)
fxp_t PGAIN_CC = fxp_from_float( 50.000f); fxp_t PGAIN_CC = fxp_from_float( 50.000f);
fxp_t IGAIN_CC = fxp_from_float( 0.300f); fxp_t IGAIN_CC = fxp_from_float( 0.300f);
fxp_t CURRENT_THRESHOLD = fxp_from_float(0.05f); fxp_t CURRENT_THRESHOLD = fxp_from_float(0.01f);
fxp_t AVG_FACT = fxp_from_float(0.10f); fxp_t AVG_FACT = fxp_from_float(0.10f);
fxp_t AVG_FACT_INV = fxp_sub(fxp_from_int(1), AVG_FACT); fxp_t AVG_FACT_INV = fxp_sub(fxp_from_int(1), AVG_FACT);
fxp_t MAX_VOLTAGE = fxp_from_float(13.800f); fxp_t MAX_VOLTAGE = fxp_from_float(14.400f);
fxp_t CONST_VOLTAGE = fxp_from_float(13.800f);
fxp_t MAX_CURRENT = fxp_from_float( 5.000f); fxp_t MAX_CURRENT = fxp_from_float( 5.000f);
fxp_t MPP_VOLTAGE_THR = fxp_sub(MAX_VOLTAGE, fxp_from_float(0.500f)); fxp_t MPP_VOLTAGE_THR = fxp_sub(CONST_VOLTAGE, fxp_from_float(0.500f));
fxp_t MPP_CURRENT_THR = fxp_sub(MAX_CURRENT, fxp_from_float(0.500f)); fxp_t MPP_CURRENT_THR = fxp_sub(MAX_CURRENT, fxp_from_float(0.500f));
// Calculated values // Calculated values
@ -353,7 +354,7 @@ int main(void)
timer_set_oc_value(TIM1, TIM_CH_BOOTSTRAP, 0); timer_set_oc_value(TIM1, TIM_CH_BOOTSTRAP, 0);
// calculate error values // calculate error values
pErr = fxp_sub(MAX_VOLTAGE, vout_avg); pErr = fxp_sub(CONST_VOLTAGE, vout_avg);
iErr = fxp_add(iErr, pErr); iErr = fxp_add(iErr, pErr);
// limit integral error range // limit integral error range
@ -375,7 +376,7 @@ int main(void)
timer_set_oc_value(TIM1, TIM_CH_CONV, 0); timer_set_oc_value(TIM1, TIM_CH_CONV, 0);
} }
if(time_in_state > 1000 && pwm > CONV_PWM_MAX && current < CURRENT_THRESHOLD) { if(time_in_state > 5000 && pwm > CONV_PWM_MAX && current < CURRENT_THRESHOLD) {
operState = Bootstrap; operState = Bootstrap;
nextState = ConvConstVoltage; nextState = ConvConstVoltage;
} }
@ -420,7 +421,7 @@ int main(void)
timer_set_oc_value(TIM1, TIM_CH_CONV, 0); timer_set_oc_value(TIM1, TIM_CH_CONV, 0);
} }
if(time_in_state > 1000 && pwm > CONV_PWM_MAX && current < CURRENT_THRESHOLD) { if(time_in_state > 5000 && pwm > CONV_PWM_MAX && current < CURRENT_THRESHOLD) {
operState = Bootstrap; operState = Bootstrap;
nextState = ConvConstCurrent; nextState = ConvConstCurrent;
} }
@ -471,8 +472,8 @@ int main(void)
// power test is currently idle, but power has changed // power test is currently idle, but power has changed
// too much. // too much.
// -> start a new one. // -> start a new one.
testPWM[0] = pwm + 5; testPWM[0] = pwm + 4;
testPWM[1] = pwm - 4; testPWM[1] = pwm - 3;
testPWMStep = 0; testPWMStep = 0;
break; break;
@ -484,7 +485,7 @@ int main(void)
testPWMStep++; testPWMStep++;
} }
if(time_in_state > 1000 && current < CURRENT_THRESHOLD) { if(time_in_state > 5000 && current < CURRENT_THRESHOLD) {
operState = Bootstrap; operState = Bootstrap;
nextState = ConvMPP; nextState = ConvMPP;
} }
@ -508,7 +509,7 @@ int main(void)
timer_set_oc_value(TIM1, TIM_CH_CONV, 0); timer_set_oc_value(TIM1, TIM_CH_CONV, 0);
timer_set_oc_value(TIM1, TIM_CH_BOOTSTRAP, 0); timer_set_oc_value(TIM1, TIM_CH_BOOTSTRAP, 0);
if(vin_avg > vout_avg) { if(time_in_state > 1000 && vin_avg > vout_avg) {
operState = Bootstrap; operState = Bootstrap;
nextState = ConvMPP; nextState = ConvMPP;
} }