Mercurial > public > ostc4
diff Small_CPU/Src/batteryCharger.c @ 696:cc542448fb28
Merge
author | heinrichsweikamp |
---|---|
date | Fri, 19 Aug 2022 11:30:24 +0200 |
parents | b1e24513b83e |
children | d32901746950 |
line wrap: on
line diff
--- a/Small_CPU/Src/batteryCharger.c Mon Nov 01 12:39:34 2021 +0100 +++ b/Small_CPU/Src/batteryCharger.c Fri Aug 19 11:30:24 2022 +0200 @@ -37,29 +37,12 @@ /* Use This compile switch to select the new charger status control implementation */ #define ENABLE_CHARGER_STATUS_V2 -#define CHARGE_IN_PIN GPIO_PIN_2 -#define CHARGE_IN_GPIO_PORT GPIOC -#define CHARGE_IN_GPIO_ENABLE() __GPIOC_CLK_ENABLE() +#define CHARGER_DEBOUNCE_SECONDS (6u) /* 6 seconds used to avoid problems with charger interrupts / disconnections */ -#define CHARGE_OUT_PIN GPIO_PIN_1 -#define CHARGE_OUT_GPIO_PORT GPIOC -#define CHARGE_OUT_GPIO_ENABLE() __GPIOC_CLK_ENABLE() - -#define CHARGER_DEBOUNCE_SECONDS (5u) /* 5 seconds used to avoid problems with charger interrupts / disconnections */ - -uint8_t battery_i_charge_status = 0; -uint16_t battery_charger_counter = 0; +static uint8_t battery_i_charge_status = 0; +static uint16_t battery_charger_counter = 0; #ifdef ENABLE_CHARGER_STATUS_V2 -typedef enum -{ - Charger_NotConnected = 0, /* This is identified reading CHARGE_IN_PIN == HIGH */ - Charger_WarmUp, /* Charging started but counter did not yet reach a certain limit (used to debounce connect / disconnect events to avoid multiple increases of statistic charging cycle counter) */ - Charger_Active, /* Charging identified by CHARGE_IN_PIN == LOW for a certain time */ - Charger_Finished, - Charger_LostConnection /* Intermediate state to debounce disconnecting events (including charging error state like over temperature) */ -} chargerState_t; - static chargerState_t batteryChargerState = Charger_NotConnected; #endif @@ -73,6 +56,21 @@ 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) +{ + return batteryChargerState; +} + void init_battery_charger_status(void) { #ifdef OSTC_ON_DISCOVERY_HARDWARE @@ -150,115 +148,140 @@ #endif #ifdef ENABLE_CHARGER_STATUS_V2 - /* on disconnection or while disconnected */ - if(HAL_GPIO_ReadPin(CHARGE_IN_GPIO_PORT,CHARGE_IN_PIN)) + + if(batteryChargerState == Charger_ColdStart) /* wait for the first valid voltage meassurement */ { - switch(batteryChargerState) + if((global.lifeData.battery_voltage != BATTERY_DEFAULT_VOLTAGE) && (global.lifeData.battery_voltage < BATTERY_CHARGER_CONNECTED_VOLTAGE)) { - case Charger_Active: global.dataSendToMaster.chargeStatus = CHARGER_lostConnection; - global.deviceDataSendToMaster.chargeStatus = CHARGER_lostConnection; - batteryChargerState = Charger_LostConnection; - battery_charger_counter = CHARGER_DEBOUNCE_SECONDS; - - if(get_voltage() >= 4.1f) /* the charger stops charging when charge current is 1/10. */ - { /* Basically it is OK to rate a charging as complete if a defined voltage is reached */ - batteryChargerState = Charger_Finished; - global.dataSendToMaster.chargeStatus = CHARGER_complete; - global.deviceDataSendToMaster.chargeStatus = CHARGER_complete; - battery_charger_counter = 15; - notifyChargeComplete = 1; - } - break; - case Charger_WarmUp: - case Charger_Finished: - case Charger_LostConnection: if(battery_charger_counter >= cycleTimeBase) - { - battery_charger_counter -= cycleTimeBase; - global.dataSendToMaster.chargeStatus = CHARGER_lostConnection; - global.deviceDataSendToMaster.chargeStatus = CHARGER_lostConnection; - batteryChargerState = Charger_LostConnection; - } - else - { - battery_charger_counter = 0; - battery_i_charge_status = 0; - global.dataSendToMaster.chargeStatus = CHARGER_off; - global.deviceDataSendToMaster.chargeStatus = CHARGER_off; - - if(notifyChargeComplete) - { - battery_gas_gauge_set_charge_full(); - scheduleUpdateDeviceDataChargerFull(); - notifyChargeComplete = 0; - } - batteryChargerState = Charger_NotConnected; - } - break; - default: break; + if(global.lifeData.battery_voltage > BATTERY_ENDOF_CHARGE_VOLTAGE) /* Voltage close to full state => maybe new battery inserted */ + { + battery_gas_gauge_set_charge_full(); + } + batteryChargerState = Charger_NotConnected; } } else - { - /* connected */ - /* wait for disconnection to write and reset */ - switch(batteryChargerState) + { /* on disconnection or while disconnected */ + if(HAL_GPIO_ReadPin(CHARGE_IN_GPIO_PORT,CHARGE_IN_PIN)) { - case Charger_NotConnected: battery_i_charge_status = 1; - battery_charger_counter = 0; - batteryChargerState = Charger_WarmUp; - break; - case Charger_LostConnection: batteryChargerState = Charger_Active; - break; - case Charger_WarmUp: battery_charger_counter += cycleTimeBase; - if(battery_charger_counter >= CHARGER_DEBOUNCE_SECONDS ) - { - battery_i_charge_status = 2; - scheduleUpdateDeviceDataChargerCharging(); - batteryChargerState = Charger_Active; - } - /* no break */ - case Charger_Finished: - case Charger_Active: global.dataSendToMaster.chargeStatus = CHARGER_running; - global.deviceDataSendToMaster.chargeStatus = CHARGER_running; - - /* drive the output pin high to determine the state of the charger */ - 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(HAL_GPIO_ReadPin(CHARGE_IN_GPIO_PORT,CHARGE_IN_PIN)) /* high => charger stopped charging */ - { - batteryChargerState = Charger_Finished; - global.dataSendToMaster.chargeStatus = CHARGER_complete; - global.deviceDataSendToMaster.chargeStatus = CHARGER_complete; - battery_charger_counter = 30; - notifyChargeComplete = 1; - } - else - { - if(batteryChargerState == Charger_Finished) /* voltage dropped below the hysteresis again => charging restarted */ + switch(batteryChargerState) + { + case Charger_WarmUp: + case Charger_Active: global.dataSendToMaster.chargeStatus = CHARGER_lostConnection; + global.deviceDataSendToMaster.chargeStatus = CHARGER_lostConnection; + batteryChargerState = Charger_LostConnection; + if(cycleTimeBase > CHARGER_DEBOUNCE_SECONDS) /* adapt connection lost detection to sleep mode */ + { + battery_charger_counter = cycleTimeBase + 1; + } + else { - batteryChargerState = Charger_Active; + battery_charger_counter = CHARGER_DEBOUNCE_SECONDS; + } + break; + case Charger_Finished: battery_charger_counter = 0; + batteryChargerState = Charger_LostConnection; + /* no break */ + case Charger_LostConnection: /* the charger stops charging when charge current is 1/10 */ + /* Basically it is OK to rate a charging as complete if a defined voltage is reached */ + if(((battery_gas_gauge_isChargeValueValid() == 0) || (global.lifeData.battery_charge < 90)) && (get_voltage() >= BATTERY_ENDOF_CHARGE_VOLTAGE) && (get_voltage() < BATTERY_CHARGER_CONNECTED_VOLTAGE)) + { + notifyChargeComplete = 1; + } + else + { notifyChargeComplete = 0; } - } + if(battery_charger_counter >= cycleTimeBase) + { + battery_charger_counter -= cycleTimeBase; + } + else + { + battery_charger_counter = 0; + battery_i_charge_status = 0; + global.dataSendToMaster.chargeStatus = CHARGER_off; + global.deviceDataSendToMaster.chargeStatus = CHARGER_off; - /* restore high impedance to be able to detect disconnection */ - 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); - HAL_Delay(1); - break; + if(notifyChargeComplete) + { + battery_gas_gauge_set_charge_full(); + scheduleUpdateDeviceDataChargerFull(); + notifyChargeComplete = 0; + } + batteryChargerState = Charger_NotConnected; + } + break; + default: break; + } + } + else + { + /* connected */ + /* wait for disconnection to write and reset */ + switch(batteryChargerState) + { + case Charger_NotConnected: battery_i_charge_status = 1; + battery_charger_counter = 0; + batteryChargerState = Charger_WarmUp; + break; + case Charger_LostConnection: batteryChargerState = Charger_Active; + break; + case Charger_WarmUp: battery_charger_counter += cycleTimeBase; + if(battery_charger_counter >= CHARGER_DEBOUNCE_SECONDS ) + { + battery_i_charge_status = 2; + scheduleUpdateDeviceDataChargerCharging(); + batteryChargerState = Charger_Active; + } + /* no break */ + case Charger_Finished: + case Charger_Active: global.dataSendToMaster.chargeStatus = CHARGER_running; + global.deviceDataSendToMaster.chargeStatus = CHARGER_running; - default: /* wait for disconnection */ - break; + /* drive the output pin high to determine the state of the charger */ + 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(HAL_GPIO_ReadPin(CHARGE_IN_GPIO_PORT,CHARGE_IN_PIN)) /* high => charger stopped charging */ + { + batteryChargerState = Charger_Finished; + global.dataSendToMaster.chargeStatus = CHARGER_complete; + global.deviceDataSendToMaster.chargeStatus = CHARGER_complete; + battery_charger_counter = 30; + notifyChargeComplete = 1; + } + else + { + if(global.lifeData.battery_charge > 100.0) /* still charging but indicator is set to full => decrease to 99% to keep count increasing */ + { + battery_gas_gauge_set(99.0); + } + if(batteryChargerState == Charger_Finished) /* voltage dropped below the hysteresis again => charging restarted */ + { + batteryChargerState = Charger_Active; + notifyChargeComplete = 0; + } + } + + /* restore high impedance to be able to detect disconnection */ + 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); + HAL_Delay(1); + break; + + default: /* wait for disconnection */ + break; + } } } #else