A compilation of some hardware sensors and their shared programming interfaces.
MAX17043.cpp
- Committer:
- mgottscho
- Date:
- 2014-03-19
- Revision:
- 1:15396cab58d1
- Parent:
- 0:8d34cc2ff388
File content as of revision 1:15396cab58d1:
/* 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; }