Implemented load management
This commit is contained in:
parent
8ed36f6770
commit
f909f26ea7
48
src/main.c
48
src/main.c
|
@ -24,6 +24,7 @@
|
||||||
#define TIM_CH_BOOTSTRAP TIM_OC2
|
#define TIM_CH_BOOTSTRAP TIM_OC2
|
||||||
|
|
||||||
#define MAX_SLEEP_TIME 3600
|
#define MAX_SLEEP_TIME 3600
|
||||||
|
#define MAX_SLEEP_TIME_LOW_VOLTAGE 300
|
||||||
|
|
||||||
enum OperState {
|
enum OperState {
|
||||||
Bootstrap,
|
Bootstrap,
|
||||||
|
@ -67,7 +68,6 @@ static void init_gpio(void)
|
||||||
|
|
||||||
// GPIO for load activation
|
// GPIO for load activation
|
||||||
gpio_mode_setup(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO15);
|
gpio_mode_setup(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO15);
|
||||||
gpio_set(GPIOA, GPIO15);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void init_clock(void)
|
static void init_clock(void)
|
||||||
|
@ -493,6 +493,16 @@ static void mpp_run(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void load_on(void)
|
||||||
|
{
|
||||||
|
gpio_set(GPIOA, GPIO15);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void load_off(void)
|
||||||
|
{
|
||||||
|
gpio_clear(GPIOA, GPIO15);
|
||||||
|
}
|
||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
uint32_t cpuload = 0;
|
uint32_t cpuload = 0;
|
||||||
|
@ -501,6 +511,7 @@ int main(void)
|
||||||
char msg[128];
|
char msg[128];
|
||||||
char number[FXP_STR_MAXLEN];
|
char number[FXP_STR_MAXLEN];
|
||||||
uint8_t sentSomething = 0;
|
uint8_t sentSomething = 0;
|
||||||
|
uint8_t loadInitialized = 0;
|
||||||
|
|
||||||
int32_t pwm = 0;
|
int32_t pwm = 0;
|
||||||
|
|
||||||
|
@ -539,6 +550,15 @@ int main(void)
|
||||||
// input voltage must exceed output voltage by this value to leave idle mode
|
// input voltage must exceed output voltage by this value to leave idle mode
|
||||||
fxp_t WAKEUP_OFFSET_VOLTAGE = fxp_from_float(1.0f);
|
fxp_t WAKEUP_OFFSET_VOLTAGE = fxp_from_float(1.0f);
|
||||||
|
|
||||||
|
// switch off load below LOAD_OFF_THRESHOLD to protect the battery; when the
|
||||||
|
// battery recovers above LOAD_ON_THRESHOLD the load is switched on again.
|
||||||
|
//
|
||||||
|
// If the battery voltage is below LOAD_LOW_VOLTAGE_THRESHOLD, the battery
|
||||||
|
// voltage is monitored more closely during idle mode.
|
||||||
|
fxp_t LOAD_ON_THRESHOLD = fxp_from_float(13.000f);
|
||||||
|
fxp_t LOAD_OFF_THRESHOLD = fxp_from_float(11.200f);
|
||||||
|
fxp_t LOAD_LOW_VOLTAGE_THRESHOLD = fxp_from_float(11.600f);
|
||||||
|
|
||||||
// Calculated values
|
// Calculated values
|
||||||
//fxp_t VIN_SCALE = fxp_from_float(3.3f * (100 + 12.4f) / 12.4f / 4095.0f);
|
//fxp_t VIN_SCALE = fxp_from_float(3.3f * (100 + 12.4f) / 12.4f / 4095.0f);
|
||||||
//fxp_t VOUT_SCALE = fxp_from_float(3.3f * (100 + 12.0f) / 12.0f / 4095.0f);
|
//fxp_t VOUT_SCALE = fxp_from_float(3.3f * (100 + 12.0f) / 12.0f / 4095.0f);
|
||||||
|
@ -639,6 +659,22 @@ int main(void)
|
||||||
|
|
||||||
power_state.power_avg = fxp_mult(power_state.vout_avg, power_state.current_avg);
|
power_state.power_avg = fxp_mult(power_state.vout_avg, power_state.current_avg);
|
||||||
|
|
||||||
|
// load management
|
||||||
|
if(timebase_ms >= 100) {
|
||||||
|
if(!loadInitialized && power_state.vout_avg > LOAD_OFF_THRESHOLD) {
|
||||||
|
load_on();
|
||||||
|
loadInitialized = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(loadInitialized) {
|
||||||
|
if(power_state.vout_avg < LOAD_OFF_THRESHOLD) {
|
||||||
|
load_off();
|
||||||
|
} else if(power_state.vout_avg > LOAD_ON_THRESHOLD) {
|
||||||
|
load_on();
|
||||||
|
} /* else current state is kept */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Main FSM
|
// Main FSM
|
||||||
if(timebase_ms >= 1000) {
|
if(timebase_ms >= 1000) {
|
||||||
switch(operState) {
|
switch(operState) {
|
||||||
|
@ -832,8 +868,14 @@ int main(void)
|
||||||
time_in_state = 9900; // run the voltage test again
|
time_in_state = 9900; // run the voltage test again
|
||||||
|
|
||||||
sleep_time *= 2;
|
sleep_time *= 2;
|
||||||
if(sleep_time > MAX_SLEEP_TIME) {
|
if(power_state.vout_avg > LOAD_LOW_VOLTAGE_THRESHOLD) {
|
||||||
sleep_time = MAX_SLEEP_TIME;
|
if(sleep_time > MAX_SLEEP_TIME) {
|
||||||
|
sleep_time = MAX_SLEEP_TIME;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if(sleep_time > MAX_SLEEP_TIME_LOW_VOLTAGE) {
|
||||||
|
sleep_time = MAX_SLEEP_TIME_LOW_VOLTAGE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
force_display_update_time = timebase_ms + 10;
|
force_display_update_time = timebase_ms + 10;
|
||||||
|
|
Loading…
Reference in a new issue