lib

Files at this revision

API Documentation at this revision

Comitter:
peterswanson87
Date:
Tue Nov 18 18:49:19 2014 +0000
Commit message:
yup

Changed in this revision

H3LIS331.cpp Show annotated file Show diff for this revision Revisions of this file
H3LIS331.h Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/H3LIS331.cpp	Tue Nov 18 18:49:19 2014 +0000
@@ -0,0 +1,197 @@
+/**
+ * Includes
+ */
+ 
+#include "H3LIS331.h"
+
+H3LIS331::H3LIS331(PinName sda, PinName scl) : i2c_(sda, scl) {
+    // set default scaling factor
+    scaling_factor = 5140.0;
+    
+    //set default range to zero.
+    //current_range = 0;
+
+    //400kHz, fast mode.
+    i2c_.frequency(400000);
+    
+    
+    //Power Up Device, Set Output data rate, Enable All 3 Axis
+    //See datasheet for details.
+    char tx[2];
+    //char tx2[2];
+    //char rx[1];
+    tx[0] = CTRL_REG_1;
+    //CTRL_REG_1 [00111111] / [0x3F] to power up, set output rate to 1000Hz, and enable all 3 axis.
+    //CTRL_REG_1 [00101111] / [0x2F] to power up, set output rate to 100Hz, and enable all 3 axis.
+    //CTRL_REG_1 [ABCDEFGH] ABC=PowerMode, DE=OutputDataRate, F=Zenable, G=Yenable, H=XEnable
+    tx[1] = 0x2F;
+    i2c_.write((H3LIS331_I2C_ADDRESS << 1) & 0xFE, tx, 2);
+    
+    
+    
+    //set default scale of 4g's
+    //scaling_factor = 8192.0;
+    //current_range = 24;
+    
+    tx[0] = CTRL_REG_4;
+    tx[1] = 0x00;
+        
+    i2c_.write((H3LIS331_I2C_ADDRESS << 1) & 0xFE, tx, 2);
+    
+    
+    
+}
+
+char H3LIS331::getWhoAmI(void){
+
+    //WhoAmI Register address.
+    char tx = WHO_AM_I_REG_H3LIS331;
+    char rx;
+    
+    i2c_.write((H3LIS331_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
+    
+    i2c_.read((H3LIS331_I2C_ADDRESS << 1) | 0x01, &rx, 1);
+    
+    return rx;
+
+}
+
+
+
+
+void H3LIS331::setPowerMode(char power_mode){
+// Currently sets all 3 axis to enabled. Will be set to preserve existing status in future
+    char tx[2];
+    tx[0] = CTRL_REG_1;
+    tx[1] = power_mode;
+
+    i2c_.write((H3LIS331_I2C_ADDRESS << 1) & 0xFE, tx, 2);
+
+}
+
+char H3LIS331::getPowerMode(void){
+
+    char tx = CTRL_REG_1;
+    char rx;
+    
+    i2c_.write((H3LIS331_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
+    
+    i2c_.read((H3LIS331_I2C_ADDRESS << 1) | 0x01, &rx, 1);
+
+    
+    return rx;
+
+}
+
+
+
+char H3LIS331::getInterruptConfiguration(void){
+
+    char tx = CTRL_REG_3;
+    char rx;
+    
+    i2c_.write((H3LIS331_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
+    
+    i2c_.read((H3LIS331_I2C_ADDRESS << 1) | 0x01, &rx, 1);
+    
+    return rx;
+
+}
+
+
+void H3LIS331::setFullScaleRange400g(void){  // Does not preserve rest of CTRL_REG_4!
+    scaling_factor = 81.92;
+    current_range = 400;
+
+    char tx[2];
+    tx[0] = CTRL_REG_4;
+    tx[1] = 0x30;
+        
+    i2c_.write((H3LIS331_I2C_ADDRESS << 1) & 0xFE, tx, 2);
+    
+}
+
+void H3LIS331::setFullScaleRange200g(void){  // Does not preserve rest of CTRL_REG_4!
+    scaling_factor = 163.84;
+    current_range = 200;
+    
+    char tx[2];
+    tx[0] = CTRL_REG_4;
+    tx[1] = 0x10;
+        
+    i2c_.write((H3LIS331_I2C_ADDRESS << 1) & 0xFE, tx, 2);
+    
+}
+    
+
+void H3LIS331::setFullScaleRange100g(void){  // Does not preserve rest of CTRL_REG_4!
+    scaling_factor = 327.68;
+    current_range = 100;
+    
+    char tx[2];
+    tx[0] = CTRL_REG_4;
+    tx[1] = 0x00;
+        
+    i2c_.write((H3LIS331_I2C_ADDRESS << 1) & 0xFE, tx, 2);
+    
+}
+
+
+char H3LIS331::getAccelStatus(void){
+
+    char tx = STATUS_REG;
+    char rx;
+    
+    i2c_.write((H3LIS331_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
+    
+    i2c_.read((H3LIS331_I2C_ADDRESS << 1) | 0x01, &rx, 1);
+    
+    return rx;
+}
+
+
+
+float H3LIS331::getAccelX(void){
+
+    char tx = ACCEL_XOUT_H_REG;
+    char rx[2];
+    
+    i2c_.write((H3LIS331_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
+    
+    i2c_.read((H3LIS331_I2C_ADDRESS << 1) | 0x01, rx, 2);
+    
+    int16_t output = ((int) rx[0] << 8) | ((int) rx[1]);
+
+    return output/scaling_factor;
+    //return output;
+
+}
+
+float H3LIS331::getAccelY(void){
+
+    char tx = ACCEL_YOUT_H_REG;
+    char rx[2];
+    
+    i2c_.write((H3LIS331_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
+    
+    i2c_.read((H3LIS331_I2C_ADDRESS << 1) | 0x01, rx, 2);
+    
+    int16_t output = ((int) rx[0] << 8) | ((int) rx[1]);
+
+    return output/scaling_factor;
+
+}
+
+float H3LIS331::getAccelZ(void){
+
+    char tx = ACCEL_ZOUT_H_REG;
+    char rx[2];
+    
+    i2c_.write((H3LIS331_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
+    
+    i2c_.read((H3LIS331_I2C_ADDRESS << 1) | 0x01, rx, 2);
+    
+    int16_t output = ((int) rx[0] << 8) | ((int) rx[1]);
+
+    return output/scaling_factor;
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/H3LIS331.h	Tue Nov 18 18:49:19 2014 +0000
@@ -0,0 +1,219 @@
+#ifndef H3LIS331_H
+#define H3LIS331_H
+
+/**
+ * Includes
+ */
+#include "mbed.h"
+
+/**
+ * Defines
+ */
+#define H3LIS331_I2C_ADDRESS 0x18 //7-bit address.
+
+//-----------
+// Registers
+//-----------
+#define WHO_AM_I_REG_H3LIS331    0x0F
+#define ACCEL_XOUT_H_REG         0x29
+#define ACCEL_XOUT_L_REG         0x28
+#define ACCEL_YOUT_H_REG         0x2B
+#define ACCEL_YOUT_L_REG         0x2A
+#define ACCEL_ZOUT_H_REG         0x2D
+#define ACCEL_ZOUT_L_REG         0x2C
+
+
+
+#define CTRL_REG_1      0x20
+#define CTRL_REG_2      0x21
+#define CTRL_REG_3      0x22
+#define CTRL_REG_4      0x23
+#define CTRL_REG_5      0x24
+
+#define STATUS_REG      0x27
+
+#define INT1_CFG        0x30
+#define INT1_SRC        0x31
+#define INT1_THS        0x32
+#define INT1_DURATION   0x33
+#define INT2_CFG        0x34
+#define INT2_SRC        0x35
+#define INT2_THS        0x36
+#define INT2_DURATION   0x37
+
+//------------------------------
+// Power Mode and Output Data Rates
+//------------------------------
+#define POWER_DOWN             0x00
+#define NORMAL_50HZ            0x27
+#define NORMAL_100HZ           0x2F
+#define NORMAL_400HZ           0x37
+#define NORMAL_1000HZ          0x3F
+#define LOW_POWER_0_5HZ        0x47
+#define LOW_POWER_1HZ          0x67
+#define LOW_POWER_2HZ          0x87
+#define LOW_POWER_5HZ          0xA7
+#define LOW_POWER_10HZ         0xC7
+
+/**
+ * H3LIS331 triple axis digital accelerometer.
+ */
+class H3LIS331 {
+
+public:
+
+    /**
+     * Constructor.
+     *
+     * Sets FS_SEL to 0x03 for proper opertaion.
+     *
+     * @param sda - mbed pin to use for the SDA I2C line.
+     * @param scl - mbed pin to use for the SCL I2C line.
+     */
+    H3LIS331(PinName sda, PinName scl);
+
+    /**
+     * Get the identity of the device.
+     *
+     * @return The contents of the Who Am I register which contains the I2C
+     *         address of the device.
+     */
+    char getWhoAmI(void);
+
+  
+    
+    
+   
+
+    
+    
+    
+    /**
+     * Set the power mode (power down, low power, normal mode)
+     *
+     *
+     * @param 
+     *
+     *  Power Mode | Output Data Rate (Hz) | Low-pass Filter Cut off (Hz) | #define
+     *  --------------------------------------------------------------------------------
+     *  Power-down |          --           |               --             | POWER_DOWN
+     *    Normal   |          50           |               37             | NORMAL_50HZ
+     *    Normal   |         100           |               74             | NORMAL_100HZ
+     *    Normal   |         400           |              292             | NORMAL_400HZ
+     *    Normal   |        1000           |              780             | NORMAL_1000HZ
+     *   Low-power |         0.5           |               --             | LOW_POWER_0_5HZ
+     *   Low-power |           1           |               --             | LOW_POWER_1HZ
+     *   Low-power |           2           |               --             | LOW_POWER_2HZ
+     *   Low-power |           5           |               --             | LOW_POWER_5HZ
+     *   Low-power |          10           |               --             | LOW_POWER_10HZ
+     */
+    
+    void setPowerMode(char power_mode);
+  
+   
+   
+     /**
+     * Get the current power mode
+     *
+     * @return 
+     */
+    char getPowerMode(void);
+
+    
+   char getInterruptConfiguration(void);
+
+    /**
+     * Set the interrupt configuration.
+     *
+     * See datasheet for configuration byte details.
+     *
+     *    7        6       5      4
+     * +-------+-------+------+--------+
+     * |  IHL  | PP_OD | LIR2 | I2_CFG |
+     * +-------+-------+------+--------+
+     *
+     *      3        2       1         0
+     * +---------+------+---------+---------+
+     * | I2_CFG0 | LIR1 | I1_CFG1 | I1-CFG0 |
+     * +---------+------+---------+---------+
+     *
+     * IHL Interrupt active high or low. 0:active high; 1:active low (default:0)
+     * PP_OD Push-pull/Open drain selection on interrupt pad. 0:push-pull; 1:open drain (default:0)
+     * LIR2 Latch interupt request on INT2_SRC register, with INT2_SRC register cleared by reading INT2_SRC itself
+     *      0: irq not latched; 1:irq latched (default:0)
+     * I2_CFG1, I2_CFG0 See datasheet table
+     * LIR1 Latch interupt request on INT1_SRC register, with INT1_SRC register cleared by reading INT1_SRC itself
+     *      0: irq not latched; 1:irq latched (default:0)
+     * I1_CFG1, I1_CFG0 See datasheet table
+     *
+     * @param config Configuration byte to write to INT_CFG register.
+     */
+   
+   
+   // void setInterruptConfiguration(char config);
+
+    /**
+     * Check the status register
+     *
+     * @return 
+     *
+     */
+     
+     
+    /**
+     * Set the Full Scale Range to +/- 400g's.
+     *
+     */     
+    void setFullScaleRange400g(void);
+
+    /**
+     * Set the Full Scale Range to +/- 200g's.
+     *
+     */     
+    void setFullScaleRange200g(void);
+
+    /**
+     * Set the Full Scale Range to +/- 100g's.
+     *
+     */     
+    void setFullScaleRange100g(void);
+     
+            
+    char getAccelStatus(void);
+
+
+
+
+    /**
+     * Get the output for the x-axis accelerometer.
+     *
+     * @return The output on the x-axis in engineering units (g's).
+     */
+    float getAccelX(void);
+
+    /**
+     * Get the output for the y-axis accelerometer.
+     *
+     * @return The output on the y-axis in engineering units (g's).
+     */
+    float getAccelY(void);
+
+    /**
+     * Get the output on the z-axis accelerometer.
+     * 
+     * @return The output on the z-axis in engineering units (g's).
+     */
+    float getAccelZ(void);
+
+   
+private:
+
+   float scaling_factor;
+   int current_range;
+
+    I2C i2c_;
+
+};
+
+#endif /* H3LIS331_H */
+