Mercurial > public > ostc4
diff Small_CPU/Src/batteryGasGauge.c @ 38:5f11787b4f42
include in ostc4 repository
author | heinrichsweikamp |
---|---|
date | Sat, 28 Apr 2018 11:52:34 +0200 |
parents | |
children | f9ba924d188e |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Small_CPU/Src/batteryGasGauge.c Sat Apr 28 11:52:34 2018 +0200 @@ -0,0 +1,134 @@ +/** + ****************************************************************************** + * @file batteryGasGauge.c + * @author heinrichs weikamp gmbh + * @version V0.0.1 + * @date 09-Dec-2014 + * @brief LTC2942 Battery Gas Gauge + * + @verbatim + ============================================================================== + ##### stm32f4xx_hal_i2c.c modification ##### + ============================================================================== + The LTC2942 requires an repeated start condition without stop condition + for data reception. + + @endverbatim + ****************************************************************************** + * @attention + * + * <h2><center>© COPYRIGHT(c) 2014 heinrichs weikamp</center></h2> + * + ****************************************************************************** + */ +/* Includes ------------------------------------------------------------------*/ +#include "batteryGasGauge.h" +#include "baseCPU2.h" +#include "stm32f4xx_hal.h" +#include "i2c.h" + +float battery_f_voltage = 0; +float battery_f_charge_percent = 0; + +#define BGG_BATTERY_OFFSET (26123) //; 65536-(3,35Ah/0,085mAh) +#define BGG_BATTERY_DEVIDER (394) //; 3,35Ah/0,085mAh/100 [%] + +float get_voltage(void) +{ +#ifdef OSTC_ON_DISCOVERY_HARDWARE + return 3.0f; +#endif + + return battery_f_voltage; +} + + +float get_charge(void) +{ + #ifdef OSTC_ON_DISCOVERY_HARDWARE + return 100.0f; + #endif + + return battery_f_charge_percent; +} + + +void init_battery_gas_gauge(void) +{ + #ifdef OSTC_ON_DISCOVERY_HARDWARE + return; + #endif + + uint8_t buffer[2]; + buffer[0] = 0x01; + buffer[1] = 0xF8;// true: F8 = 11111000, wrong/old comment: 11101000 + I2C_Master_Transmit( DEVICE_BATTERYGAUGE, buffer, 2); +} + + +void battery_gas_gauge_get_data(void) +{ + #ifdef OSTC_ON_DISCOVERY_HARDWARE + return; + #endif + + float battery_f_voltage_local; + float battery_f_charge_percent_local; + + uint8_t bufferReceive[10]; + I2C_Master_Receive( DEVICE_BATTERYGAUGE, bufferReceive, 10); + + battery_f_voltage_local = (float)(bufferReceive[8] * 256); + battery_f_voltage_local += (float)(bufferReceive[9]); + battery_f_voltage_local *= (float)6 / (float)0xFFFF; + + // max/full: 0.085 mAh * 1 * 65535 = 5570 mAh + battery_f_charge_percent_local = (float)(bufferReceive[2] * 256); + battery_f_charge_percent_local += (float)(bufferReceive[3]); + battery_f_charge_percent_local -= BGG_BATTERY_OFFSET; + battery_f_charge_percent_local /= BGG_BATTERY_DEVIDER; + + if(battery_f_charge_percent_local < 0) + battery_f_charge_percent_local = 0; + + battery_f_voltage = battery_f_voltage_local; + battery_f_charge_percent = battery_f_charge_percent_local; +} + + +void battery_gas_gauge_set_charge_full(void) +{ + #ifdef OSTC_ON_DISCOVERY_HARDWARE + return; + #endif + + uint8_t bufferSend[3]; + bufferSend[0] = 0x02; + bufferSend[1] = 0xFF; + bufferSend[2] = 0xFF; + I2C_Master_Transmit( DEVICE_BATTERYGAUGE, bufferSend, 3); +} + + +void battery_gas_gauge_set(float percentage) +{ + #ifdef OSTC_ON_DISCOVERY_HARDWARE + return; + #endif + + uint16_t mAhSend; + + if(percentage >= 100) + mAhSend = 0xFFFF; + else + mAhSend = (uint16_t)(percentage * 655.35f); + + uint8_t bufferSend[3]; + bufferSend[0] = 0x02; + bufferSend[1] = (uint8_t)(mAhSend / 256); + bufferSend[2] = (uint8_t)(mAhSend & 0xFF); + I2C_Master_Transmit( DEVICE_BATTERYGAUGE, bufferSend, 3); +} + + +/************************ (C) COPYRIGHT heinrichs weikamp *****END OF FILE****/