lib

Committer:
peterswanson87
Date:
Tue Nov 18 18:49:19 2014 +0000
Revision:
0:ecac7a6076f0
yup

Who changed what in which revision?

UserRevisionLine numberNew contents of line
peterswanson87 0:ecac7a6076f0 1 #ifndef H3LIS331_H
peterswanson87 0:ecac7a6076f0 2 #define H3LIS331_H
peterswanson87 0:ecac7a6076f0 3
peterswanson87 0:ecac7a6076f0 4 /**
peterswanson87 0:ecac7a6076f0 5 * Includes
peterswanson87 0:ecac7a6076f0 6 */
peterswanson87 0:ecac7a6076f0 7 #include "mbed.h"
peterswanson87 0:ecac7a6076f0 8
peterswanson87 0:ecac7a6076f0 9 /**
peterswanson87 0:ecac7a6076f0 10 * Defines
peterswanson87 0:ecac7a6076f0 11 */
peterswanson87 0:ecac7a6076f0 12 #define H3LIS331_I2C_ADDRESS 0x18 //7-bit address.
peterswanson87 0:ecac7a6076f0 13
peterswanson87 0:ecac7a6076f0 14 //-----------
peterswanson87 0:ecac7a6076f0 15 // Registers
peterswanson87 0:ecac7a6076f0 16 //-----------
peterswanson87 0:ecac7a6076f0 17 #define WHO_AM_I_REG_H3LIS331 0x0F
peterswanson87 0:ecac7a6076f0 18 #define ACCEL_XOUT_H_REG 0x29
peterswanson87 0:ecac7a6076f0 19 #define ACCEL_XOUT_L_REG 0x28
peterswanson87 0:ecac7a6076f0 20 #define ACCEL_YOUT_H_REG 0x2B
peterswanson87 0:ecac7a6076f0 21 #define ACCEL_YOUT_L_REG 0x2A
peterswanson87 0:ecac7a6076f0 22 #define ACCEL_ZOUT_H_REG 0x2D
peterswanson87 0:ecac7a6076f0 23 #define ACCEL_ZOUT_L_REG 0x2C
peterswanson87 0:ecac7a6076f0 24
peterswanson87 0:ecac7a6076f0 25
peterswanson87 0:ecac7a6076f0 26
peterswanson87 0:ecac7a6076f0 27 #define CTRL_REG_1 0x20
peterswanson87 0:ecac7a6076f0 28 #define CTRL_REG_2 0x21
peterswanson87 0:ecac7a6076f0 29 #define CTRL_REG_3 0x22
peterswanson87 0:ecac7a6076f0 30 #define CTRL_REG_4 0x23
peterswanson87 0:ecac7a6076f0 31 #define CTRL_REG_5 0x24
peterswanson87 0:ecac7a6076f0 32
peterswanson87 0:ecac7a6076f0 33 #define STATUS_REG 0x27
peterswanson87 0:ecac7a6076f0 34
peterswanson87 0:ecac7a6076f0 35 #define INT1_CFG 0x30
peterswanson87 0:ecac7a6076f0 36 #define INT1_SRC 0x31
peterswanson87 0:ecac7a6076f0 37 #define INT1_THS 0x32
peterswanson87 0:ecac7a6076f0 38 #define INT1_DURATION 0x33
peterswanson87 0:ecac7a6076f0 39 #define INT2_CFG 0x34
peterswanson87 0:ecac7a6076f0 40 #define INT2_SRC 0x35
peterswanson87 0:ecac7a6076f0 41 #define INT2_THS 0x36
peterswanson87 0:ecac7a6076f0 42 #define INT2_DURATION 0x37
peterswanson87 0:ecac7a6076f0 43
peterswanson87 0:ecac7a6076f0 44 //------------------------------
peterswanson87 0:ecac7a6076f0 45 // Power Mode and Output Data Rates
peterswanson87 0:ecac7a6076f0 46 //------------------------------
peterswanson87 0:ecac7a6076f0 47 #define POWER_DOWN 0x00
peterswanson87 0:ecac7a6076f0 48 #define NORMAL_50HZ 0x27
peterswanson87 0:ecac7a6076f0 49 #define NORMAL_100HZ 0x2F
peterswanson87 0:ecac7a6076f0 50 #define NORMAL_400HZ 0x37
peterswanson87 0:ecac7a6076f0 51 #define NORMAL_1000HZ 0x3F
peterswanson87 0:ecac7a6076f0 52 #define LOW_POWER_0_5HZ 0x47
peterswanson87 0:ecac7a6076f0 53 #define LOW_POWER_1HZ 0x67
peterswanson87 0:ecac7a6076f0 54 #define LOW_POWER_2HZ 0x87
peterswanson87 0:ecac7a6076f0 55 #define LOW_POWER_5HZ 0xA7
peterswanson87 0:ecac7a6076f0 56 #define LOW_POWER_10HZ 0xC7
peterswanson87 0:ecac7a6076f0 57
peterswanson87 0:ecac7a6076f0 58 /**
peterswanson87 0:ecac7a6076f0 59 * H3LIS331 triple axis digital accelerometer.
peterswanson87 0:ecac7a6076f0 60 */
peterswanson87 0:ecac7a6076f0 61 class H3LIS331 {
peterswanson87 0:ecac7a6076f0 62
peterswanson87 0:ecac7a6076f0 63 public:
peterswanson87 0:ecac7a6076f0 64
peterswanson87 0:ecac7a6076f0 65 /**
peterswanson87 0:ecac7a6076f0 66 * Constructor.
peterswanson87 0:ecac7a6076f0 67 *
peterswanson87 0:ecac7a6076f0 68 * Sets FS_SEL to 0x03 for proper opertaion.
peterswanson87 0:ecac7a6076f0 69 *
peterswanson87 0:ecac7a6076f0 70 * @param sda - mbed pin to use for the SDA I2C line.
peterswanson87 0:ecac7a6076f0 71 * @param scl - mbed pin to use for the SCL I2C line.
peterswanson87 0:ecac7a6076f0 72 */
peterswanson87 0:ecac7a6076f0 73 H3LIS331(PinName sda, PinName scl);
peterswanson87 0:ecac7a6076f0 74
peterswanson87 0:ecac7a6076f0 75 /**
peterswanson87 0:ecac7a6076f0 76 * Get the identity of the device.
peterswanson87 0:ecac7a6076f0 77 *
peterswanson87 0:ecac7a6076f0 78 * @return The contents of the Who Am I register which contains the I2C
peterswanson87 0:ecac7a6076f0 79 * address of the device.
peterswanson87 0:ecac7a6076f0 80 */
peterswanson87 0:ecac7a6076f0 81 char getWhoAmI(void);
peterswanson87 0:ecac7a6076f0 82
peterswanson87 0:ecac7a6076f0 83
peterswanson87 0:ecac7a6076f0 84
peterswanson87 0:ecac7a6076f0 85
peterswanson87 0:ecac7a6076f0 86
peterswanson87 0:ecac7a6076f0 87
peterswanson87 0:ecac7a6076f0 88
peterswanson87 0:ecac7a6076f0 89
peterswanson87 0:ecac7a6076f0 90
peterswanson87 0:ecac7a6076f0 91 /**
peterswanson87 0:ecac7a6076f0 92 * Set the power mode (power down, low power, normal mode)
peterswanson87 0:ecac7a6076f0 93 *
peterswanson87 0:ecac7a6076f0 94 *
peterswanson87 0:ecac7a6076f0 95 * @param
peterswanson87 0:ecac7a6076f0 96 *
peterswanson87 0:ecac7a6076f0 97 * Power Mode | Output Data Rate (Hz) | Low-pass Filter Cut off (Hz) | #define
peterswanson87 0:ecac7a6076f0 98 * --------------------------------------------------------------------------------
peterswanson87 0:ecac7a6076f0 99 * Power-down | -- | -- | POWER_DOWN
peterswanson87 0:ecac7a6076f0 100 * Normal | 50 | 37 | NORMAL_50HZ
peterswanson87 0:ecac7a6076f0 101 * Normal | 100 | 74 | NORMAL_100HZ
peterswanson87 0:ecac7a6076f0 102 * Normal | 400 | 292 | NORMAL_400HZ
peterswanson87 0:ecac7a6076f0 103 * Normal | 1000 | 780 | NORMAL_1000HZ
peterswanson87 0:ecac7a6076f0 104 * Low-power | 0.5 | -- | LOW_POWER_0_5HZ
peterswanson87 0:ecac7a6076f0 105 * Low-power | 1 | -- | LOW_POWER_1HZ
peterswanson87 0:ecac7a6076f0 106 * Low-power | 2 | -- | LOW_POWER_2HZ
peterswanson87 0:ecac7a6076f0 107 * Low-power | 5 | -- | LOW_POWER_5HZ
peterswanson87 0:ecac7a6076f0 108 * Low-power | 10 | -- | LOW_POWER_10HZ
peterswanson87 0:ecac7a6076f0 109 */
peterswanson87 0:ecac7a6076f0 110
peterswanson87 0:ecac7a6076f0 111 void setPowerMode(char power_mode);
peterswanson87 0:ecac7a6076f0 112
peterswanson87 0:ecac7a6076f0 113
peterswanson87 0:ecac7a6076f0 114
peterswanson87 0:ecac7a6076f0 115 /**
peterswanson87 0:ecac7a6076f0 116 * Get the current power mode
peterswanson87 0:ecac7a6076f0 117 *
peterswanson87 0:ecac7a6076f0 118 * @return
peterswanson87 0:ecac7a6076f0 119 */
peterswanson87 0:ecac7a6076f0 120 char getPowerMode(void);
peterswanson87 0:ecac7a6076f0 121
peterswanson87 0:ecac7a6076f0 122
peterswanson87 0:ecac7a6076f0 123 char getInterruptConfiguration(void);
peterswanson87 0:ecac7a6076f0 124
peterswanson87 0:ecac7a6076f0 125 /**
peterswanson87 0:ecac7a6076f0 126 * Set the interrupt configuration.
peterswanson87 0:ecac7a6076f0 127 *
peterswanson87 0:ecac7a6076f0 128 * See datasheet for configuration byte details.
peterswanson87 0:ecac7a6076f0 129 *
peterswanson87 0:ecac7a6076f0 130 * 7 6 5 4
peterswanson87 0:ecac7a6076f0 131 * +-------+-------+------+--------+
peterswanson87 0:ecac7a6076f0 132 * | IHL | PP_OD | LIR2 | I2_CFG |
peterswanson87 0:ecac7a6076f0 133 * +-------+-------+------+--------+
peterswanson87 0:ecac7a6076f0 134 *
peterswanson87 0:ecac7a6076f0 135 * 3 2 1 0
peterswanson87 0:ecac7a6076f0 136 * +---------+------+---------+---------+
peterswanson87 0:ecac7a6076f0 137 * | I2_CFG0 | LIR1 | I1_CFG1 | I1-CFG0 |
peterswanson87 0:ecac7a6076f0 138 * +---------+------+---------+---------+
peterswanson87 0:ecac7a6076f0 139 *
peterswanson87 0:ecac7a6076f0 140 * IHL Interrupt active high or low. 0:active high; 1:active low (default:0)
peterswanson87 0:ecac7a6076f0 141 * PP_OD Push-pull/Open drain selection on interrupt pad. 0:push-pull; 1:open drain (default:0)
peterswanson87 0:ecac7a6076f0 142 * LIR2 Latch interupt request on INT2_SRC register, with INT2_SRC register cleared by reading INT2_SRC itself
peterswanson87 0:ecac7a6076f0 143 * 0: irq not latched; 1:irq latched (default:0)
peterswanson87 0:ecac7a6076f0 144 * I2_CFG1, I2_CFG0 See datasheet table
peterswanson87 0:ecac7a6076f0 145 * LIR1 Latch interupt request on INT1_SRC register, with INT1_SRC register cleared by reading INT1_SRC itself
peterswanson87 0:ecac7a6076f0 146 * 0: irq not latched; 1:irq latched (default:0)
peterswanson87 0:ecac7a6076f0 147 * I1_CFG1, I1_CFG0 See datasheet table
peterswanson87 0:ecac7a6076f0 148 *
peterswanson87 0:ecac7a6076f0 149 * @param config Configuration byte to write to INT_CFG register.
peterswanson87 0:ecac7a6076f0 150 */
peterswanson87 0:ecac7a6076f0 151
peterswanson87 0:ecac7a6076f0 152
peterswanson87 0:ecac7a6076f0 153 // void setInterruptConfiguration(char config);
peterswanson87 0:ecac7a6076f0 154
peterswanson87 0:ecac7a6076f0 155 /**
peterswanson87 0:ecac7a6076f0 156 * Check the status register
peterswanson87 0:ecac7a6076f0 157 *
peterswanson87 0:ecac7a6076f0 158 * @return
peterswanson87 0:ecac7a6076f0 159 *
peterswanson87 0:ecac7a6076f0 160 */
peterswanson87 0:ecac7a6076f0 161
peterswanson87 0:ecac7a6076f0 162
peterswanson87 0:ecac7a6076f0 163 /**
peterswanson87 0:ecac7a6076f0 164 * Set the Full Scale Range to +/- 400g's.
peterswanson87 0:ecac7a6076f0 165 *
peterswanson87 0:ecac7a6076f0 166 */
peterswanson87 0:ecac7a6076f0 167 void setFullScaleRange400g(void);
peterswanson87 0:ecac7a6076f0 168
peterswanson87 0:ecac7a6076f0 169 /**
peterswanson87 0:ecac7a6076f0 170 * Set the Full Scale Range to +/- 200g's.
peterswanson87 0:ecac7a6076f0 171 *
peterswanson87 0:ecac7a6076f0 172 */
peterswanson87 0:ecac7a6076f0 173 void setFullScaleRange200g(void);
peterswanson87 0:ecac7a6076f0 174
peterswanson87 0:ecac7a6076f0 175 /**
peterswanson87 0:ecac7a6076f0 176 * Set the Full Scale Range to +/- 100g's.
peterswanson87 0:ecac7a6076f0 177 *
peterswanson87 0:ecac7a6076f0 178 */
peterswanson87 0:ecac7a6076f0 179 void setFullScaleRange100g(void);
peterswanson87 0:ecac7a6076f0 180
peterswanson87 0:ecac7a6076f0 181
peterswanson87 0:ecac7a6076f0 182 char getAccelStatus(void);
peterswanson87 0:ecac7a6076f0 183
peterswanson87 0:ecac7a6076f0 184
peterswanson87 0:ecac7a6076f0 185
peterswanson87 0:ecac7a6076f0 186
peterswanson87 0:ecac7a6076f0 187 /**
peterswanson87 0:ecac7a6076f0 188 * Get the output for the x-axis accelerometer.
peterswanson87 0:ecac7a6076f0 189 *
peterswanson87 0:ecac7a6076f0 190 * @return The output on the x-axis in engineering units (g's).
peterswanson87 0:ecac7a6076f0 191 */
peterswanson87 0:ecac7a6076f0 192 float getAccelX(void);
peterswanson87 0:ecac7a6076f0 193
peterswanson87 0:ecac7a6076f0 194 /**
peterswanson87 0:ecac7a6076f0 195 * Get the output for the y-axis accelerometer.
peterswanson87 0:ecac7a6076f0 196 *
peterswanson87 0:ecac7a6076f0 197 * @return The output on the y-axis in engineering units (g's).
peterswanson87 0:ecac7a6076f0 198 */
peterswanson87 0:ecac7a6076f0 199 float getAccelY(void);
peterswanson87 0:ecac7a6076f0 200
peterswanson87 0:ecac7a6076f0 201 /**
peterswanson87 0:ecac7a6076f0 202 * Get the output on the z-axis accelerometer.
peterswanson87 0:ecac7a6076f0 203 *
peterswanson87 0:ecac7a6076f0 204 * @return The output on the z-axis in engineering units (g's).
peterswanson87 0:ecac7a6076f0 205 */
peterswanson87 0:ecac7a6076f0 206 float getAccelZ(void);
peterswanson87 0:ecac7a6076f0 207
peterswanson87 0:ecac7a6076f0 208
peterswanson87 0:ecac7a6076f0 209 private:
peterswanson87 0:ecac7a6076f0 210
peterswanson87 0:ecac7a6076f0 211 float scaling_factor;
peterswanson87 0:ecac7a6076f0 212 int current_range;
peterswanson87 0:ecac7a6076f0 213
peterswanson87 0:ecac7a6076f0 214 I2C i2c_;
peterswanson87 0:ecac7a6076f0 215
peterswanson87 0:ecac7a6076f0 216 };
peterswanson87 0:ecac7a6076f0 217
peterswanson87 0:ecac7a6076f0 218 #endif /* H3LIS331_H */
peterswanson87 0:ecac7a6076f0 219