A compilation of some hardware sensors and their shared programming interfaces.

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers MAX17043.cpp Source File

MAX17043.cpp

00001 /* MAX17043.cpp
00002  * Tested with mbed board: FRDM-KL46Z
00003  * Author: Mark Gottscho
00004  * mgottscho@ucla.edu
00005  */
00006 
00007  
00008 #include "mbed.h"
00009 #include "I2CSensor.h"
00010 #include "PeriodicSensor.h"
00011 #include "MAX17043.h"
00012 
00013 
00014 MAX17043::MAX17043 (PinName sda, PinName scl, int i2c_addr) :
00015                                 I2CSensor(sda, scl, i2c_addr),
00016                                 PeriodicSensor(0.5), //Default max sampling rate of 2 Hz, because the device internally samples every 500ms after initial POS report
00017                                 __soc(0),
00018                                 __vcell(0)
00019                                 {
00020 }
00021 
00022 MAX17043::~MAX17043() { }
00023 
00024 void MAX17043::selfInit() {
00025     __i2c.frequency(400000);
00026     reset();
00027 }
00028 
00029 void MAX17043::reset() {
00030     __disable_irq();
00031     uint16_t data = RST_CODE;
00032     setRegister16b(COMMAND_MSB, data);
00033     __enable_irq();
00034     wait(0.130); //wait 130ms until first readings are valid (125ms est)
00035 }
00036 
00037 uint16_t MAX17043::getVersion () {
00038     uint8_t data = getRegister(VERSION_MSB);
00039     return (data << 8) | (getRegister(VERSION_LSB));
00040 }
00041 
00042 uint16_t MAX17043::getVCell (bool sampleNow) {
00043     __disable_irq();
00044     
00045     if (sampleNow) {
00046         uint16_t data = getRegister16b(VCELL_MSB);
00047         __vcell = data >> 4; //right shift by 4 to throw out the don't care bits
00048     }
00049     __dataReady = false;
00050     
00051     __enable_irq();
00052     
00053     return __vcell;
00054 }
00055  
00056 float MAX17043::getFloatVCell (bool sampleNow) {
00057     return getVCell (sampleNow) * DIV_VCELL;       
00058 }
00059     
00060 uint16_t MAX17043::getSOC (bool sampleNow) {
00061     __disable_irq();
00062     
00063     if (sampleNow) {
00064         uint8_t data = getRegister(SOC_MSB);
00065         __soc =  (data << 8) | (getRegister(SOC_LSB));
00066     }
00067     __dataReady = false;
00068     
00069     __enable_irq();
00070     
00071     return __soc;
00072 }
00073 
00074 float MAX17043::getFloatSOC (bool sampleNow) {
00075     return getSOC (sampleNow) * DIV_SOC;   
00076 }
00077 
00078 void MAX17043::__sample_data_ISR() {
00079     getSOC (true);
00080     getVCell (true);
00081     __dataReady = true;
00082 }