Mercurial > public > ostc4
diff Small_CPU/Src/batteryCharger.c @ 859:d32901746950 Evo_2_23
Improvment battery charger visualization:
In the previous version the green flash (charge complete) was shown even battery had not reached 100% charge. Root cause was that the pin signaling the end of charge could be raised for other reasons then a full battery. The new version will show the green flash only in case the battery is rated as full.
In addition the graph visualization has been updated to continously progress. In the previous version it only progressed in case the charge value changed. Especially at charging start the charger is doing some battery evaluation which does not increase the charge state. In such a case the graph seemed to be frozen.
author | Ideenmodellierer |
---|---|
date | Tue, 07 May 2024 21:20:33 +0200 |
parents | b1e24513b83e |
children |
line wrap: on
line diff
--- a/Small_CPU/Src/batteryCharger.c Tue May 07 21:12:37 2024 +0200 +++ b/Small_CPU/Src/batteryCharger.c Tue May 07 21:20:33 2024 +0200 @@ -34,36 +34,17 @@ #include "scheduler.h" -/* Use This compile switch to select the new charger status control implementation */ -#define ENABLE_CHARGER_STATUS_V2 - #define CHARGER_DEBOUNCE_SECONDS (6u) /* 6 seconds used to avoid problems with charger interrupts / disconnections */ -static uint8_t battery_i_charge_status = 0; static uint16_t battery_charger_counter = 0; - -#ifdef ENABLE_CHARGER_STATUS_V2 static chargerState_t batteryChargerState = Charger_NotConnected; -#endif - -/* can be 0, 1 or 255 - * 0 is disconnected - * 1 is charging - * 255 is full - */ -uint8_t get_charge_status(void) -{ - return battery_i_charge_status; -} void set_charge_state(uint8_t newState) { -#ifdef ENABLE_CHARGER_STATUS_V2 if(newState < Charger_END) { batteryChargerState = newState; } -#endif } uint8_t get_charge_state(void) @@ -124,36 +105,20 @@ HAL_GPIO_Init(CHARGE_OUT_GPIO_PORT, &GPIO_InitStructure); } -/* static counter is used to avoid multiple counts of charge startings - and after that it is used, starting at 127 to count for the charge full signal - - there a short disconnections with the QI charger - therefore the battery_charger_counter has a countdown instead of = 0. - - battery_gas_gauge_set_charge_full and scheduleUpdateDeviceDataChargerFull are - set after disconnection as the charging process continues as long as not disconnected - to prevent the short disconnections the battery_charger_counter is used too including - upcounting again while battery_i_charge_status == 255 and the connection is established - - */ - void battery_charger_get_status_and_contral_battery_gas_gauge(uint8_t cycleTimeBase) { -#ifdef ENABLE_CHARGER_STATUS_V2 static uint8_t notifyChargeComplete = 0; -#endif #ifdef OSTC_ON_DISCOVERY_HARDWARE return; #endif -#ifdef ENABLE_CHARGER_STATUS_V2 - if(batteryChargerState == Charger_ColdStart) /* wait for the first valid voltage meassurement */ { - if((global.lifeData.battery_voltage != BATTERY_DEFAULT_VOLTAGE) && (global.lifeData.battery_voltage < BATTERY_CHARGER_CONNECTED_VOLTAGE)) + if(global.lifeData.battery_voltage != BATTERY_DEFAULT_VOLTAGE) /* wait for first valid voltage value */ { - if(global.lifeData.battery_voltage > BATTERY_ENDOF_CHARGE_VOLTAGE) /* Voltage close to full state => maybe new battery inserted */ + if((global.lifeData.battery_voltage < BATTERY_CHARGER_CONNECTED_VOLTAGE) + && (global.lifeData.battery_voltage > BATTERY_ENDOF_CHARGE_VOLTAGE)) /* Voltage close to full state => maybe new battery inserted */ { battery_gas_gauge_set_charge_full(); } @@ -179,7 +144,13 @@ battery_charger_counter = CHARGER_DEBOUNCE_SECONDS; } break; - case Charger_Finished: battery_charger_counter = 0; + case Charger_Finished: if((get_voltage() >= BATTERY_ENDOF_CHARGE_VOLTAGE) && (get_voltage() < BATTERY_CHARGER_CONNECTED_VOLTAGE)) /* stopping does not necessarily mean battery is full */ + { + global.dataSendToMaster.chargeStatus = CHARGER_complete; + global.deviceDataSendToMaster.chargeStatus = CHARGER_complete; + notifyChargeComplete = 1; + } + battery_charger_counter = 10; batteryChargerState = Charger_LostConnection; /* no break */ case Charger_LostConnection: /* the charger stops charging when charge current is 1/10 */ @@ -188,10 +159,6 @@ { notifyChargeComplete = 1; } - else - { - notifyChargeComplete = 0; - } if(battery_charger_counter >= cycleTimeBase) { battery_charger_counter -= cycleTimeBase; @@ -199,7 +166,7 @@ else { battery_charger_counter = 0; - battery_i_charge_status = 0; + global.dataSendToMaster.chargeStatus = CHARGER_off; global.deviceDataSendToMaster.chargeStatus = CHARGER_off; @@ -207,12 +174,13 @@ { battery_gas_gauge_set_charge_full(); scheduleUpdateDeviceDataChargerFull(); - notifyChargeComplete = 0; } + notifyChargeComplete = 0; batteryChargerState = Charger_NotConnected; } break; - default: break; + default: batteryChargerState = Charger_NotConnected; /* unexpected state => reinitialize state machine */ + break; } } else @@ -221,8 +189,7 @@ /* wait for disconnection to write and reset */ switch(batteryChargerState) { - case Charger_NotConnected: battery_i_charge_status = 1; - battery_charger_counter = 0; + case Charger_NotConnected: battery_charger_counter = 0; batteryChargerState = Charger_WarmUp; break; case Charger_LostConnection: batteryChargerState = Charger_Active; @@ -230,7 +197,6 @@ case Charger_WarmUp: battery_charger_counter += cycleTimeBase; if(battery_charger_counter >= CHARGER_DEBOUNCE_SECONDS ) { - battery_i_charge_status = 2; scheduleUpdateDeviceDataChargerCharging(); batteryChargerState = Charger_Active; } @@ -251,11 +217,8 @@ if(HAL_GPIO_ReadPin(CHARGE_IN_GPIO_PORT,CHARGE_IN_PIN)) /* high => charger stopped charging */ { + battery_charger_counter = 30; batteryChargerState = Charger_Finished; - global.dataSendToMaster.chargeStatus = CHARGER_complete; - global.deviceDataSendToMaster.chargeStatus = CHARGER_complete; - battery_charger_counter = 30; - notifyChargeComplete = 1; } else { @@ -279,117 +242,11 @@ HAL_Delay(1); break; - default: /* wait for disconnection */ + default: batteryChargerState = Charger_NotConnected; /* unexpected state => reinitialize state machine */ break; } } } -#else - /* on disconnection or while disconnected */ - if(HAL_GPIO_ReadPin(CHARGE_IN_GPIO_PORT,CHARGE_IN_PIN)) - { - if(battery_charger_counter) - { - battery_charger_counter--; - global.dataSendToMaster.chargeStatus = CHARGER_lostConnection; - global.deviceDataSendToMaster.chargeStatus = CHARGER_lostConnection; - } - /* max count down to 127+5 or 127+20 */ - if((battery_i_charge_status == 255) && battery_charger_counter < 127) - { -// battery_gas_gauge_set_charge_full(); -// scheduleUpdateDeviceDataChargerFull(); - battery_charger_counter = 0; - } - - if(battery_charger_counter == 0) - { - battery_i_charge_status = 0; - global.dataSendToMaster.chargeStatus = CHARGER_off; - global.deviceDataSendToMaster.chargeStatus = CHARGER_off; - - } - return; - } - - /* connected */ - - /* wait for disconnection to write and reset */ - if(battery_i_charge_status == 255) - { - global.dataSendToMaster.chargeStatus = CHARGER_complete; - global.deviceDataSendToMaster.chargeStatus = CHARGER_complete; - - if(((cycleTimeBase > 1) && (battery_charger_counter < 127+5)) || (battery_charger_counter < 127+20)) - battery_charger_counter++; - return; - } - - if(battery_charger_counter == 0) - battery_i_charge_status = 1; - - /* charger is connected and didn't signal full yet */ - global.dataSendToMaster.chargeStatus = CHARGER_running; - global.deviceDataSendToMaster.chargeStatus = CHARGER_running; - - GPIO_InitTypeDef GPIO_InitStructure; - GPIO_InitStructure.Pin = CHARGE_OUT_PIN; - GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; - GPIO_InitStructure.Pull = GPIO_NOPULL; - GPIO_InitStructure.Speed = GPIO_SPEED_LOW; - HAL_GPIO_Init(CHARGE_OUT_GPIO_PORT, &GPIO_InitStructure); - HAL_GPIO_WritePin(CHARGE_OUT_GPIO_PORT, CHARGE_OUT_PIN,GPIO_PIN_SET); - HAL_Delay(1); - - - if(battery_charger_counter < 120) - { - if(cycleTimeBase == 1) - battery_charger_counter++; - else - { - battery_charger_counter += 30; - if(battery_charger_counter >= 127) - battery_charger_counter = 126; - } - } - else - if(battery_charger_counter < 127) - { - battery_charger_counter = 127; - if(battery_i_charge_status < 2) - { - battery_i_charge_status = 2; - scheduleUpdateDeviceDataChargerCharging(); - } - } - - if(battery_charger_counter >= 127) - { - if(HAL_GPIO_ReadPin(CHARGE_IN_GPIO_PORT,CHARGE_IN_PIN) || (get_voltage() >= 4.1f)) - { - battery_charger_counter++; - if(((cycleTimeBase > 1) && (battery_charger_counter > 127+5)) || (battery_charger_counter > 127+20)) - { - battery_charger_counter = 127; - if(get_voltage() >= 4.1f) - { - battery_i_charge_status = 255; - battery_gas_gauge_set_charge_full(); - scheduleUpdateDeviceDataChargerFull(); - } - } - } - else - battery_charger_counter = 127; - } - - GPIO_InitStructure.Pin = CHARGE_OUT_PIN; - GPIO_InitStructure.Mode = GPIO_MODE_ANALOG; - GPIO_InitStructure.Pull = GPIO_NOPULL; - GPIO_InitStructure.Speed = GPIO_SPEED_LOW; - HAL_GPIO_Init(CHARGE_OUT_GPIO_PORT, &GPIO_InitStructure); -#endif } /************************ (C) COPYRIGHT heinrichs weikamp *****END OF FILE****/