lib
Revision 0:ecac7a6076f0, committed 2014-11-18
- 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 */
+