A compilation of some hardware sensors and their shared programming interfaces.
Embed:
(wiki syntax)
Show/hide line numbers
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 }
Generated on Wed Jul 13 2022 19:24:41 by 1.7.2