A work in progress on an updated library

Dependents:   FRDM_N3110LCD test

Fork of MMA8451Q by Emilio Monti

Files at this revision

API Documentation at this revision

Comitter:
SomeRandomBloke
Date:
Thu Mar 14 21:57:04 2013 +0000
Parent:
4:c4d879a39775
Child:
6:e8bacad228f6
Commit message:
Work on an updated MMA8451Q Accelerometor library

Changed in this revision

MMA8451Q.cpp Show annotated file Show diff for this revision Revisions of this file
MMA8451Q.h Show annotated file Show diff for this revision Revisions of this file
--- a/MMA8451Q.cpp	Fri Oct 12 11:35:07 2012 +0000
+++ b/MMA8451Q.cpp	Thu Mar 14 21:57:04 2013 +0000
@@ -18,6 +18,38 @@
 
 #include "MMA8451Q.h"
 
+#define MMA_845XQ_CTRL_REG1 0x2A
+#define MMA_845XQ_CTRL_REG1_VALUE_ACTIVE 0x01
+#define MMA_845XQ_CTRL_REG1_VALUE_F_READ 0x02
+
+#define MMA_845XQ_CTRL_REG2 0x2B
+#define MMA_845XQ_CTRL_REG2_RESET 0x40
+
+#define MMA_845XQ_PL_STATUS 0x10
+#define MMA_845XQ_PL_CFG 0x11
+#define MMA_845XQ_PL_EN 0x40
+
+#define MMA_845XQ_XYZ_DATA_CFG 0x0E
+#define MMA_845XQ_2G_MODE 0x00 //Set Sensitivity to 2g
+#define MMA_845XQ_4G_MODE 0x01 //Set Sensitivity to 4g
+#define MMA_845XQ_8G_MODE 0x02 //Set Sensitivity to 8g
+#define MMA_845XQ_HPF_OUT 0x10 //Set High pas filter out
+
+
+#define MMA_845XQ_FF_MT_CFG 0x15
+#define MMA_845XQ_FF_MT_CFG_ELE 0x80
+#define MMA_845XQ_FF_MT_CFG_OAE 0x40
+
+#define MMA_845XQ_FF_MT_SRC 0x16
+#define MMA_845XQ_FF_MT_SRC_EA 0x80
+
+#define MMA_845XQ_PULSE_CFG 0x21
+#define MMA_845XQ_PULSE_CFG_ELE 0x80
+
+#define MMA_845XQ_PULSE_SRC 0x22
+#define MMA_845XQ_PULSE_SRC_EA 0x80
+
+// Original
 #define REG_WHO_AM_I      0x0D
 #define REG_CTRL_REG_1    0x2A
 #define REG_OUT_X_MSB     0x01
@@ -26,56 +58,115 @@
 
 #define UINT14_MAX        16383
 
-MMA8451Q::MMA8451Q(PinName sda, PinName scl, int addr) : m_i2c(sda, scl), m_addr(addr) {
-    // activate the peripheral
-    uint8_t data[2] = {REG_CTRL_REG_1, 0x01};
+MMA8451Q::MMA8451Q(PinName sda, PinName scl, int addr, bool highres, uint8_t scale) : m_i2c(sda, scl), m_addr(addr)
+{
+    _highres = highres;
+    _scale = scale;
+    _step_factor = (_highres ? 0.0039 : 0.0156); // Base value at 2g setting
+    if( _scale == 4 )
+        _step_factor *= 2;
+    else if (_scale == 8)
+        _step_factor *= 4;
+
+    // Set parameters
+    uint8_t data[2] = {REG_CTRL_REG_1, 0x04};
     writeRegs(data, 2);
+
+    // Activate
+    data[1] = 0x05;
+    writeRegs(data, 2);
+
+  data[0] = MMA_845XQ_XYZ_DATA_CFG;
+  if (_scale == 4 || _scale == 8)
+    data[1] = (_scale == 4) ? MMA_845XQ_4G_MODE : MMA_845XQ_8G_MODE;
+  else // Default to 2g mode
+    data[1] = (uint8_t)MMA_845XQ_2G_MODE;
+    
+//  data[1] |= MMA_845XQ_HPF_OUT;
+  writeRegs(data, 2);
 }
 
 MMA8451Q::~MMA8451Q() { }
 
-uint8_t MMA8451Q::getWhoAmI() {
+uint8_t MMA8451Q::getWhoAmI()
+{
     uint8_t who_am_i = 0;
     readRegs(REG_WHO_AM_I, &who_am_i, 1);
     return who_am_i;
 }
 
-float MMA8451Q::getAccX() {
+float MMA8451Q::getAccX()
+{
+//    return (getAccAxis(REG_OUT_X_MSB));
     return (float(getAccAxis(REG_OUT_X_MSB))/4096.0);
 }
 
-float MMA8451Q::getAccY() {
+float MMA8451Q::getAccY()
+{
+//    return (getAccAxis(REG_OUT_Y_MSB));
     return (float(getAccAxis(REG_OUT_Y_MSB))/4096.0);
 }
 
-float MMA8451Q::getAccZ() {
+float MMA8451Q::getAccZ()
+{
+//    return (getAccAxis(REG_OUT_Z_MSB));
     return (float(getAccAxis(REG_OUT_Z_MSB))/4096.0);
 }
 
-void MMA8451Q::getAccAllAxis(float * res) {
+void MMA8451Q::getAccAllAxis(float * res)
+{
     res[0] = getAccX();
     res[1] = getAccY();
     res[2] = getAccZ();
 }
 
-int16_t MMA8451Q::getAccAxis(uint8_t addr) {
+float MMA8451Q::getAccAxisF(uint8_t addr)
+{
     int16_t acc;
+    float facc;
     uint8_t res[2];
     readRegs(addr, res, 2);
 
     acc = (res[0] << 6) | (res[1] >> 2);
     if (acc > UINT14_MAX/2)
         acc -= UINT14_MAX;
+return (acc * 4096.0);
+/*    
+    if(_highres)
+    {
+      acc = (int16_t)(res[0] << 8) + res[1];
+      facc = (acc / 64) * _step_factor;
+    }
+    else
+    {
+      facc = (float)((int16_t)(res[0] * _step_factor) * 1.0);
+    }
+    return acc;
+*/
+}
 
+int16_t MMA8451Q::getAccAxis(uint8_t addr)
+{
+    int16_t acc;
+    uint8_t res[2];
+    readRegs(addr, res, 2);
+
+//    acc = (res[0] << 6) | (res[1] >> 2);
+    acc = (res[0] << 8) | (res[1]);
+    acc = acc >> 2;
+//    if (acc > UINT14_MAX/2)
+//        acc -= UINT14_MAX;
     return acc;
 }
 
-void MMA8451Q::readRegs(int addr, uint8_t * data, int len) {
+void MMA8451Q::readRegs(int addr, uint8_t * data, int len)
+{
     char t[1] = {addr};
     m_i2c.write(m_addr, t, 1, true);
     m_i2c.read(m_addr, (char *)data, len);
 }
 
-void MMA8451Q::writeRegs(uint8_t * data, int len) {
+void MMA8451Q::writeRegs(uint8_t * data, int len)
+{
     m_i2c.write(m_addr, (char *)data, len);
 }
--- a/MMA8451Q.h	Fri Oct 12 11:35:07 2012 +0000
+++ b/MMA8451Q.h	Thu Mar 14 21:57:04 2013 +0000
@@ -27,17 +27,17 @@
 * @code
 * #include "mbed.h"
 * #include "MMA8451Q.h"
-* 
+*
 * #define MMA8451_I2C_ADDRESS (0x1d<<1)
-* 
+*
 * int main(void) {
-* 
+*
 * MMA8451Q acc(P_E25, P_E24, MMA8451_I2C_ADDRESS);
 * PwmOut rled(LED_RED);
 * PwmOut gled(LED_GREEN);
 * PwmOut bled(LED_BLUE);
-* 
-*     while (true) {       
+*
+*     while (true) {
 *         rled = 1.0 - abs(acc.getAccX());
 *         gled = 1.0 - abs(acc.getAccY());
 *         bled = 1.0 - abs(acc.getAccZ());
@@ -49,61 +49,65 @@
 class MMA8451Q
 {
 public:
-  /**
-  * MMA8451Q constructor
-  *
-  * @param sda SDA pin
-  * @param sdl SCL pin
-  * @param addr addr of the I2C peripheral
-  */
-  MMA8451Q(PinName sda, PinName scl, int addr);
+    /**
+    * MMA8451Q constructor
+    *
+    * @param sda SDA pin
+    * @param sdl SCL pin
+    * @param addr addr of the I2C peripheral
+    */
+    MMA8451Q(PinName sda, PinName scl, int addr, bool highres, uint8_t scale);
 
-  /**
-  * MMA8451Q destructor
-  */
-  ~MMA8451Q();
+    /**
+    * MMA8451Q destructor
+    */
+    ~MMA8451Q();
 
-  /**
-   * Get the value of the WHO_AM_I register
-   *
-   * @returns WHO_AM_I value
-   */
-  uint8_t getWhoAmI();
+    /**
+     * Get the value of the WHO_AM_I register
+     *
+     * @returns WHO_AM_I value
+     */
+    uint8_t getWhoAmI();
 
-  /**
-   * Get X axis acceleration
-   *
-   * @returns X axis acceleration
-   */
-  float getAccX();
+    /**
+     * Get X axis acceleration
+     *
+     * @returns X axis acceleration
+     */
+    float getAccX();
 
-  /**
-   * Get Y axis acceleration
-   *
-   * @returns Y axis acceleration
-   */
-  float getAccY();
+    /**
+     * Get Y axis acceleration
+     *
+     * @returns Y axis acceleration
+     */
+    float getAccY();
 
-  /**
-   * Get Z axis acceleration
-   *
-   * @returns Z axis acceleration
-   */
-  float getAccZ();
+    /**
+     * Get Z axis acceleration
+     *
+     * @returns Z axis acceleration
+     */
+    float getAccZ();
 
-  /**
-   * Get XYZ axis acceleration
-   *
-   * @param res array where acceleration data will be stored
-   */
-  void getAccAllAxis(float * res);
+    /**
+     * Get XYZ axis acceleration
+     *
+     * @param res array where acceleration data will be stored
+     */
+    void getAccAllAxis(float * res);
 
 private:
-  I2C m_i2c;
-  int m_addr;
-  void readRegs(int addr, uint8_t * data, int len);
-  void writeRegs(uint8_t * data, int len);
-  int16_t getAccAxis(uint8_t addr);
+    I2C m_i2c;
+    int m_addr;
+    void readRegs(int addr, uint8_t * data, int len);
+    void writeRegs(uint8_t * data, int len);
+    int16_t getAccAxis(uint8_t addr);
+    float getAccAxisF(uint8_t addr);
+    uint8_t _scale;
+    float _step_factor;
+    bool _highres;
 
 };