-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathLC709203F.py
More file actions
149 lines (131 loc) · 5.66 KB
/
LC709203F.py
File metadata and controls
149 lines (131 loc) · 5.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
import time
import machine
CRC_TABLE = bytearray([
0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15,
0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D,
0x70, 0x77, 0x7E, 0x79, 0x6C, 0x6B, 0x62, 0x65,
0x48, 0x4F, 0x46, 0x41, 0x54, 0x53, 0x5A, 0x5D,
0xE0, 0xE7, 0xEE, 0xE9, 0xFC, 0xFB, 0xF2, 0xF5,
0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA, 0xCD,
0x90, 0x97, 0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85,
0xA8, 0xAF, 0xA6, 0xA1, 0xB4, 0xB3, 0xBA, 0xBD,
0xC7, 0xC0, 0xC9, 0xCE, 0xDB, 0xDC, 0xD5, 0xD2,
0xFF, 0xF8, 0xF1, 0xF6, 0xE3, 0xE4, 0xED, 0xEA,
0xB7, 0xB0, 0xB9, 0xBE, 0xAB, 0xAC, 0xA5, 0xA2,
0x8F, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9D, 0x9A,
0x27, 0x20, 0x29, 0x2E, 0x3B, 0x3C, 0x35, 0x32,
0x1F, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0D, 0x0A,
0x57, 0x50, 0x59, 0x5E, 0x4B, 0x4C, 0x45, 0x42,
0x6F, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7D, 0x7A,
0x89, 0x8E, 0x87, 0x80, 0x95, 0x92, 0x9B, 0x9C,
0xB1, 0xB6, 0xBF, 0xB8, 0xAD, 0xAA, 0xA3, 0xA4,
0xF9, 0xFE, 0xF7, 0xF0, 0xE5, 0xE2, 0xEB, 0xEC,
0xC1, 0xC6, 0xCF, 0xC8, 0xDD, 0xDA, 0xD3, 0xD4,
0x69, 0x6E, 0x67, 0x60, 0x75, 0x72, 0x7B, 0x7C,
0x51, 0x56, 0x5F, 0x58, 0x4D, 0x4A, 0x43, 0x44,
0x19, 0x1E, 0x17, 0x10, 0x05, 0x02, 0x0B, 0x0C,
0x21, 0x26, 0x2F, 0x28, 0x3D, 0x3A, 0x33, 0x34,
0x4E, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5C, 0x5B,
0x76, 0x71, 0x78, 0x7F, 0x6A, 0x6D, 0x64, 0x63,
0x3E, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2C, 0x2B,
0x06, 0x01, 0x08, 0x0F, 0x1A, 0x1D, 0x14, 0x13,
0xAE, 0xA9, 0xA0, 0xA7, 0xB2, 0xB5, 0xBC, 0xBB,
0x96, 0x91, 0x98, 0x9F, 0x8A, 0x8D, 0x84, 0x83,
0xDE, 0xD9, 0xD0, 0xD7, 0xC2, 0xC5, 0xCC, 0xCB,
0xE6, 0xE1, 0xE8, 0xEF, 0xFA, 0xFD, 0xF4, 0xF3
])
LC709203F_ADDRESS = 0x0b
LC709203F_INIT_RSOC = 0x07
LC709203F_REG_TEMP = 0x08
LC709203F_REG_CELL_VOLT = 0x09
LC709203F_REG_APA = 0x0b
LC709203F_REG_RSOC = 0x0d
LC709203F_REG_BAT_PROF = 0x12
LC709203F_REG_POWER = 0x15
LC709203F_REG_TEMP_METH = 0x16
LC709203F_REG_CURR_DIR = 0x0A
LC709203F_REG_ITE = 0x0F
"""
________________________________________________________
|Design Capacity of Battery APA(0x0B) |
|--------------------------------------------------------|
| | Type−01,Type−03 | Type−06 | Type−07 |
|--------------------------------------------------------|
|100 mAh | 0x08 | 0x0D | 0x07 |
|200 mAh | 0x0B | 0x15 | 0x0C |
|500 mAh | 0x10 | 0x20 | 0x18 |
|1000 mAh| 0x19 | − | 0x28 |
|2000 mAh| 0x2D | − | 0x40 |
|3000 mAh| 0x36 | − | 0x4D |
----------------------------------------------------------
________________________________________
|Design Capacity of Battery APA(0x0B) |
|----------------------------------------|
| | Type−04 | Type−05 |
|2600 mAh| 0x1A | 0x0D |
------------------------------------------
"""
class BatteryMonitor:
def __init__(self, bus, battery_profile=0x0504, capacity=0x001A):
self.i2c = bus
self._writeReg16(LC709203F_ADDRESS, LC709203F_REG_POWER, 0x0001)
self._writeReg16(LC709203F_ADDRESS, LC709203F_REG_APA, capacity)
self._writeReg16(LC709203F_ADDRESS, LC709203F_REG_BAT_PROF, battery_profile)
self._writeReg16(LC709203F_ADDRESS, LC709203F_INIT_RSOC, 0xAA55)
self._writeReg16(LC709203F_ADDRESS, LC709203F_REG_TEMP_METH, 0x0000)
self._writeReg16(LC709203F_ADDRESS, LC709203F_REG_CURR_DIR, 0x0000)
self._writeReg16(LC709203F_ADDRESS, LC709203F_REG_TEMP, 0x0BA6)
def _crc8(self, data):
val = 0
for pos in data:
val = CRC_TABLE[val ^ pos]
return val
def _writeReg16(self, devAddress, regAddress, data):
# Setup array to hold bytes to send including CRC-8
cmd = bytearray(5)
cmd[0] = 0x16
cmd[1] = regAddress
cmd[2] = (data & 0x00FF)
cmd[3] = (data & 0xFF00) >> 8
cmd[4] = self._crc8(cmd[:4])
self.i2c.writeto_mem(devAddress, regAddress, cmd[3:])
def _readReg16(self, devAddress, regAddress):
data = int.from_bytes(self.i2c.readfrom_mem(devAddress, regAddress, 2), 'little') & 0xFFFF
return data
def getBatteryVoltage(self):
data = self._readReg16(LC709203F_ADDRESS, LC709203F_REG_CELL_VOLT)
return data/1000
def getCurrentDirection(self):
data = self._readReg16(LC709203F_ADDRESS, LC709203F_REG_CURR_DIR)
if data == 0x0001:
return "Charge"
if data == 0xffff:
return "Discharge"
if data == 0:
return "Auto"
def getCapacity(self):
data = self._readReg16(LC709203F_ADDRESS, LC709203F_REG_RSOC)
return data
def getEmpty(self):
data = self._readReg16(LC709203F_ADDRESS, LC709203F_REG_ITE)
return data/10
def getVersion(self):
data = self._readReg16(LC709203F_ADDRESS, 0x0011)
return data
def sleep(self):
self._writeReg16(LC709203F_ADDRESS, LC709203F_REG_POWER, 0x0002)
def wakeup(self):
self._writeReg16(LC709203F_ADDRESS, LC709203F_REG_POWER, 0x0001)
def selfTest(self):
print("Go to sleep...")
self.sleep()
time.sleep(4)
print("WakeUp...")
self.wakeup()
time.sleep(0.5)
print("IC Version: ", self.getVersion())
print("Batt. Volt: ", self.getBatteryVoltage())
print("Batt. Residual Cap.", self.getCapacity())
print("Batt. Empty", self.getEmpty())
print("Direction: ", self.getCurrentDirection())
print("Good!")