-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPowerShield.cpp
More file actions
157 lines (113 loc) · 3.07 KB
/
PowerShield.cpp
File metadata and controls
157 lines (113 loc) · 3.07 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
150
151
152
153
154
155
156
157
//
// PowerShield.cpp
// Library for the Particle Power Shield
// Based on original library published by Luca Dentella (http://www.lucadentella.it)
// Modified by Mohit Bhoite @ Particle Industries, Inc. July 2015
// Power Shield Documentation: http://docs.particle.io/photon/shields/#power-shield
// MAX17043 datasheet: http://datasheets.maximintegrated.com/en/ds/MAX17043-MAX17044.pdf
//
/*
-----[ ]-----
-|VIN 3V3|-
-|GND RST|-
-|TX VBAT|-
-|RX GND|-
-|WKP D7|-
-|DAC D6|-
-|A5 D5|-
-|A4 D4|-
-|A3 D3|- ALERT interrupt from MAX17043 (optional solder bridge)
-|A2 D2|-
-|A1 D1|- SCL |- MAX17043 connected to the I2C channel with address 0x36
-|A0 D0|- SDA |
\____________/
*/
#include "PowerShield.h"
PowerShield::PowerShield()
{
}
boolean PowerShield::begin()
{
Wire.begin();
return 1;
}
// Read and return the cell voltage
float PowerShield::getVCell() {
byte MSB = 0;
byte LSB = 0;
readRegister(VCELL_REGISTER, MSB, LSB);
int value = (MSB << 4) | (LSB >> 4);
return map(value, 0x000, 0xFFF, 0, 50000) / 10000.0;
//return value * 0.00125;
}
// Read and return the state of charge of the cell
float PowerShield::getSoC() {
byte MSB = 0;
byte LSB = 0;
readRegister(SOC_REGISTER, MSB, LSB);
float decimal = LSB / 256.0;
return MSB + decimal;
}
// Return the version number of the chip
int PowerShield::getVersion() {
byte MSB = 0;
byte LSB = 0;
readRegister(VERSION_REGISTER, MSB, LSB);
return (MSB << 8) | LSB;
}
byte PowerShield::getCompensateValue() {
byte MSB = 0;
byte LSB = 0;
readConfigRegister(MSB, LSB);
return MSB;
}
byte PowerShield::getAlertThreshold() {
byte MSB = 0;
byte LSB = 0;
readConfigRegister(MSB, LSB);
return 32 - (LSB & 0x1F);
}
void PowerShield::setAlertThreshold(byte threshold) {
byte MSB = 0;
byte LSB = 0;
readConfigRegister(MSB, LSB);
if(threshold > 32) threshold = 32;
threshold = 32 - threshold;
writeRegister(CONFIG_REGISTER, MSB, (LSB & 0xE0) | threshold);
}
// Check if alert interrupt was generated
boolean PowerShield::getAlert() {
byte MSB = 0;
byte LSB = 0;
readConfigRegister(MSB, LSB);
return LSB & 0x20;
}
void PowerShield::clearAlert() {
byte MSB = 0;
byte LSB = 0;
readConfigRegister(MSB, LSB);
}
void PowerShield::reset() {
writeRegister(COMMAND_REGISTER, 0x00, 0x54);
}
void PowerShield::quickStart() {
writeRegister(MODE_REGISTER, 0x40, 0x00);
}
void PowerShield::readConfigRegister(byte &MSB, byte &LSB) {
readRegister(CONFIG_REGISTER, MSB, LSB);
}
void PowerShield::readRegister(byte startAddress, byte &MSB, byte &LSB) {
Wire.beginTransmission(MAX17043_ADDRESS);
Wire.write(startAddress);
Wire.endTransmission();
Wire.requestFrom(MAX17043_ADDRESS, 2);
MSB = Wire.read();
LSB = Wire.read();
}
void PowerShield::writeRegister(byte address, byte MSB, byte LSB) {
Wire.beginTransmission(MAX17043_ADDRESS);
Wire.write(address);
Wire.write(MSB);
Wire.write(LSB);
Wire.endTransmission();
}