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.h

Committer:
neilt6
Date:
2013-08-14
Revision:
2:0a98e081b48c
Parent:
1:734b1a089a9c
Child:
3:32087cca331f

File content as of revision 2:0a98e081b48c:

/* MAX17048 Driver Library
 * Copyright (c) 2013 Neil Thiessen
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef MAX17048_H
#define MAX17048_H

#include "mbed.h"

/** MAX17048 class.
 *  Used for controlling a MAX17048 fuel gauge connected via I2C.
 *
 * Example:
 * @code
 * #include "mbed.h"
 * #include "MAX17048.h"
 *
 * MAX17048 gauge(p28, p27);
 *
 * int main() {
 *     while (1) {
 *         //Read the cell voltage
 *         float vcell = gauge.vcell();
 *
 *         //Print the cell voltage
 *         printf("Vcell = %f\n", vcell);
 *
 *         //Sleep for 0.5 seconds
 *         wait(0.5);
 *     }
 * }
 * @endcode
 */
class MAX17048
{
public:
    /** Represents the different alert flags for the MAX17048
     */
    enum AlertFlags {
        ALERT_RI = (1 << 0),  /**< Reset indicator */
        ALERT_VH = (1 << 1),  /**< Voltage high alert */
        ALERT_VL = (1 << 2),  /**< Voltage low alert */
        ALERT_VR = (1 << 3),  /**< Voltage reset alert */
        ALERT_HD = (1 << 4),  /**< SOC low alert */
        ALERT_SC = (1 << 5)   /**< SOC change alert */
    };

    /** Create a MAX17048 object connected to the specified I2C pins
     *
     * @param sda The I2C data pin.
     * @param scl The I2C clock pin.
     */
    MAX17048(PinName sda, PinName scl);

    /** Command the MAX17048 to perform a power-on reset
     */
    void reset(void);

    /** Command the MAX17048 to perform a QuickStart
     */
    void quickStart(void);

    /** Determine whether sleep mode is enabled on the MAX17048
    *
    * @returns
    *   'true' if sleep mode is enabled,
    *   'false' if sleep mode is disabled.
    */
    bool sleepEnabled(void);

    /** Enable or disable sleep mode on the MAX17048
     *
     * @param enabled Whether or not sleep mode is enabled.
     */
    void sleepEnabled(bool enabled);

    /** Determine whether or not the MAX17048 is hibernating
    *
    * @returns
    *   'true' if hibernating,
    *   'false' if not hibernating.
    */
    bool hibernating(void);

    /** Get the current hibernate threshold of the MAX17048
    *
    * @returns The current hibernate threshold in \%/hr.
    */
    float hibernateThreshold(void);

    /** Set the hibernate threshold of the MAX17048
     *
     * @param threshold The new hibernate threshold in \%/hr.
     */
    void hibernateThreshold(float threshold);

    /** Get the current active threshold of the MAX17048
    *
    * @returns The current active threshold in volts.
    */
    float activeThreshold(void);

    /** Set the active threshold of the MAX17048
     *
     * @param threshold The new active threshold in volts.
     */
    void activeThreshold(float threshold);

    /** Get the production version of the MAX17048
    *
    * @returns The 16-bit production version.
    */
    unsigned short version(void);

    /** Set the cell temperature compensation of the MAX17048
     *
     * @param temp The current cell temperature in °C.
     */
    void tempCompensation(float temp);

    /** Determine whether or not the MAX17048 is in sleep mode
    *
    * @returns
    *   'true' if in sleep mode,
    *   'false' if not in sleep mode.
    */
    bool sleeping(void);

    /** Enter or exit sleep mode on the MAX17048 (sleep mode must be enabled first)
     *
     * @param sleep Whether or not to sleep.
     */
    void sleep(bool sleep);

    /** Determine whether or not the SOC 1% change alert is enabled on the MAX17048
    *
    * @returns
    *   'true' if enabled,
    *   'false' if not enabled.
    */
    bool socChangeAlertEnabled(void);

    /** Enable or disable the SOC 1% change alert on the MAX17048
     *
     * @param enabled Whether or the SOC 1% change alert is enabled.
     */
    void socChangeAlertEnabled(bool enabled);

    /** Determine whether or not the MAX17048 is asserting the ALRT pin
    *
    * @returns
    *   'true' if alerting,
    *   'false' if not alerting.
    */
    bool alerting(void);

    /** Command the MAX17048 to de-assert the ALRT pin
    */
    void clearAlert(void);

    /** Get the current SOC empty alert threshold of the MAX17048
    *
    * @returns The current SOC empty alert threshold in %.
    */
    char emptyAlertThreshold(void);

    /** Set the SOC empty alert threshold of the MAX17048
     *
     * @param threshold The new SOC empty alert threshold in %.
     */
    void emptyAlertThreshold(char threshold);

    /** Get the current low voltage alert threshold of the MAX17048
    *
    * @returns The current low voltage alert threshold in volts.
    */
    float vAlertMinThreshold(void);

    /** Set the low voltage alert threshold of the MAX17048
     *
     * @param threshold The new low voltage alert threshold in volts.
     */
    void vAlertMinThreshold(float threshold);

    /** Get the current high voltage alert threshold of the MAX17048
    *
    * @returns The current high voltage alert threshold in volts.
    */
    float vAlertMaxThreshold(void);

    /** Set the high voltage alert threshold of the MAX17048
     *
     * @param threshold The new high voltage alert threshold in volts.
     */
    void vAlertMaxThreshold(float threshold);

    /** Get the current reset voltage threshold of the MAX17048
    *
    * @returns The current reset voltage threshold in volts.
    */
    float vResetThreshold(void);

    /** Set the reset voltage threshold of the MAX17048
     *
     * @param threshold The new reset voltage threshold in volts.
     */
    void vResetThreshold(float threshold);

    /** Determine whether or not the reset voltage comparator is enabled on the MAX17048
    *
    * @returns
    *   'true' if enabled,
    *   'false' if not enabled.
    */
    bool comparatorEnabled(void);

    /** Enable or disable the reset voltage comparator on the MAX17048
     *
     * @param enabled Whether or not the reset voltage comparator is enabled.
     */
    void comparatorEnabled(bool enabled);

    /** Get the factory programmed 8-bit ID of the MAX17048
    *
    * @returns The 8-bit ID.
    */
    char id(void);

    /** Determine whether or not the voltage reset alert is enabled on the MAX17048
    *
    * @returns
    *   'true' if enabled,
    *   'false' if not enabled.
    */
    bool vResetAlertEnabled(void);

    /** Enable or disable the voltage reset alert on the MAX17048
     *
     * @param enabled Whether or the voltage reset alert is enabled.
     */
    void vResetAlertEnabled(bool enabled);

    /** Get the current alert flags on the MAX17048
    *
    * @returns The current alert flags as AlertFlags enum values OR'd together.
    */
    char alertFlags(void);

    /** Clear the specified alert flags on the MAX17048
     *
     * @param flags The alert flags to clear as AlertFlags enum values OR'd together.
     */
    void clearAlertFlags(char flags);

    /** Get the current cell voltage measurement of the MAX17048
    *
    * @returns The cell voltage measurement as a float.
    */
    float vcell(void);

    /** Get the current state of charge measurement of the MAX17048
     *
     * @returns The state of charge measurement as a float.
     */
    float soc(void);

    /** Get the current C rate measurement of the MAX17048
     *
     * @returns The C rate measurement as a float.
     */
    float crate(void);

private:
    //I2C register addresses
    enum Register {
        REG_VCELL       = 0x02,
        REG_SOC         = 0x04,
        REG_MODE        = 0x06,
        REG_VERSION     = 0x08,
        REG_HIBRT       = 0x0A,
        REG_CONFIG      = 0x0C,
        REG_VALRT       = 0x14,
        REG_CRATE       = 0x16,
        REG_VRESET_ID   = 0x18,
        REG_STATUS      = 0x1A,
        REG_TABLE       = 0x40,
        REG_CMD         = 0xFE
    };

    //Member constants
    static const int m_ADDR    = (0x36 << 1);
    static const int m_RCOMP0  = 0x97;

    //Member variables
    I2C m_I2C;

    //Internal functions
    unsigned short read(char reg);
    void write(char reg, unsigned short data);
    void writeRCOMP(char rcomp);
};

#endif