38
+ − 1 /**
+ − 2 ******************************************************************************
+ − 3 * @file batteryGasGauge.c
+ − 4 * @author heinrichs weikamp gmbh
+ − 5 * @version V0.0.1
+ − 6 * @date 09-Dec-2014
+ − 7 * @brief LTC2942 Battery Gas Gauge
+ − 8 *
+ − 9 @verbatim
+ − 10 ==============================================================================
+ − 11 ##### stm32f4xx_hal_i2c.c modification #####
+ − 12 ==============================================================================
+ − 13 The LTC2942 requires an repeated start condition without stop condition
+ − 14 for data reception.
+ − 15
+ − 16 @endverbatim
+ − 17 ******************************************************************************
+ − 18 * @attention
+ − 19 *
+ − 20 * <h2><center>© COPYRIGHT(c) 2014 heinrichs weikamp</center></h2>
+ − 21 *
+ − 22 ******************************************************************************
+ − 23 */
+ − 24 /* Includes ------------------------------------------------------------------*/
+ − 25 #include "batteryGasGauge.h"
+ − 26 #include "baseCPU2.h"
+ − 27 #include "stm32f4xx_hal.h"
+ − 28 #include "i2c.h"
+ − 29
+ − 30 float battery_f_voltage = 0;
+ − 31 float battery_f_charge_percent = 0;
+ − 32
+ − 33 #define BGG_BATTERY_OFFSET (26123) //; 65536-(3,35Ah/0,085mAh)
+ − 34 #define BGG_BATTERY_DEVIDER (394) //; 3,35Ah/0,085mAh/100 [%]
+ − 35
+ − 36 float get_voltage(void)
+ − 37 {
+ − 38 #ifdef OSTC_ON_DISCOVERY_HARDWARE
+ − 39 return 3.0f;
+ − 40 #endif
+ − 41
+ − 42 return battery_f_voltage;
+ − 43 }
+ − 44
+ − 45
+ − 46 float get_charge(void)
+ − 47 {
+ − 48 #ifdef OSTC_ON_DISCOVERY_HARDWARE
+ − 49 return 100.0f;
+ − 50 #endif
+ − 51
+ − 52 return battery_f_charge_percent;
+ − 53 }
+ − 54
+ − 55
+ − 56 void init_battery_gas_gauge(void)
+ − 57 {
+ − 58 #ifdef OSTC_ON_DISCOVERY_HARDWARE
+ − 59 return;
+ − 60 #endif
+ − 61
+ − 62 uint8_t buffer[2];
+ − 63 buffer[0] = 0x01;
+ − 64 buffer[1] = 0xF8;// true: F8 = 11111000, wrong/old comment: 11101000
+ − 65 I2C_Master_Transmit( DEVICE_BATTERYGAUGE, buffer, 2);
+ − 66 }
+ − 67
+ − 68
+ − 69 void battery_gas_gauge_get_data(void)
+ − 70 {
+ − 71 #ifdef OSTC_ON_DISCOVERY_HARDWARE
+ − 72 return;
+ − 73 #endif
+ − 74
+ − 75 float battery_f_voltage_local;
+ − 76 float battery_f_charge_percent_local;
+ − 77
+ − 78 uint8_t bufferReceive[10];
+ − 79 I2C_Master_Receive( DEVICE_BATTERYGAUGE, bufferReceive, 10);
+ − 80
+ − 81 battery_f_voltage_local = (float)(bufferReceive[8] * 256);
+ − 82 battery_f_voltage_local += (float)(bufferReceive[9]);
+ − 83 battery_f_voltage_local *= (float)6 / (float)0xFFFF;
+ − 84
+ − 85 // max/full: 0.085 mAh * 1 * 65535 = 5570 mAh
+ − 86 battery_f_charge_percent_local = (float)(bufferReceive[2] * 256);
+ − 87 battery_f_charge_percent_local += (float)(bufferReceive[3]);
+ − 88 battery_f_charge_percent_local -= BGG_BATTERY_OFFSET;
+ − 89 battery_f_charge_percent_local /= BGG_BATTERY_DEVIDER;
+ − 90
+ − 91 if(battery_f_charge_percent_local < 0)
+ − 92 battery_f_charge_percent_local = 0;
+ − 93
+ − 94 battery_f_voltage = battery_f_voltage_local;
+ − 95 battery_f_charge_percent = battery_f_charge_percent_local;
+ − 96 }
+ − 97
+ − 98
+ − 99 void battery_gas_gauge_set_charge_full(void)
+ − 100 {
+ − 101 #ifdef OSTC_ON_DISCOVERY_HARDWARE
+ − 102 return;
+ − 103 #endif
+ − 104
+ − 105 uint8_t bufferSend[3];
+ − 106 bufferSend[0] = 0x02;
+ − 107 bufferSend[1] = 0xFF;
+ − 108 bufferSend[2] = 0xFF;
+ − 109 I2C_Master_Transmit( DEVICE_BATTERYGAUGE, bufferSend, 3);
+ − 110 }
+ − 111
+ − 112
+ − 113 void battery_gas_gauge_set(float percentage)
+ − 114 {
+ − 115 #ifdef OSTC_ON_DISCOVERY_HARDWARE
+ − 116 return;
+ − 117 #endif
+ − 118
+ − 119 uint16_t mAhSend;
+ − 120
+ − 121 if(percentage >= 100)
+ − 122 mAhSend = 0xFFFF;
+ − 123 else
+ − 124 mAhSend = (uint16_t)(percentage * 655.35f);
+ − 125
+ − 126 uint8_t bufferSend[3];
+ − 127 bufferSend[0] = 0x02;
+ − 128 bufferSend[1] = (uint8_t)(mAhSend / 256);
+ − 129 bufferSend[2] = (uint8_t)(mAhSend & 0xFF);
+ − 130 I2C_Master_Transmit( DEVICE_BATTERYGAUGE, bufferSend, 3);
+ − 131 }
+ − 132
+ − 133
+ − 134 /************************ (C) COPYRIGHT heinrichs weikamp *****END OF FILE****/