Skip to content

Commit

Permalink
fix(battery-monitor): prevent voltage spike on reg output turn on
Browse files Browse the repository at this point in the history
When the reg output is off, the controller was trying to compensate for
a too low voltage by increasing the output voltage pot value. This makes
the pot have the maximum value when the controller is turned on,
resulting in a voltage spike. Fixed by returning early from functions
that depend on the controller being powered on to function.
  • Loading branch information
hashemmm96 committed Jul 12, 2024
1 parent 31d8b5a commit ff1cad1
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 0 deletions.
5 changes: 5 additions & 0 deletions apps/battery-monitor/src/battery.c
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,11 @@ void update_battery_leds(void) {
}

void update_reg_out_voltage_controller(void) {
// Not relevant to update the controller when the reg out is off.
if (get_reg_out_power_state() == POWER_OFF) {
return;
}

// Target voltage is set to 0 on init. Default to 5V or 12V depending on
// jumper state.
if (battery_state.target_reg_out_voltage == 0) {
Expand Down
6 changes: 6 additions & 0 deletions apps/battery-monitor/src/jumpers.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#include "battery.h"
#include "error.h"
#include "potentiometer.h"
#include "power.h"

/*
* X11 and X12 jumper configuration
Expand Down Expand Up @@ -51,6 +52,11 @@ uint16_t get_current_measure_jumper_r_out(void) {
}

void update_voltage_regulator_jumper_state(void) {
// The jumper state cannot be determined if the reg out is off.
if (get_reg_out_power_state() == POWER_OFF) {
return;
}

battery_state_t *battery_state = get_battery_state();
uint8_t pot_val = 0;

Expand Down
12 changes: 12 additions & 0 deletions apps/battery-monitor/tests/test-battery.c
Original file line number Diff line number Diff line change
Expand Up @@ -401,6 +401,9 @@ void test_update_reg_out_voltage_controller_increase_voltage(void) {
};
SET_CUSTOM_FAKE_SEQ(read_potentiometer_value, custom_fakes, 2);

power_state_t reg_out_state_return_values[2] = {POWER_ON, POWER_ON};
SET_RETURN_SEQ(get_reg_out_power_state, reg_out_state_return_values, 2);

update_reg_out_voltage_controller();

ASSERT(read_potentiometer_value_fake.call_count == 1, "expected: 1, got: %u",
Expand Down Expand Up @@ -440,6 +443,9 @@ void test_update_reg_out_voltage_controller_decrease_voltage(void) {
};
SET_CUSTOM_FAKE_SEQ(read_potentiometer_value, custom_fakes, 2);

power_state_t reg_out_state_return_values[2] = {POWER_ON, POWER_ON};
SET_RETURN_SEQ(get_reg_out_power_state, reg_out_state_return_values, 2);

update_reg_out_voltage_controller();

ASSERT(write_potentiometer_value_fake.call_count == 1, "expected: 1, got: %u",
Expand Down Expand Up @@ -469,6 +475,9 @@ void test_update_reg_out_voltage_controller_startup_low_voltage(void) {
const uint16_t startup_voltage = 2500;
battery_state->reg_out.voltage = startup_voltage;

power_state_t reg_out_state_return_values[2] = {POWER_ON, POWER_ON};
SET_RETURN_SEQ(get_reg_out_power_state, reg_out_state_return_values, 2);

update_voltage_regulator_jumper_state();
update_reg_out_voltage_controller();

Expand All @@ -488,6 +497,9 @@ void test_update_reg_out_voltage_controller_startup_high_voltage(void) {
const uint16_t startup_voltage = 6000;
battery_state->reg_out.voltage = startup_voltage;

power_state_t reg_out_state_return_values[2] = {POWER_ON, POWER_ON};
SET_RETURN_SEQ(get_reg_out_power_state, reg_out_state_return_values, 2);

update_voltage_regulator_jumper_state();
update_reg_out_voltage_controller();

Expand Down

0 comments on commit ff1cad1

Please sign in to comment.