Mercurial > public > ostc4
comparison 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 |
comparison
equal
deleted
inserted
replaced
| 37:ccc45c0e1ea2 | 38:5f11787b4f42 |
|---|---|
| 1 /** | |
| 2 ****************************************************************************** | |
| 3 * @file batteryCharger.c | |
| 4 * @author heinrichs weikamp gmbh | |
| 5 * @date 09-Dec-2014 | |
| 6 * @version V0.0.1 | |
| 7 * @since 09-Dec-2014 | |
| 8 * @brief LTC4054 Battery Charger | |
| 9 * | |
| 10 @verbatim | |
| 11 ============================================================================== | |
| 12 ##### How to use ##### | |
| 13 ============================================================================== | |
| 14 | |
| 15 The bq5105x provides one status output, CHG. This output is an open-drain NMOS device that is rated to 20 V. | |
| 16 The open-drain FET connected to the CHG pin will be turned on whenever the output (BAT) of the charger is | |
| 17 enabled. As a note, the output of the charger supply will not be enabled if the VRECT-REG does not converge to the | |
| 18 no-load target voltage. | |
| 19 | |
| 20 CHG F4 7 O Open-drain output – active when BAT is enabled. Float if not used. | |
| 21 | |
| 22 @endverbatim | |
| 23 ****************************************************************************** | |
| 24 * @attention | |
| 25 * | |
| 26 * <h2><center>© COPYRIGHT(c) 2015 heinrichs weikamp</center></h2> | |
| 27 * | |
| 28 ****************************************************************************** | |
| 29 */ | |
| 30 /* Includes ------------------------------------------------------------------*/ | |
| 31 #include "batteryCharger.h" | |
| 32 #include "batteryGasGauge.h" | |
| 33 #include "stm32f4xx_hal.h" | |
| 34 #include "scheduler.h" | |
| 35 | |
| 36 | |
| 37 #define CHARGE_IN_PIN GPIO_PIN_2 | |
| 38 #define CHARGE_IN_GPIO_PORT GPIOC | |
| 39 #define CHARGE_IN_GPIO_ENABLE() __GPIOC_CLK_ENABLE() | |
| 40 | |
| 41 #define CHARGE_OUT_PIN GPIO_PIN_1 | |
| 42 #define CHARGE_OUT_GPIO_PORT GPIOC | |
| 43 #define CHARGE_OUT_GPIO_ENABLE() __GPIOC_CLK_ENABLE() | |
| 44 | |
| 45 | |
| 46 uint8_t battery_i_charge_status = 0; | |
| 47 uint8_t battery_charger_counter = 0; | |
| 48 | |
| 49 /* can be 0, 1 or 255 | |
| 50 * 0 is disconnected | |
| 51 * 1 is charging | |
| 52 * 255 is full | |
| 53 */ | |
| 54 uint8_t get_charge_status(void) | |
| 55 { | |
| 56 return battery_i_charge_status; | |
| 57 } | |
| 58 | |
| 59 void init_battery_charger_status(void) | |
| 60 { | |
| 61 #ifdef OSTC_ON_DISCOVERY_HARDWARE | |
| 62 return; | |
| 63 #endif | |
| 64 | |
| 65 CHARGE_IN_GPIO_ENABLE(); | |
| 66 CHARGE_OUT_GPIO_ENABLE(); | |
| 67 | |
| 68 ReInit_battery_charger_status_pins(); | |
| 69 } | |
| 70 | |
| 71 void ReInit_battery_charger_status_pins(void) | |
| 72 { | |
| 73 #ifdef OSTC_ON_DISCOVERY_HARDWARE | |
| 74 return; | |
| 75 #endif | |
| 76 | |
| 77 GPIO_InitTypeDef GPIO_InitStructure; | |
| 78 | |
| 79 GPIO_InitStructure.Pin = CHARGE_IN_PIN; | |
| 80 GPIO_InitStructure.Mode = GPIO_MODE_INPUT; | |
| 81 GPIO_InitStructure.Pull = GPIO_NOPULL; | |
| 82 GPIO_InitStructure.Speed = GPIO_SPEED_LOW; | |
| 83 HAL_GPIO_Init(CHARGE_IN_GPIO_PORT, &GPIO_InitStructure); | |
| 84 | |
| 85 GPIO_InitStructure.Pin = CHARGE_OUT_PIN; | |
| 86 GPIO_InitStructure.Mode = GPIO_MODE_ANALOG; | |
| 87 GPIO_InitStructure.Pull = GPIO_NOPULL; | |
| 88 GPIO_InitStructure.Speed = GPIO_SPEED_LOW; | |
| 89 HAL_GPIO_Init(CHARGE_OUT_GPIO_PORT, &GPIO_InitStructure); | |
| 90 } | |
| 91 | |
| 92 | |
| 93 void DeInit_battery_charger_status_pins(void) | |
| 94 { | |
| 95 #ifdef OSTC_ON_DISCOVERY_HARDWARE | |
| 96 return; | |
| 97 #endif | |
| 98 GPIO_InitTypeDef GPIO_InitStructure; | |
| 99 | |
| 100 | |
| 101 GPIO_InitStructure.Mode = GPIO_MODE_ANALOG; | |
| 102 GPIO_InitStructure.Speed = GPIO_SPEED_LOW; | |
| 103 GPIO_InitStructure.Pull = GPIO_NOPULL; | |
| 104 | |
| 105 GPIO_InitStructure.Pin = CHARGE_IN_PIN; | |
| 106 HAL_GPIO_Init(CHARGE_IN_GPIO_PORT, &GPIO_InitStructure); | |
| 107 | |
| 108 GPIO_InitStructure.Pin = CHARGE_OUT_PIN; | |
| 109 HAL_GPIO_Init(CHARGE_OUT_GPIO_PORT, &GPIO_InitStructure); | |
| 110 } | |
| 111 | |
| 112 /* static counter is used to avoid multiple counts of charge startings | |
| 113 and after that it is used, starting at 127 to count for the charge full signal | |
| 114 | |
| 115 there a short disconnections with the QI charger | |
| 116 therefore the battery_charger_counter has a countdown instead of = 0. | |
| 117 | |
| 118 battery_gas_gauge_set_charge_full and scheduleUpdateDeviceDataChargerFull are | |
| 119 set after disconnection as the charging process continues as long as not disconnected | |
| 120 to prevent the short disconnections the battery_charger_counter is used too including | |
| 121 upcounting again while battery_i_charge_status == 255 and the connection is established | |
| 122 | |
| 123 */ | |
| 124 | |
| 125 void battery_charger_get_status_and_contral_battery_gas_gauge(uint8_t inSleepModeLessCounts) | |
| 126 { | |
| 127 #ifdef OSTC_ON_DISCOVERY_HARDWARE | |
| 128 return; | |
| 129 #endif | |
| 130 | |
| 131 /* on disconnection or while disconnected */ | |
| 132 if(HAL_GPIO_ReadPin(CHARGE_IN_GPIO_PORT,CHARGE_IN_PIN)) | |
| 133 { | |
| 134 if(battery_charger_counter) | |
| 135 { | |
| 136 battery_charger_counter--; | |
| 137 global.dataSendToMaster.chargeStatus = CHARGER_lostConnection; | |
| 138 global.deviceDataSendToMaster.chargeStatus = CHARGER_lostConnection; | |
| 139 } | |
| 140 /* max count down to 127+5 or 127+20 */ | |
| 141 if((battery_i_charge_status == 255) && battery_charger_counter < 127) | |
| 142 { | |
| 143 // battery_gas_gauge_set_charge_full(); | |
| 144 // scheduleUpdateDeviceDataChargerFull(); | |
| 145 battery_charger_counter = 0; | |
| 146 } | |
| 147 | |
| 148 if(battery_charger_counter == 0) | |
| 149 { | |
| 150 battery_i_charge_status = 0; | |
| 151 global.dataSendToMaster.chargeStatus = CHARGER_off; | |
| 152 global.deviceDataSendToMaster.chargeStatus = CHARGER_off; | |
| 153 | |
| 154 } | |
| 155 return; | |
| 156 } | |
| 157 | |
| 158 /* connected */ | |
| 159 | |
| 160 /* wait for disconnection to write and reset */ | |
| 161 if(battery_i_charge_status == 255) | |
| 162 { | |
| 163 global.dataSendToMaster.chargeStatus = CHARGER_complete; | |
| 164 global.deviceDataSendToMaster.chargeStatus = CHARGER_complete; | |
| 165 | |
| 166 if((inSleepModeLessCounts && (battery_charger_counter < 127+5)) || (battery_charger_counter < 127+20)) | |
| 167 battery_charger_counter++; | |
| 168 return; | |
| 169 } | |
| 170 | |
| 171 if(battery_charger_counter == 0) | |
| 172 battery_i_charge_status = 1; | |
| 173 | |
| 174 /* charger is connected and didn't signal full yet */ | |
| 175 global.dataSendToMaster.chargeStatus = CHARGER_running; | |
| 176 global.deviceDataSendToMaster.chargeStatus = CHARGER_running; | |
| 177 | |
| 178 GPIO_InitTypeDef GPIO_InitStructure; | |
| 179 GPIO_InitStructure.Pin = CHARGE_OUT_PIN; | |
| 180 GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; | |
| 181 GPIO_InitStructure.Pull = GPIO_NOPULL; | |
| 182 GPIO_InitStructure.Speed = GPIO_SPEED_LOW; | |
| 183 HAL_GPIO_Init(CHARGE_OUT_GPIO_PORT, &GPIO_InitStructure); | |
| 184 HAL_GPIO_WritePin(CHARGE_OUT_GPIO_PORT, CHARGE_OUT_PIN,GPIO_PIN_SET); | |
| 185 HAL_Delay(1); | |
| 186 | |
| 187 | |
| 188 if(battery_charger_counter < 120) | |
| 189 { | |
| 190 if(!inSleepModeLessCounts) | |
| 191 battery_charger_counter++; | |
| 192 else | |
| 193 { | |
| 194 battery_charger_counter += 30; | |
| 195 if(battery_charger_counter >= 127) | |
| 196 battery_charger_counter = 126; | |
| 197 } | |
| 198 } | |
| 199 else | |
| 200 if(battery_charger_counter < 127) | |
| 201 { | |
| 202 battery_charger_counter = 127; | |
| 203 if(battery_i_charge_status < 2) | |
| 204 { | |
| 205 battery_i_charge_status = 2; | |
| 206 scheduleUpdateDeviceDataChargerCharging(); | |
| 207 } | |
| 208 } | |
| 209 | |
| 210 if(battery_charger_counter >= 127) | |
| 211 { | |
| 212 if(HAL_GPIO_ReadPin(CHARGE_IN_GPIO_PORT,CHARGE_IN_PIN) || (get_voltage() >= 4.1f)) | |
| 213 { | |
| 214 battery_charger_counter++; | |
| 215 if((inSleepModeLessCounts && (battery_charger_counter > 127+5)) || (battery_charger_counter > 127+20)) | |
| 216 { | |
| 217 battery_charger_counter = 127; | |
| 218 if(get_voltage() >= 4.1f) | |
| 219 { | |
| 220 battery_i_charge_status = 255; | |
| 221 battery_gas_gauge_set_charge_full(); | |
| 222 scheduleUpdateDeviceDataChargerFull(); | |
| 223 } | |
| 224 } | |
| 225 } | |
| 226 else | |
| 227 battery_charger_counter = 127; | |
| 228 } | |
| 229 | |
| 230 GPIO_InitStructure.Pin = CHARGE_OUT_PIN; | |
| 231 GPIO_InitStructure.Mode = GPIO_MODE_ANALOG; | |
| 232 GPIO_InitStructure.Pull = GPIO_NOPULL; | |
| 233 GPIO_InitStructure.Speed = GPIO_SPEED_LOW; | |
| 234 HAL_GPIO_Init(CHARGE_OUT_GPIO_PORT, &GPIO_InitStructure); | |
| 235 } | |
| 236 | |
| 237 /************************ (C) COPYRIGHT heinrichs weikamp *****END OF FILE****/ |
