From 6693d199e5cdf7da59d44da7d644256884540f2b Mon Sep 17 00:00:00 2001 From: Ayush Gupta Date: Sat, 1 Mar 2025 15:17:25 +0530 Subject: [PATCH 1/2] Fix battery indicator showing 0% after firmware update from mobile app --- .../firmware_v1.0/src/lib/battery/battery.c | 91 ++++++++++--------- 1 file changed, 49 insertions(+), 42 deletions(-) diff --git a/Friend/firmware/firmware_v1.0/src/lib/battery/battery.c b/Friend/firmware/firmware_v1.0/src/lib/battery/battery.c index 17b01535fa..965a787930 100644 --- a/Friend/firmware/firmware_v1.0/src/lib/battery/battery.c +++ b/Friend/firmware/firmware_v1.0/src/lib/battery/battery.c @@ -142,53 +142,59 @@ int battery_charge_stop() return gpio_pin_set(gpio_battery_dev, GPIO_BATTERY_CHARGING_ENABLE, 0); } -int battery_get_millivolt(uint16_t *battery_millivolt) -{ - - int ret = 0; - - // Voltage divider circuit (Should tune R1 in software if possible) - const uint16_t R1 = 1037; // Originally 1M ohm, calibrated after measuring actual voltage values. Can happen due to resistor tolerances, temperature ect.. - const uint16_t R2 = 510; // 510K ohm - - // ADC measure - uint16_t adc_vref = adc_ref_internal(adc_battery_dev); - int adc_mv = 0; - - k_mutex_lock(&battery_mut, K_FOREVER); - ret |= adc_read(adc_battery_dev, &sequence); - - if (ret) - { - LOG_WRN("ADC read failed (error %d)", ret); - } - - // Get average sample value. - for (uint8_t sample = 0; sample < ADC_TOTAL_SAMPLES; sample++) - { - adc_mv += sample_buffer[sample]; // ADC value, not millivolt yet. - } - adc_mv /= ADC_TOTAL_SAMPLES; - - // Convert ADC value to millivolts - ret |= adc_raw_to_millivolts(adc_vref, ADC_GAIN, ADC_RESOLUTION, &adc_mv); - - // Calculate battery voltage. - *battery_millivolt = adc_mv * ((R1 + R2) / R2); - k_mutex_unlock(&battery_mut); - - LOG_DBG("%d mV", *battery_millivolt); - return ret; -} - + int battery_get_millivolt(uint16_t *battery_millivolt) + { + int ret = 0; + + // Voltage divider circuit (Should tune R1 in software if possible) + const uint16_t R1 = 1037; // Originally 1M ohm, calibrated after measuring actual voltage values. Can happen due to resistor tolerances, temperature ect.. + const uint16_t R2 = 510; // 510K ohm + + // ADC measure + uint16_t adc_vref = adc_ref_internal(adc_battery_dev); + int adc_mv = 0; + + k_mutex_lock(&battery_mut, K_FOREVER); + ret |= adc_read(adc_battery_dev, &sequence); + + if (ret) + { + LOG_WRN("ADC read failed (error %d)", ret); + } + + // Get average sample value. + for (uint8_t sample = 0; sample < ADC_TOTAL_SAMPLES; sample++) + { + adc_mv += sample_buffer[sample]; // ADC value, not millivolt yet. + } + adc_mv /= ADC_TOTAL_SAMPLES; + + // Convert ADC value to millivolts + ret |= adc_raw_to_millivolts(adc_vref, ADC_GAIN, ADC_RESOLUTION, &adc_mv); + + // Calculate battery voltage. + *battery_millivolt = adc_mv * ((R1 + R2) / R2); + k_mutex_unlock(&battery_mut); + + // Debug logs to track ADC and voltage values + LOG_DBG("Raw ADC Value: %d", adc_mv); // Add this line + LOG_DBG("Battery Voltage: %d mV", *battery_millivolt); // Add this line + return ret; + } + int battery_get_percentage(uint8_t *battery_percentage, uint16_t battery_millivolt) { - // Ensure voltage is within bounds if (battery_millivolt > battery_states[0].voltage) + { *battery_percentage = 100; + return 0; // Add this line + } if (battery_millivolt < battery_states[BATTERY_STATES_COUNT - 1].voltage) + { *battery_percentage = 0; + return 0; // Add this line + } for (uint16_t i = 0; i < BATTERY_STATES_COUNT - 1; i++) { @@ -199,9 +205,10 @@ int battery_get_percentage(uint8_t *battery_percentage, uint16_t battery_millivo *battery_percentage = battery_states[i].percentage + ((float)(battery_millivolt - battery_states[i].voltage) * ((float)(battery_states[i + 1].percentage - battery_states[i].percentage) / - (float)(battery_states[i + 1].voltage - battery_states[i].voltage))); + (float)(battery_states[i + 1].voltage - battery_states[i].voltage))); - LOG_DBG("%d %%", *battery_percentage); + // Debug log to track battery percentage + LOG_DBG("Battery Percentage: %d %%", *battery_percentage); // Update this line return 0; } } From aef9f9dd57e761faece1fe2bbb3b41d51f85e379 Mon Sep 17 00:00:00 2001 From: Ayush Gupta <114745463+Ayush9026@users.noreply.github.com> Date: Mon, 3 Mar 2025 11:56:23 +0530 Subject: [PATCH 2/2] Update battery.c --- .../firmware/firmware_v1.0/src/lib/battery/battery.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Friend/firmware/firmware_v1.0/src/lib/battery/battery.c b/Friend/firmware/firmware_v1.0/src/lib/battery/battery.c index 965a787930..0af6e7646b 100644 --- a/Friend/firmware/firmware_v1.0/src/lib/battery/battery.c +++ b/Friend/firmware/firmware_v1.0/src/lib/battery/battery.c @@ -177,8 +177,8 @@ int battery_charge_stop() k_mutex_unlock(&battery_mut); // Debug logs to track ADC and voltage values - LOG_DBG("Raw ADC Value: %d", adc_mv); // Add this line - LOG_DBG("Battery Voltage: %d mV", *battery_millivolt); // Add this line + LOG_DBG("Raw ADC Value: %d", adc_mv); + LOG_DBG("Battery Voltage: %d mV", *battery_millivolt); return ret; } @@ -188,12 +188,12 @@ int battery_get_percentage(uint8_t *battery_percentage, uint16_t battery_millivo if (battery_millivolt > battery_states[0].voltage) { *battery_percentage = 100; - return 0; // Add this line + return 0; } if (battery_millivolt < battery_states[BATTERY_STATES_COUNT - 1].voltage) { *battery_percentage = 0; - return 0; // Add this line + return 0; } for (uint16_t i = 0; i < BATTERY_STATES_COUNT - 1; i++) @@ -208,7 +208,7 @@ int battery_get_percentage(uint8_t *battery_percentage, uint16_t battery_millivo (float)(battery_states[i + 1].voltage - battery_states[i].voltage))); // Debug log to track battery percentage - LOG_DBG("Battery Percentage: %d %%", *battery_percentage); // Update this line + LOG_DBG("Battery Percentage: %d %%", *battery_percentage); return 0; } }