A feature complete driver for the MAX17048 lithium fuel gauge from Maxim.
Dependents: MAX17048_HelloWorld ECGAFE_copy MAX17048_HelloWorld Orion_newPCB_test_LV ... more
Now fully tested!
MAX17048.cpp@2:0a98e081b48c, 2013-08-14 (annotated)
- Committer:
- neilt6
- Date:
- Wed Aug 14 04:52:16 2013 +0000
- Revision:
- 2:0a98e081b48c
- Parent:
- 0:abc480f8eeab
- Child:
- 3:32087cca331f
Modified library so as to be more compliant with C++ conventions
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
neilt6 | 0:abc480f8eeab | 1 | /* MAX17048 Driver Library |
neilt6 | 0:abc480f8eeab | 2 | * Copyright (c) 2013 Neil Thiessen |
neilt6 | 0:abc480f8eeab | 3 | * |
neilt6 | 0:abc480f8eeab | 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
neilt6 | 0:abc480f8eeab | 5 | * you may not use this file except in compliance with the License. |
neilt6 | 0:abc480f8eeab | 6 | * You may obtain a copy of the License at |
neilt6 | 0:abc480f8eeab | 7 | * |
neilt6 | 0:abc480f8eeab | 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
neilt6 | 0:abc480f8eeab | 9 | * |
neilt6 | 0:abc480f8eeab | 10 | * Unless required by applicable law or agreed to in writing, software |
neilt6 | 0:abc480f8eeab | 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
neilt6 | 0:abc480f8eeab | 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
neilt6 | 0:abc480f8eeab | 13 | * See the License for the specific language governing permissions and |
neilt6 | 0:abc480f8eeab | 14 | * limitations under the License. |
neilt6 | 0:abc480f8eeab | 15 | */ |
neilt6 | 0:abc480f8eeab | 16 | |
neilt6 | 0:abc480f8eeab | 17 | #include "MAX17048.h" |
neilt6 | 0:abc480f8eeab | 18 | #include "mbed.h" |
neilt6 | 0:abc480f8eeab | 19 | |
neilt6 | 2:0a98e081b48c | 20 | MAX17048::MAX17048(PinName sda, PinName scl) : m_I2C(sda, scl) |
neilt6 | 0:abc480f8eeab | 21 | { |
neilt6 | 0:abc480f8eeab | 22 | //Nothing else to initialize |
neilt6 | 0:abc480f8eeab | 23 | } |
neilt6 | 0:abc480f8eeab | 24 | |
neilt6 | 0:abc480f8eeab | 25 | void MAX17048::reset(void) |
neilt6 | 0:abc480f8eeab | 26 | { |
neilt6 | 0:abc480f8eeab | 27 | //Write the POR command |
neilt6 | 2:0a98e081b48c | 28 | write(REG_CMD, 0x5400); |
neilt6 | 0:abc480f8eeab | 29 | } |
neilt6 | 0:abc480f8eeab | 30 | |
neilt6 | 0:abc480f8eeab | 31 | void MAX17048::quickStart(void) |
neilt6 | 0:abc480f8eeab | 32 | { |
neilt6 | 0:abc480f8eeab | 33 | //Read the current 16-bit register value |
neilt6 | 2:0a98e081b48c | 34 | unsigned short value = read(REG_MODE); |
neilt6 | 0:abc480f8eeab | 35 | |
neilt6 | 0:abc480f8eeab | 36 | //Set the QuickStart bit |
neilt6 | 0:abc480f8eeab | 37 | value |= (1 << 14); |
neilt6 | 0:abc480f8eeab | 38 | |
neilt6 | 0:abc480f8eeab | 39 | //Write the value back out |
neilt6 | 2:0a98e081b48c | 40 | write(REG_MODE, value); |
neilt6 | 0:abc480f8eeab | 41 | } |
neilt6 | 0:abc480f8eeab | 42 | |
neilt6 | 2:0a98e081b48c | 43 | bool MAX17048::sleepEnabled(void) |
neilt6 | 0:abc480f8eeab | 44 | { |
neilt6 | 0:abc480f8eeab | 45 | //Read the 16-bit register value |
neilt6 | 2:0a98e081b48c | 46 | unsigned short value = read(REG_MODE); |
neilt6 | 0:abc480f8eeab | 47 | |
neilt6 | 0:abc480f8eeab | 48 | //Return the status of the EnSleep bit |
neilt6 | 0:abc480f8eeab | 49 | if (value & (1 << 13)) |
neilt6 | 0:abc480f8eeab | 50 | return true; |
neilt6 | 0:abc480f8eeab | 51 | else |
neilt6 | 0:abc480f8eeab | 52 | return false; |
neilt6 | 0:abc480f8eeab | 53 | } |
neilt6 | 0:abc480f8eeab | 54 | |
neilt6 | 2:0a98e081b48c | 55 | void MAX17048::sleepEnabled(bool enabled) |
neilt6 | 0:abc480f8eeab | 56 | { |
neilt6 | 0:abc480f8eeab | 57 | //Read the current 16-bit register value |
neilt6 | 2:0a98e081b48c | 58 | unsigned short value = read(REG_MODE); |
neilt6 | 0:abc480f8eeab | 59 | |
neilt6 | 0:abc480f8eeab | 60 | //Set or clear the EnSleep bit |
neilt6 | 0:abc480f8eeab | 61 | if (enabled) |
neilt6 | 0:abc480f8eeab | 62 | value |= (1 << 13); |
neilt6 | 0:abc480f8eeab | 63 | else |
neilt6 | 0:abc480f8eeab | 64 | value &= ~(1 << 13); |
neilt6 | 0:abc480f8eeab | 65 | |
neilt6 | 0:abc480f8eeab | 66 | //Write the value back out |
neilt6 | 2:0a98e081b48c | 67 | write(REG_MODE, value); |
neilt6 | 0:abc480f8eeab | 68 | } |
neilt6 | 0:abc480f8eeab | 69 | |
neilt6 | 2:0a98e081b48c | 70 | bool MAX17048::hibernating(void) |
neilt6 | 0:abc480f8eeab | 71 | { |
neilt6 | 0:abc480f8eeab | 72 | //Read the 16-bit register value |
neilt6 | 2:0a98e081b48c | 73 | unsigned short value = read(REG_MODE); |
neilt6 | 0:abc480f8eeab | 74 | |
neilt6 | 0:abc480f8eeab | 75 | //Return the status of the HibStat bit |
neilt6 | 0:abc480f8eeab | 76 | if (value & (1 << 12)) |
neilt6 | 0:abc480f8eeab | 77 | return true; |
neilt6 | 0:abc480f8eeab | 78 | else |
neilt6 | 0:abc480f8eeab | 79 | return false; |
neilt6 | 0:abc480f8eeab | 80 | } |
neilt6 | 0:abc480f8eeab | 81 | |
neilt6 | 2:0a98e081b48c | 82 | float MAX17048::hibernateThreshold(void) |
neilt6 | 0:abc480f8eeab | 83 | { |
neilt6 | 0:abc480f8eeab | 84 | //Read the 16-bit register value |
neilt6 | 2:0a98e081b48c | 85 | unsigned short value = read(REG_HIBRT); |
neilt6 | 0:abc480f8eeab | 86 | |
neilt6 | 0:abc480f8eeab | 87 | //Extract the hibernate threshold |
neilt6 | 0:abc480f8eeab | 88 | return (value >> 8) * 0.208; |
neilt6 | 0:abc480f8eeab | 89 | } |
neilt6 | 0:abc480f8eeab | 90 | |
neilt6 | 2:0a98e081b48c | 91 | void MAX17048::hibernateThreshold(float threshold) |
neilt6 | 0:abc480f8eeab | 92 | { |
neilt6 | 0:abc480f8eeab | 93 | //Read the current 16-bit register value |
neilt6 | 2:0a98e081b48c | 94 | unsigned short value = read(REG_HIBRT); |
neilt6 | 0:abc480f8eeab | 95 | |
neilt6 | 0:abc480f8eeab | 96 | //Mask off the old value |
neilt6 | 0:abc480f8eeab | 97 | value &= 0x00FF; |
neilt6 | 0:abc480f8eeab | 98 | |
neilt6 | 0:abc480f8eeab | 99 | //Do a smart update |
neilt6 | 0:abc480f8eeab | 100 | if (threshold > 0.0) { |
neilt6 | 0:abc480f8eeab | 101 | if (threshold < 53.04) |
neilt6 | 0:abc480f8eeab | 102 | value |= (unsigned short)(threshold / 0.208) << 8; |
neilt6 | 0:abc480f8eeab | 103 | else |
neilt6 | 0:abc480f8eeab | 104 | value |= 0xFF00; |
neilt6 | 0:abc480f8eeab | 105 | } |
neilt6 | 0:abc480f8eeab | 106 | |
neilt6 | 0:abc480f8eeab | 107 | //Write the 16-bit register |
neilt6 | 2:0a98e081b48c | 108 | write(REG_HIBRT, value); |
neilt6 | 0:abc480f8eeab | 109 | } |
neilt6 | 0:abc480f8eeab | 110 | |
neilt6 | 2:0a98e081b48c | 111 | float MAX17048::activeThreshold(void) |
neilt6 | 0:abc480f8eeab | 112 | { |
neilt6 | 0:abc480f8eeab | 113 | //Read the 16-bit register value |
neilt6 | 2:0a98e081b48c | 114 | unsigned short value = read(REG_HIBRT); |
neilt6 | 0:abc480f8eeab | 115 | |
neilt6 | 0:abc480f8eeab | 116 | //Extract the active threshold |
neilt6 | 0:abc480f8eeab | 117 | return (value & 0x00FF) * 0.00125; |
neilt6 | 0:abc480f8eeab | 118 | } |
neilt6 | 0:abc480f8eeab | 119 | |
neilt6 | 2:0a98e081b48c | 120 | void MAX17048::activeThreshold(float threshold) |
neilt6 | 0:abc480f8eeab | 121 | { |
neilt6 | 0:abc480f8eeab | 122 | //Read the current 16-bit register value |
neilt6 | 2:0a98e081b48c | 123 | unsigned short value = read(REG_HIBRT); |
neilt6 | 0:abc480f8eeab | 124 | |
neilt6 | 0:abc480f8eeab | 125 | //Mask off the old value |
neilt6 | 0:abc480f8eeab | 126 | value &= 0xFF00; |
neilt6 | 0:abc480f8eeab | 127 | |
neilt6 | 0:abc480f8eeab | 128 | //Do a smart update |
neilt6 | 0:abc480f8eeab | 129 | if (threshold > 0.0) { |
neilt6 | 0:abc480f8eeab | 130 | if (threshold < 0.31875) |
neilt6 | 0:abc480f8eeab | 131 | value |= (char)(threshold / 0.00125); |
neilt6 | 0:abc480f8eeab | 132 | else |
neilt6 | 0:abc480f8eeab | 133 | value |= 0x00FF; |
neilt6 | 0:abc480f8eeab | 134 | } |
neilt6 | 0:abc480f8eeab | 135 | |
neilt6 | 0:abc480f8eeab | 136 | //Write the 16-bit register |
neilt6 | 2:0a98e081b48c | 137 | write(REG_HIBRT, value); |
neilt6 | 0:abc480f8eeab | 138 | } |
neilt6 | 0:abc480f8eeab | 139 | |
neilt6 | 2:0a98e081b48c | 140 | unsigned short MAX17048::version(void) |
neilt6 | 0:abc480f8eeab | 141 | { |
neilt6 | 0:abc480f8eeab | 142 | //Return the 16-bit production version |
neilt6 | 2:0a98e081b48c | 143 | return read(REG_VERSION); |
neilt6 | 0:abc480f8eeab | 144 | } |
neilt6 | 0:abc480f8eeab | 145 | |
neilt6 | 2:0a98e081b48c | 146 | void MAX17048::tempCompensation(float temp) |
neilt6 | 0:abc480f8eeab | 147 | { |
neilt6 | 0:abc480f8eeab | 148 | //Calculate the new RCOMP value |
neilt6 | 0:abc480f8eeab | 149 | char rcomp; |
neilt6 | 0:abc480f8eeab | 150 | if (temp > 20.0) { |
neilt6 | 2:0a98e081b48c | 151 | rcomp = m_RCOMP0 + (temp - 20.0) * -0.5; |
neilt6 | 0:abc480f8eeab | 152 | } else { |
neilt6 | 2:0a98e081b48c | 153 | rcomp = m_RCOMP0 + (temp - 20.0) * -5.0; |
neilt6 | 0:abc480f8eeab | 154 | } |
neilt6 | 0:abc480f8eeab | 155 | |
neilt6 | 0:abc480f8eeab | 156 | //Update the RCOMP value |
neilt6 | 2:0a98e081b48c | 157 | writeRCOMP(rcomp); |
neilt6 | 0:abc480f8eeab | 158 | } |
neilt6 | 0:abc480f8eeab | 159 | |
neilt6 | 2:0a98e081b48c | 160 | bool MAX17048::sleeping(void) |
neilt6 | 0:abc480f8eeab | 161 | { |
neilt6 | 0:abc480f8eeab | 162 | //Read the 16-bit register value |
neilt6 | 2:0a98e081b48c | 163 | unsigned short value = read(REG_CONFIG); |
neilt6 | 0:abc480f8eeab | 164 | |
neilt6 | 0:abc480f8eeab | 165 | //Return the status of the SLEEP bit |
neilt6 | 0:abc480f8eeab | 166 | if (value & (1 << 7)) |
neilt6 | 0:abc480f8eeab | 167 | return true; |
neilt6 | 0:abc480f8eeab | 168 | else |
neilt6 | 0:abc480f8eeab | 169 | return false; |
neilt6 | 0:abc480f8eeab | 170 | } |
neilt6 | 0:abc480f8eeab | 171 | |
neilt6 | 2:0a98e081b48c | 172 | void MAX17048::sleep(bool sleep) |
neilt6 | 0:abc480f8eeab | 173 | { |
neilt6 | 0:abc480f8eeab | 174 | //Read the current 16-bit register value |
neilt6 | 2:0a98e081b48c | 175 | unsigned short value = read(REG_CONFIG); |
neilt6 | 0:abc480f8eeab | 176 | |
neilt6 | 0:abc480f8eeab | 177 | //Set or clear the SLEEP bit |
neilt6 | 0:abc480f8eeab | 178 | if (sleep) |
neilt6 | 0:abc480f8eeab | 179 | value |= (1 << 7); |
neilt6 | 0:abc480f8eeab | 180 | else |
neilt6 | 0:abc480f8eeab | 181 | value &= ~(1 << 7); |
neilt6 | 0:abc480f8eeab | 182 | |
neilt6 | 0:abc480f8eeab | 183 | //Write the value back out |
neilt6 | 2:0a98e081b48c | 184 | write(REG_CONFIG, value); |
neilt6 | 0:abc480f8eeab | 185 | } |
neilt6 | 0:abc480f8eeab | 186 | |
neilt6 | 2:0a98e081b48c | 187 | bool MAX17048::socChangeAlertEnabled(void) |
neilt6 | 0:abc480f8eeab | 188 | { |
neilt6 | 0:abc480f8eeab | 189 | //Read the 16-bit register value |
neilt6 | 2:0a98e081b48c | 190 | unsigned short value = read(REG_CONFIG); |
neilt6 | 0:abc480f8eeab | 191 | |
neilt6 | 0:abc480f8eeab | 192 | //Return the status of the ALSC bit |
neilt6 | 0:abc480f8eeab | 193 | if (value & (1 << 6)) |
neilt6 | 0:abc480f8eeab | 194 | return true; |
neilt6 | 0:abc480f8eeab | 195 | else |
neilt6 | 0:abc480f8eeab | 196 | return false; |
neilt6 | 0:abc480f8eeab | 197 | } |
neilt6 | 0:abc480f8eeab | 198 | |
neilt6 | 2:0a98e081b48c | 199 | void MAX17048::socChangeAlertEnabled(bool enabled) |
neilt6 | 0:abc480f8eeab | 200 | { |
neilt6 | 0:abc480f8eeab | 201 | //Read the current 16-bit register value |
neilt6 | 2:0a98e081b48c | 202 | unsigned short value = read(REG_CONFIG); |
neilt6 | 0:abc480f8eeab | 203 | |
neilt6 | 0:abc480f8eeab | 204 | //Set or clear the ALSC bit |
neilt6 | 0:abc480f8eeab | 205 | if (enabled) |
neilt6 | 0:abc480f8eeab | 206 | value |= (1 << 6); |
neilt6 | 0:abc480f8eeab | 207 | else |
neilt6 | 0:abc480f8eeab | 208 | value &= ~(1 << 6); |
neilt6 | 0:abc480f8eeab | 209 | |
neilt6 | 0:abc480f8eeab | 210 | //Write the value back out |
neilt6 | 2:0a98e081b48c | 211 | write(REG_CONFIG, value); |
neilt6 | 0:abc480f8eeab | 212 | } |
neilt6 | 0:abc480f8eeab | 213 | |
neilt6 | 2:0a98e081b48c | 214 | bool MAX17048::alerting(void) |
neilt6 | 0:abc480f8eeab | 215 | { |
neilt6 | 0:abc480f8eeab | 216 | //Read the 16-bit register value |
neilt6 | 2:0a98e081b48c | 217 | unsigned short value = read(REG_CONFIG); |
neilt6 | 0:abc480f8eeab | 218 | |
neilt6 | 0:abc480f8eeab | 219 | //Return the status of the ALRT bit |
neilt6 | 0:abc480f8eeab | 220 | if (value & (1 << 5)) |
neilt6 | 0:abc480f8eeab | 221 | return true; |
neilt6 | 0:abc480f8eeab | 222 | else |
neilt6 | 0:abc480f8eeab | 223 | return false; |
neilt6 | 0:abc480f8eeab | 224 | } |
neilt6 | 0:abc480f8eeab | 225 | |
neilt6 | 0:abc480f8eeab | 226 | void MAX17048::clearAlert(void) |
neilt6 | 0:abc480f8eeab | 227 | { |
neilt6 | 0:abc480f8eeab | 228 | //Read the current 16-bit register value |
neilt6 | 2:0a98e081b48c | 229 | unsigned short value = read(REG_CONFIG); |
neilt6 | 0:abc480f8eeab | 230 | |
neilt6 | 0:abc480f8eeab | 231 | //Clear the ALRT bit |
neilt6 | 0:abc480f8eeab | 232 | value &= ~(1 << 5); |
neilt6 | 0:abc480f8eeab | 233 | |
neilt6 | 0:abc480f8eeab | 234 | //Write the value back out |
neilt6 | 2:0a98e081b48c | 235 | write(REG_CONFIG, value); |
neilt6 | 0:abc480f8eeab | 236 | } |
neilt6 | 0:abc480f8eeab | 237 | |
neilt6 | 2:0a98e081b48c | 238 | char MAX17048::emptyAlertThreshold(void) |
neilt6 | 0:abc480f8eeab | 239 | { |
neilt6 | 0:abc480f8eeab | 240 | //Read the 16-bit register value |
neilt6 | 2:0a98e081b48c | 241 | unsigned short value = read(REG_CONFIG); |
neilt6 | 0:abc480f8eeab | 242 | |
neilt6 | 0:abc480f8eeab | 243 | //Extract the threshold |
neilt6 | 0:abc480f8eeab | 244 | return 32 - (value & 0x001F); |
neilt6 | 0:abc480f8eeab | 245 | } |
neilt6 | 0:abc480f8eeab | 246 | |
neilt6 | 2:0a98e081b48c | 247 | void MAX17048::emptyAlertThreshold(char threshold) |
neilt6 | 0:abc480f8eeab | 248 | { |
neilt6 | 0:abc480f8eeab | 249 | //Read the current 16-bit register value |
neilt6 | 2:0a98e081b48c | 250 | unsigned short value = read(REG_CONFIG); |
neilt6 | 0:abc480f8eeab | 251 | |
neilt6 | 0:abc480f8eeab | 252 | //Range check threshold |
neilt6 | 0:abc480f8eeab | 253 | if (threshold < 1) |
neilt6 | 0:abc480f8eeab | 254 | threshold = 1; |
neilt6 | 0:abc480f8eeab | 255 | else if (threshold > 32) |
neilt6 | 0:abc480f8eeab | 256 | threshold = 32; |
neilt6 | 0:abc480f8eeab | 257 | |
neilt6 | 0:abc480f8eeab | 258 | //Update the register value |
neilt6 | 0:abc480f8eeab | 259 | value &= 0xFFE0; |
neilt6 | 0:abc480f8eeab | 260 | value |= 32 - threshold; |
neilt6 | 0:abc480f8eeab | 261 | |
neilt6 | 0:abc480f8eeab | 262 | //Write the 16-bit register |
neilt6 | 2:0a98e081b48c | 263 | write(REG_CONFIG, value); |
neilt6 | 0:abc480f8eeab | 264 | } |
neilt6 | 0:abc480f8eeab | 265 | |
neilt6 | 2:0a98e081b48c | 266 | float MAX17048::vAlertMinThreshold(void) |
neilt6 | 0:abc480f8eeab | 267 | { |
neilt6 | 0:abc480f8eeab | 268 | //Read the 16-bit register value |
neilt6 | 2:0a98e081b48c | 269 | unsigned short value = read(REG_VALRT); |
neilt6 | 0:abc480f8eeab | 270 | |
neilt6 | 0:abc480f8eeab | 271 | //Extract the alert threshold |
neilt6 | 0:abc480f8eeab | 272 | return (value >> 8) * 0.02; |
neilt6 | 0:abc480f8eeab | 273 | } |
neilt6 | 0:abc480f8eeab | 274 | |
neilt6 | 2:0a98e081b48c | 275 | void MAX17048::vAlertMinThreshold(float threshold) |
neilt6 | 0:abc480f8eeab | 276 | { |
neilt6 | 0:abc480f8eeab | 277 | //Read the current 16-bit register value |
neilt6 | 2:0a98e081b48c | 278 | unsigned short value = read(REG_VALRT); |
neilt6 | 0:abc480f8eeab | 279 | |
neilt6 | 0:abc480f8eeab | 280 | //Mask off the old value |
neilt6 | 0:abc480f8eeab | 281 | value &= 0x00FF; |
neilt6 | 0:abc480f8eeab | 282 | |
neilt6 | 0:abc480f8eeab | 283 | //Do a smart update |
neilt6 | 0:abc480f8eeab | 284 | if (threshold > 0.0) { |
neilt6 | 0:abc480f8eeab | 285 | if (threshold < 5.1) |
neilt6 | 0:abc480f8eeab | 286 | value |= (unsigned short)(threshold / 0.02) << 8; |
neilt6 | 0:abc480f8eeab | 287 | else |
neilt6 | 0:abc480f8eeab | 288 | value |= 0xFF00; |
neilt6 | 0:abc480f8eeab | 289 | } |
neilt6 | 0:abc480f8eeab | 290 | |
neilt6 | 0:abc480f8eeab | 291 | //Write the 16-bit register |
neilt6 | 2:0a98e081b48c | 292 | write(REG_VALRT, value); |
neilt6 | 0:abc480f8eeab | 293 | } |
neilt6 | 0:abc480f8eeab | 294 | |
neilt6 | 2:0a98e081b48c | 295 | float MAX17048::vAlertMaxThreshold(void) |
neilt6 | 0:abc480f8eeab | 296 | { |
neilt6 | 0:abc480f8eeab | 297 | //Read the 16-bit register value |
neilt6 | 2:0a98e081b48c | 298 | unsigned short value = read(REG_VALRT); |
neilt6 | 0:abc480f8eeab | 299 | |
neilt6 | 0:abc480f8eeab | 300 | //Extract the active threshold |
neilt6 | 0:abc480f8eeab | 301 | return (value & 0x00FF) * 0.02; |
neilt6 | 0:abc480f8eeab | 302 | } |
neilt6 | 0:abc480f8eeab | 303 | |
neilt6 | 2:0a98e081b48c | 304 | void MAX17048::vAlertMaxThreshold(float threshold) |
neilt6 | 0:abc480f8eeab | 305 | { |
neilt6 | 0:abc480f8eeab | 306 | //Read the current 16-bit register value |
neilt6 | 2:0a98e081b48c | 307 | unsigned short value = read(REG_VALRT); |
neilt6 | 0:abc480f8eeab | 308 | |
neilt6 | 0:abc480f8eeab | 309 | //Mask off the old value |
neilt6 | 0:abc480f8eeab | 310 | value &= 0xFF00; |
neilt6 | 0:abc480f8eeab | 311 | |
neilt6 | 0:abc480f8eeab | 312 | //Do a smart update |
neilt6 | 0:abc480f8eeab | 313 | if (threshold > 0.0) { |
neilt6 | 0:abc480f8eeab | 314 | if (threshold < 5.1) |
neilt6 | 0:abc480f8eeab | 315 | value |= (char)(threshold / 0.02); |
neilt6 | 0:abc480f8eeab | 316 | else |
neilt6 | 0:abc480f8eeab | 317 | value |= 0x00FF; |
neilt6 | 0:abc480f8eeab | 318 | } |
neilt6 | 0:abc480f8eeab | 319 | |
neilt6 | 0:abc480f8eeab | 320 | //Write the 16-bit register |
neilt6 | 2:0a98e081b48c | 321 | write(REG_VALRT, value); |
neilt6 | 0:abc480f8eeab | 322 | } |
neilt6 | 0:abc480f8eeab | 323 | |
neilt6 | 2:0a98e081b48c | 324 | float MAX17048::vResetThreshold(void) |
neilt6 | 0:abc480f8eeab | 325 | { |
neilt6 | 0:abc480f8eeab | 326 | //Read the 16-bit register value |
neilt6 | 2:0a98e081b48c | 327 | unsigned short value = read(REG_VRESET_ID); |
neilt6 | 0:abc480f8eeab | 328 | |
neilt6 | 0:abc480f8eeab | 329 | //Extract the threshold |
neilt6 | 0:abc480f8eeab | 330 | return (value >> 9) * 0.04; |
neilt6 | 0:abc480f8eeab | 331 | } |
neilt6 | 0:abc480f8eeab | 332 | |
neilt6 | 2:0a98e081b48c | 333 | void MAX17048::vResetThreshold(float threshold) |
neilt6 | 0:abc480f8eeab | 334 | { |
neilt6 | 0:abc480f8eeab | 335 | //Read the current 16-bit register value |
neilt6 | 2:0a98e081b48c | 336 | unsigned short value = read(REG_VRESET_ID); |
neilt6 | 0:abc480f8eeab | 337 | |
neilt6 | 0:abc480f8eeab | 338 | //Mask off the old value |
neilt6 | 0:abc480f8eeab | 339 | value &= 0x01FF; |
neilt6 | 0:abc480f8eeab | 340 | |
neilt6 | 0:abc480f8eeab | 341 | //Do a smart update |
neilt6 | 0:abc480f8eeab | 342 | if (threshold > 0.0) { |
neilt6 | 0:abc480f8eeab | 343 | if (threshold < 5.08) |
neilt6 | 0:abc480f8eeab | 344 | value |= (unsigned short)(threshold / 0.04) << 9; |
neilt6 | 0:abc480f8eeab | 345 | else |
neilt6 | 0:abc480f8eeab | 346 | value |= 0xFE00; |
neilt6 | 0:abc480f8eeab | 347 | } |
neilt6 | 0:abc480f8eeab | 348 | |
neilt6 | 0:abc480f8eeab | 349 | //Write the 16-bit register |
neilt6 | 2:0a98e081b48c | 350 | write(REG_VRESET_ID, value); |
neilt6 | 0:abc480f8eeab | 351 | } |
neilt6 | 0:abc480f8eeab | 352 | |
neilt6 | 2:0a98e081b48c | 353 | bool MAX17048::comparatorEnabled(void) |
neilt6 | 0:abc480f8eeab | 354 | { |
neilt6 | 0:abc480f8eeab | 355 | //Read the 16-bit register value |
neilt6 | 2:0a98e081b48c | 356 | unsigned short value = read(REG_VRESET_ID); |
neilt6 | 0:abc480f8eeab | 357 | |
neilt6 | 0:abc480f8eeab | 358 | //Return the status of the Dis bit |
neilt6 | 0:abc480f8eeab | 359 | if (value & (1 << 8)) |
neilt6 | 0:abc480f8eeab | 360 | return false; |
neilt6 | 0:abc480f8eeab | 361 | else |
neilt6 | 0:abc480f8eeab | 362 | return true; |
neilt6 | 0:abc480f8eeab | 363 | } |
neilt6 | 0:abc480f8eeab | 364 | |
neilt6 | 2:0a98e081b48c | 365 | void MAX17048::comparatorEnabled(bool enabled) |
neilt6 | 0:abc480f8eeab | 366 | { |
neilt6 | 0:abc480f8eeab | 367 | //Read the current 16-bit register value |
neilt6 | 2:0a98e081b48c | 368 | unsigned short value = read(REG_VRESET_ID); |
neilt6 | 0:abc480f8eeab | 369 | |
neilt6 | 0:abc480f8eeab | 370 | //Set or clear the Dis bit |
neilt6 | 0:abc480f8eeab | 371 | if (enabled) |
neilt6 | 0:abc480f8eeab | 372 | value &= ~(1 << 8); |
neilt6 | 0:abc480f8eeab | 373 | else |
neilt6 | 0:abc480f8eeab | 374 | value |= (1 << 8); |
neilt6 | 0:abc480f8eeab | 375 | |
neilt6 | 0:abc480f8eeab | 376 | //Write the value back out |
neilt6 | 2:0a98e081b48c | 377 | write(REG_VRESET_ID, value); |
neilt6 | 0:abc480f8eeab | 378 | } |
neilt6 | 0:abc480f8eeab | 379 | |
neilt6 | 2:0a98e081b48c | 380 | char MAX17048::id(void) |
neilt6 | 0:abc480f8eeab | 381 | { |
neilt6 | 0:abc480f8eeab | 382 | //Read the 16-bit register value |
neilt6 | 2:0a98e081b48c | 383 | unsigned short value = read(REG_VRESET_ID); |
neilt6 | 0:abc480f8eeab | 384 | |
neilt6 | 0:abc480f8eeab | 385 | //Return only the ID bits |
neilt6 | 0:abc480f8eeab | 386 | return value; |
neilt6 | 0:abc480f8eeab | 387 | } |
neilt6 | 0:abc480f8eeab | 388 | |
neilt6 | 2:0a98e081b48c | 389 | bool MAX17048::vResetAlertEnabled(void) |
neilt6 | 0:abc480f8eeab | 390 | { |
neilt6 | 0:abc480f8eeab | 391 | //Read the 16-bit register value |
neilt6 | 2:0a98e081b48c | 392 | unsigned short value = read(REG_STATUS); |
neilt6 | 0:abc480f8eeab | 393 | |
neilt6 | 0:abc480f8eeab | 394 | //Return the status of the EnVR bit |
neilt6 | 0:abc480f8eeab | 395 | if (value & (1 << 14)) |
neilt6 | 0:abc480f8eeab | 396 | return true; |
neilt6 | 0:abc480f8eeab | 397 | else |
neilt6 | 0:abc480f8eeab | 398 | return false; |
neilt6 | 0:abc480f8eeab | 399 | } |
neilt6 | 0:abc480f8eeab | 400 | |
neilt6 | 2:0a98e081b48c | 401 | void MAX17048::vResetAlertEnabled(bool enabled) |
neilt6 | 0:abc480f8eeab | 402 | { |
neilt6 | 0:abc480f8eeab | 403 | //Read the current 16-bit register value |
neilt6 | 2:0a98e081b48c | 404 | unsigned short value = read(REG_STATUS); |
neilt6 | 0:abc480f8eeab | 405 | |
neilt6 | 0:abc480f8eeab | 406 | //Set or clear the EnVR bit |
neilt6 | 0:abc480f8eeab | 407 | if (enabled) |
neilt6 | 0:abc480f8eeab | 408 | value |= (1 << 14); |
neilt6 | 0:abc480f8eeab | 409 | else |
neilt6 | 0:abc480f8eeab | 410 | value &= ~(1 << 14); |
neilt6 | 0:abc480f8eeab | 411 | |
neilt6 | 0:abc480f8eeab | 412 | //Write the value back out |
neilt6 | 2:0a98e081b48c | 413 | write(REG_STATUS, value); |
neilt6 | 0:abc480f8eeab | 414 | } |
neilt6 | 0:abc480f8eeab | 415 | |
neilt6 | 2:0a98e081b48c | 416 | char MAX17048::alertFlags(void) |
neilt6 | 0:abc480f8eeab | 417 | { |
neilt6 | 0:abc480f8eeab | 418 | //Read the 16-bit register value |
neilt6 | 2:0a98e081b48c | 419 | unsigned short value = read(REG_STATUS); |
neilt6 | 0:abc480f8eeab | 420 | |
neilt6 | 0:abc480f8eeab | 421 | //Return only the flag bits |
neilt6 | 0:abc480f8eeab | 422 | return (value >> 8) & 0x3F; |
neilt6 | 0:abc480f8eeab | 423 | } |
neilt6 | 0:abc480f8eeab | 424 | |
neilt6 | 0:abc480f8eeab | 425 | void MAX17048::clearAlertFlags(char flags) |
neilt6 | 0:abc480f8eeab | 426 | { |
neilt6 | 0:abc480f8eeab | 427 | //Read the current 16-bit register value |
neilt6 | 2:0a98e081b48c | 428 | unsigned short value = read(REG_STATUS); |
neilt6 | 0:abc480f8eeab | 429 | |
neilt6 | 0:abc480f8eeab | 430 | //Clear the specified flag bits |
neilt6 | 0:abc480f8eeab | 431 | value &= ~((flags & 0x3F) << 8); |
neilt6 | 0:abc480f8eeab | 432 | |
neilt6 | 0:abc480f8eeab | 433 | //Write the value back out |
neilt6 | 2:0a98e081b48c | 434 | write(REG_STATUS, value); |
neilt6 | 0:abc480f8eeab | 435 | } |
neilt6 | 0:abc480f8eeab | 436 | |
neilt6 | 2:0a98e081b48c | 437 | float MAX17048::vcell(void) |
neilt6 | 0:abc480f8eeab | 438 | { |
neilt6 | 0:abc480f8eeab | 439 | //Read the 16-bit raw Vcell value |
neilt6 | 2:0a98e081b48c | 440 | unsigned short value = read(REG_VCELL); |
neilt6 | 0:abc480f8eeab | 441 | |
neilt6 | 0:abc480f8eeab | 442 | //Return Vcell in volts |
neilt6 | 0:abc480f8eeab | 443 | return value * 0.000078125; |
neilt6 | 0:abc480f8eeab | 444 | } |
neilt6 | 0:abc480f8eeab | 445 | |
neilt6 | 2:0a98e081b48c | 446 | float MAX17048::soc(void) |
neilt6 | 0:abc480f8eeab | 447 | { |
neilt6 | 0:abc480f8eeab | 448 | //Read the 16-bit raw SOC value |
neilt6 | 2:0a98e081b48c | 449 | unsigned short value = read(REG_SOC); |
neilt6 | 0:abc480f8eeab | 450 | |
neilt6 | 0:abc480f8eeab | 451 | //Return SOC in percent |
neilt6 | 0:abc480f8eeab | 452 | return value * 0.00390625; |
neilt6 | 0:abc480f8eeab | 453 | } |
neilt6 | 0:abc480f8eeab | 454 | |
neilt6 | 2:0a98e081b48c | 455 | float MAX17048::crate(void) |
neilt6 | 0:abc480f8eeab | 456 | { |
neilt6 | 0:abc480f8eeab | 457 | //Read the 16-bit raw C/Rate value |
neilt6 | 2:0a98e081b48c | 458 | short value = read(REG_CRATE); |
neilt6 | 0:abc480f8eeab | 459 | |
neilt6 | 0:abc480f8eeab | 460 | //Return C/Rate in %/hr |
neilt6 | 0:abc480f8eeab | 461 | return value * 0.208; |
neilt6 | 0:abc480f8eeab | 462 | } |
neilt6 | 0:abc480f8eeab | 463 | |
neilt6 | 2:0a98e081b48c | 464 | unsigned short MAX17048::read(char reg) |
neilt6 | 0:abc480f8eeab | 465 | { |
neilt6 | 0:abc480f8eeab | 466 | //Create a temporary buffer |
neilt6 | 0:abc480f8eeab | 467 | char buff[2]; |
neilt6 | 0:abc480f8eeab | 468 | |
neilt6 | 0:abc480f8eeab | 469 | //Select the register |
neilt6 | 2:0a98e081b48c | 470 | m_I2C.write(m_ADDR, ®, 1); |
neilt6 | 0:abc480f8eeab | 471 | |
neilt6 | 0:abc480f8eeab | 472 | //Read the 16-bit register |
neilt6 | 2:0a98e081b48c | 473 | m_I2C.read(m_ADDR, buff, 2); |
neilt6 | 0:abc480f8eeab | 474 | |
neilt6 | 0:abc480f8eeab | 475 | //Return the combined 16-bit value |
neilt6 | 0:abc480f8eeab | 476 | return (buff[0] << 8) | buff[1]; |
neilt6 | 0:abc480f8eeab | 477 | } |
neilt6 | 0:abc480f8eeab | 478 | |
neilt6 | 2:0a98e081b48c | 479 | void MAX17048::write(char reg, unsigned short data) |
neilt6 | 0:abc480f8eeab | 480 | { |
neilt6 | 0:abc480f8eeab | 481 | //Create a temporary buffer |
neilt6 | 0:abc480f8eeab | 482 | char buff[3]; |
neilt6 | 0:abc480f8eeab | 483 | |
neilt6 | 0:abc480f8eeab | 484 | //Load the register address and 16-bit data |
neilt6 | 0:abc480f8eeab | 485 | buff[0] = reg; |
neilt6 | 0:abc480f8eeab | 486 | buff[1] = data >> 8; |
neilt6 | 0:abc480f8eeab | 487 | buff[2] = data; |
neilt6 | 0:abc480f8eeab | 488 | |
neilt6 | 0:abc480f8eeab | 489 | //Write the data |
neilt6 | 2:0a98e081b48c | 490 | m_I2C.write(m_ADDR, buff, 3); |
neilt6 | 0:abc480f8eeab | 491 | } |
neilt6 | 0:abc480f8eeab | 492 | |
neilt6 | 2:0a98e081b48c | 493 | void MAX17048::writeRCOMP(char rcomp) |
neilt6 | 0:abc480f8eeab | 494 | { |
neilt6 | 0:abc480f8eeab | 495 | //Read the current 16-bit register value |
neilt6 | 2:0a98e081b48c | 496 | unsigned short value = read(REG_CONFIG); |
neilt6 | 0:abc480f8eeab | 497 | |
neilt6 | 0:abc480f8eeab | 498 | //Update the register value |
neilt6 | 0:abc480f8eeab | 499 | value &= 0x00FF; |
neilt6 | 0:abc480f8eeab | 500 | value |= rcomp << 8; |
neilt6 | 0:abc480f8eeab | 501 | |
neilt6 | 0:abc480f8eeab | 502 | //Write the value back out |
neilt6 | 2:0a98e081b48c | 503 | write(REG_CONFIG, value); |
neilt6 | 0:abc480f8eeab | 504 | } |