Mercurial > public > ostc4
diff Small_CPU/Src/batteryCharger.c @ 38:5f11787b4f42
include in ostc4 repository
author | heinrichsweikamp |
---|---|
date | Sat, 28 Apr 2018 11:52:34 +0200 |
parents | |
children | 5149cd644fbc |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Small_CPU/Src/batteryCharger.c Sat Apr 28 11:52:34 2018 +0200 @@ -0,0 +1,237 @@ +/** + ****************************************************************************** + * @file batteryCharger.c + * @author heinrichs weikamp gmbh + * @date 09-Dec-2014 + * @version V0.0.1 + * @since 09-Dec-2014 + * @brief LTC4054 Battery Charger + * + @verbatim + ============================================================================== + ##### How to use ##### + ============================================================================== + +The bq5105x provides one status output, CHG. This output is an open-drain NMOS device that is rated to 20 V. +The open-drain FET connected to the CHG pin will be turned on whenever the output (BAT) of the charger is +enabled. As a note, the output of the charger supply will not be enabled if the VRECT-REG does not converge to the +no-load target voltage. + +CHG F4 7 O Open-drain output – active when BAT is enabled. Float if not used. + +@endverbatim + ****************************************************************************** + * @attention + * + * <h2><center>© COPYRIGHT(c) 2015 heinrichs weikamp</center></h2> + * + ****************************************************************************** + */ +/* Includes ------------------------------------------------------------------*/ +#include "batteryCharger.h" +#include "batteryGasGauge.h" +#include "stm32f4xx_hal.h" +#include "scheduler.h" + + +#define CHARGE_IN_PIN GPIO_PIN_2 +#define CHARGE_IN_GPIO_PORT GPIOC +#define CHARGE_IN_GPIO_ENABLE() __GPIOC_CLK_ENABLE() + +#define CHARGE_OUT_PIN GPIO_PIN_1 +#define CHARGE_OUT_GPIO_PORT GPIOC +#define CHARGE_OUT_GPIO_ENABLE() __GPIOC_CLK_ENABLE() + + +uint8_t battery_i_charge_status = 0; +uint8_t battery_charger_counter = 0; + +/* 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 init_battery_charger_status(void) +{ + #ifdef OSTC_ON_DISCOVERY_HARDWARE + return; + #endif + + CHARGE_IN_GPIO_ENABLE(); + CHARGE_OUT_GPIO_ENABLE(); + + ReInit_battery_charger_status_pins(); +} + +void ReInit_battery_charger_status_pins(void) +{ + #ifdef OSTC_ON_DISCOVERY_HARDWARE + return; + #endif + + GPIO_InitTypeDef GPIO_InitStructure; + + GPIO_InitStructure.Pin = CHARGE_IN_PIN; + GPIO_InitStructure.Mode = GPIO_MODE_INPUT; + GPIO_InitStructure.Pull = GPIO_NOPULL; + GPIO_InitStructure.Speed = GPIO_SPEED_LOW; + HAL_GPIO_Init(CHARGE_IN_GPIO_PORT, &GPIO_InitStructure); + + 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); +} + + +void DeInit_battery_charger_status_pins(void) +{ + #ifdef OSTC_ON_DISCOVERY_HARDWARE + return; + #endif + GPIO_InitTypeDef GPIO_InitStructure; + + + GPIO_InitStructure.Mode = GPIO_MODE_ANALOG; + GPIO_InitStructure.Speed = GPIO_SPEED_LOW; + GPIO_InitStructure.Pull = GPIO_NOPULL; + + GPIO_InitStructure.Pin = CHARGE_IN_PIN; + HAL_GPIO_Init(CHARGE_IN_GPIO_PORT, &GPIO_InitStructure); + + GPIO_InitStructure.Pin = CHARGE_OUT_PIN; + 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 inSleepModeLessCounts) +{ + #ifdef OSTC_ON_DISCOVERY_HARDWARE + return; + #endif + + /* 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((inSleepModeLessCounts && (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(!inSleepModeLessCounts) + 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((inSleepModeLessCounts && (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); +} + +/************************ (C) COPYRIGHT heinrichs weikamp *****END OF FILE****/