A compilation of some hardware sensors and their shared programming interfaces.
Diff: MMA8451Q.h
- Revision:
- 0:8d34cc2ff388
diff -r 000000000000 -r 8d34cc2ff388 MMA8451Q.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MMA8451Q.h Sun Mar 16 01:48:59 2014 +0000 @@ -0,0 +1,286 @@ +/* MMA8451Q.h + * Tested with mbed board: FRDM-KL46Z + * Author: Mark Gottscho + * mgottscho@ucla.edu + */ + +#ifndef MMA8451Q_H +#define MMA8451Q_H + +#include "mbed.h" +#include "I2CSensor.h" +#include "PeriodicSensor.h" +#include "SleepableSensor.h" + +/** + * This class allows for easy control of an MMA8451Q accelerometer IC. + */ +class MMA8451Q : public I2CSensor, public PeriodicSensor, public SleepableSensor { + public: + /** + * Enumeration of allowed output data sampling rates. + */ + typedef enum { + HZ800, + HZ400, + HZ200, + HZ100, + HZ50, + HZ12_5, + HZ6_25, + HZ1_56 + } smpl_rate_t; + + /** + * Enumeration of allowed dynamic ranges (full scale) of the accelerometer data. + * G2: +/- 2G (0.25 mg/level at 14b, 15.6 mg/level at 8b) + * G4: +/- 4G (0.5 mg/level at 14b, 31.25 mg/level at 8b) + * G8: +/- 8G (1.0 mg/level at 14b, 62.5 mg/level at 8b) + */ + typedef enum { + G2, + G4, + G8 + } scale_t; + + /** + * @param sda the pin identifier for SDA I2C signal + * @param scl the pin identifier for SCL I2C signal + * @param i2c_addr the 8-bit I2C address for this device. Note that LSB is a don't care. + */ + MMA8451Q(PinName sda, PinName scl, int i2c_addr); + + /** + */ + ~MMA8451Q(); + + /** + * Self-initialization to some nice preset. You must ensure the device is first deactivated using setActive(). + */ + void selfInit(); + + /** + * Does a soft reset of the device. + */ + void reset(); + + //I2C specific methods + + /** + * Implements the pure virtual method of the parent I2CSensor class. + * @returns the 8-bit device identifier. + */ + uint8_t whoAmI(); + + //Device-specific methods + + /** + * @returns true if the device is active + */ + bool isActive(); + + /** + * @param activate if true, enables the device, else disables it + */ + void setActive(bool activate); + + /** + * @returns the 8-bit system mode status + */ + uint8_t getSystemMode(); + + /** + * @returns true if the device is generating 14b resolution data, otherwise 8b + */ + bool is14bDataEnabled(); + + /** + * @param enable if true, sets 14b data, otherwise 8b data + */ + void set14bData(bool enable); + + /** + * @returns an enumerated value corresponding to the current output data sample rate + */ + smpl_rate_t getOutputDataRate(); + + /** + * @param the enumerated value corresponding to the output data sample rate to use + */ + void setOutputDataRate(smpl_rate_t rate); + + /** + * @returns an enumerated value corresponding to the full scale (range) of the output data + */ + scale_t getScale(); + + /** + * @param scale sets the sample scale via the enumerated value + */ + void setScale(scale_t scale); + + /** + * Enables an interrupt output signal from the device whenever data (XYZ) is generated. + * @param enable Enables/disables interrupt + * @param pinSelect if false, INT2. if true, INT1 + */ + void enableDataReadyInterrupt(bool enable, bool pinSelect); + + + //Device-specific data retrieval methods + /** + * @param sampleNow if true, queries the device for the sample and returns it. if false, gets the last queried value. + * The latter is preferred if this object is set up to sample using interrupts. + * @returns a 14-bit value representing the latest data sample for the X dimension, centered at 0. + */ + int16_t getX(bool sampleNow); + + /** + * @param sampleNow if true, queries the device for the sample and returns it. if false, gets the last queried value. + * The latter is preferred if this object is set up to sample using interrupts. + * @returns a 14-bit value representing the latest data sample for the Y dimension, centered at 0. + */ + int16_t getY(bool sampleNow); + + /** + * @param sampleNow if true, queries the device for the sample and returns it. if false, gets the last queried value. + * The latter is preferred if this object is set up to sample using interrupts. + * @returns a 14-bit value representing the latest data sample for the Z dimension, centered at 0. + */ + int16_t getZ(bool sampleNow); + + /** + * @param sampleNow if true, queries the device for the sample and returns it. if false, gets the last queried value. + * The latter is preferred if this object is set up to sample using interrupts. + * Returns the latest X data reading as a float in Gs + */ + float getFloatX(bool sampleNow); + + /** + * @param sampleNow if true, queries the device for the sample and returns it. if false, gets the last queried value. + * The latter is preferred if this object is set up to sample using interrupts. + * Returns the latest Y data reading as a float in Gs + */ + float getFloatY(bool sampleNow); + + /** + * @param sampleNow if true, queries the device for the sample and returns it. if false, gets the last queried value. + * The latter is preferred if this object is set up to sample using interrupts. + * Returns the latest Z data reading as a float in Gs + */ + float getFloatZ(bool sampleNow); + + virtual void sleep(); + + virtual void wake(); + + private: + /** + * Interrupt service routine for fetching accelerometer data from the device. + */ + virtual void __sample_data_ISR(); + + ///////////////// CONSTANTS ///////////////////// + + //Device register addresses + static const uint8_t STATUS = 0x00; + static const uint8_t F_STATUS = 0x00; + static const uint8_t OUT_X_MSB = 0x01; + static const uint8_t OUT_X_LSB = 0x02; + static const uint8_t OUT_Y_MSB = 0x03; + static const uint8_t OUT_Y_LSB = 0x04; + static const uint8_t OUT_Z_MSB = 0x05; + static const uint8_t OUT_Z_LSB = 0x06; + static const uint8_t F_SETUP = 0x09; + static const uint8_t TRIG_CFG = 0x0A; + static const uint8_t SYSMOD = 0x0B; + static const uint8_t INT_SOURCE = 0x0C; + static const uint8_t WHO_AM_I = 0x0D; + static const uint8_t XYZ_DATA_CFG = 0x0E; + static const uint8_t HP_FILTER_CUTOFF = 0x0F; + static const uint8_t PL_STATUS = 0x10; + static const uint8_t PL_CFG = 0x11; + static const uint8_t PL_COUNT = 0x12; + static const uint8_t PL_BF_ZCOMP = 0x13; + static const uint8_t P_L_THS_REG = 0x14; + static const uint8_t FF_MT_CFG = 0x15; + static const uint8_t FF_MT_SRC = 0x16; + static const uint8_t FF_MT_THS = 0x17; + static const uint8_t FF_MT_COUNT = 0x18; + static const uint8_t TRANSIENT_CFG = 0x1D; + static const uint8_t TRANSIENT_SRC = 0x1E; + static const uint8_t TRANSIENT_THS = 0x1F; + static const uint8_t PULSE_CFG = 0x21; + static const uint8_t PULSE_SRC = 0x22; + static const uint8_t PULSE_THSX = 0x23; + static const uint8_t PULSE_THSY = 0x24; + static const uint8_t PULSE_THSZ = 0x25; + static const uint8_t PULSE_TMLT = 0x26; + static const uint8_t PULSE_LTCY = 0x27; + static const uint8_t PULSE_WIND = 0x28; + static const uint8_t ASLP_COUNT = 0x29; + static const uint8_t CTRL_REG1 = 0x2A; + static const uint8_t CTRL_REG2 = 0x2B; + static const uint8_t CTRL_REG3 = 0x2C; + static const uint8_t CTRL_REG4 = 0x2D; + static const uint8_t CTRL_REG5 = 0x2E; + static const uint8_t OFF_X = 0x2F; + static const uint8_t OFF_Y = 0x30; + static const uint8_t OFF_Z = 0x31; + + //Register masks + static const uint8_t XYZ_DATA_CFG_HPF_OUT_MASK = 0x10; //b0001 0000 + static const uint8_t XYZ_DATA_CFG_FS_MASK = 0x03; //b0000 0011 + static const uint8_t CTRL_REG1_ASLP_RATE_MASK = 0xC0; //b1100 0000 + static const uint8_t CTRL_REG1_DR_MASK = 0x38; //b0011 1000 + static const uint8_t CTRL_REG1_LNOISE_MASK = 0x04; //b0000 0100 + static const uint8_t CTRL_REG1_F_READ_MASK = 0x02; //b0000 0010 + static const uint8_t CTRL_REG1_ACTIVE_MASK = 0x01; //b0000 0001 + static const uint8_t CTRL_REG2_ST_MASK = 0x80; //b1000 0000 + static const uint8_t CTRL_REG2_RST_MASK = 0x40; //b0100 0000 + static const uint8_t CTRL_REG2_SMODS_MASK = 0x18; //b0001 1000 + static const uint8_t CTRL_REG2_SLPE_MASK = 0x04; //b0000 0100 + static const uint8_t CTRL_REG2_MODS_MASK = 0x03; //b0000 0011 + static const uint8_t CTRL_REG3_FIFO_GATE_MASK = 0x80; //b1000 0000 + static const uint8_t CTRL_REG3_WAKE_TRANS_MASK = 0x40; //b0100 0000 + static const uint8_t CTRL_REG3_WAKE_LNDPRT_MASK = 0x20; //b0010 0000 + static const uint8_t CTRL_REG3_WAKE_PULSE_MASK = 0x10; //b0001 0000 + static const uint8_t CTRL_REG3_WAKE_FF_MT_MASK = 0x08; //b0000 1000 + static const uint8_t CTRL_REG3_IPOL_MASK = 0x02; //b0000 0010 + static const uint8_t CTRL_REG3_PP_OD_MASK = 0x01; //b0000 0001 + static const uint8_t CTRL_REG4_INT_EN_ASLP_MASK = 0x80; //b1000 0000 + static const uint8_t CTRL_REG4_INT_EN_FIFO_MASK = 0x40; //b0100 0000 + static const uint8_t CTRL_REG4_INT_EN_TRANS_MASK = 0x20; //b0010 0000 + static const uint8_t CTRL_REG4_INT_EN_LNDPR_MASK = 0x10; //b0001 0000 + static const uint8_t CTRL_REG4_INT_EN_PULSE_MASK = 0x08; //b0000 1000 + static const uint8_t CTRL_REG4_INT_EN_FF_MT_MASK = 0x04; //b0000 0100 + static const uint8_t CTRL_REG4_INT_EN_DRDY_MASK = 0x01; //b0000 0001 + static const uint8_t CTRL_REG5_INT_CFG_ASLP_MASK = 0x80; //b1000 0000 + static const uint8_t CTRL_REG5_INT_CFG_FIFO_MASK = 0x40; //b0100 0000 + static const uint8_t CTRL_REG5_INT_CFG_TRANS_MASK = 0x20; //b0010 0000 + static const uint8_t CTRL_REG5_INT_CFG_LNDPRT_MASK = 0x10; //b0001 0000 + static const uint8_t CTRL_REG5_INT_CFG_PULSE_MASK = 0x08; //b0000 1000 + static const uint8_t CTRL_REG5_INT_CFG_FF_MT_MASK = 0x04; //b0000 0100 + static const uint8_t CTRL_REG5_INT_CFG_DRDY_MASK = 0x01; //b0000 0001 + + //Mapping of sensor values + static const float G2_DIV = 0.00024414; // in Gs/level, 1/4096 + static const float G4_DIV = 0.00048828; // in Gs/level, 1/2048 + static const float G8_DIV = 0.00097656; // in Gs/level, 1/1024 + + + ////////////// VARIABLES ///////////////// + + //MMA8451Q state ("cached" from the values actually on the device) + volatile int16_t __x; + volatile int16_t __y; + volatile int16_t __z; + + bool __active; + bool __14b_data_enabled; + smpl_rate_t __output_data_rate; + scale_t __scale; + float __div; //current sensor mapping +}; + +#endif \ No newline at end of file