A compilation of some hardware sensors and their shared programming interfaces.
Diff: MAX17043.cpp
- Revision:
- 0:8d34cc2ff388
diff -r 000000000000 -r 8d34cc2ff388 MAX17043.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MAX17043.cpp Sun Mar 16 01:48:59 2014 +0000 @@ -0,0 +1,82 @@ +/* MAX17043.cpp + * Tested with mbed board: FRDM-KL46Z + * Author: Mark Gottscho + * mgottscho@ucla.edu + */ + + +#include "mbed.h" +#include "I2CSensor.h" +#include "PeriodicSensor.h" +#include "MAX17043.h" + + +MAX17043::MAX17043(PinName sda, PinName scl, int i2c_addr) : + I2CSensor(sda, scl, i2c_addr), + PeriodicSensor(0.5), //Default max sampling rate of 2 Hz, because the device internally samples every 500ms after initial POS report + __soc(0), + __vcell(0) + { +} + +MAX17043::~MAX17043() { } + +void MAX17043::selfInit() { + __i2c.frequency(400000); + reset(); +} + +void MAX17043::reset() { + __disable_irq(); + uint16_t data = RST_CODE; + setRegister16b(COMMAND_MSB, data); + __enable_irq(); + wait(0.130); //wait 130ms until first readings are valid (125ms est) +} + +uint16_t MAX17043::getVersion() { + uint8_t data = getRegister(VERSION_MSB); + return (data << 8) | (getRegister(VERSION_LSB)); +} + +uint16_t MAX17043::getVCell(bool sampleNow) { + __disable_irq(); + + if (sampleNow) { + uint16_t data = getRegister16b(VCELL_MSB); + __vcell = data >> 4; //right shift by 4 to throw out the don't care bits + } + __dataReady = false; + + __enable_irq(); + + return __vcell; +} + +float MAX17043::getFloatVCell(bool sampleNow) { + return getVCell(sampleNow) * DIV_VCELL; +} + +uint16_t MAX17043::getSOC(bool sampleNow) { + __disable_irq(); + + if (sampleNow) { + uint8_t data = getRegister(SOC_MSB); + __soc = (data << 8) | (getRegister(SOC_LSB)); + } + __dataReady = false; + + __enable_irq(); + + return __soc; +} + +float MAX17043::getFloatSOC(bool sampleNow) { + return getSOC(sampleNow) * DIV_SOC; +} + +void MAX17043::__sample_data_ISR() { + getSOC(true); + getVCell(true); + __dataReady = true; +} \ No newline at end of file