Analog Devices 3-axis accelerometer. I2C interface

Committer:
kenjiArai
Date:
Sat Sep 23 22:21:33 2017 +0000
Revision:
0:21a3f84ad1c9
1st rev. I2C interface. Analog Devices 3-axis accelerometer

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:21a3f84ad1c9 1 /*
kenjiArai 0:21a3f84ad1c9 2 * mbed library program
kenjiArai 0:21a3f84ad1c9 3 * ADXL345: 3-axis accelerometer, made by Analog Devices
kenjiArai 0:21a3f84ad1c9 4 * http://www.analog.com/static/imported-files/data_sheets/ADXL345.pdf
kenjiArai 0:21a3f84ad1c9 5 *
kenjiArai 0:21a3f84ad1c9 6 * Copyright (c) 2017 Kenji Arai / JH1PJL
kenjiArai 0:21a3f84ad1c9 7 * http://www.page.sannet.ne.jp/kenjia/index.html
kenjiArai 0:21a3f84ad1c9 8 * http://mbed.org/users/kenjiArai/
kenjiArai 0:21a3f84ad1c9 9 * Modify: August 13th, 2017
kenjiArai 0:21a3f84ad1c9 10 * Revised: September 23rd, 2017
kenjiArai 0:21a3f84ad1c9 11 *
kenjiArai 0:21a3f84ad1c9 12 */
kenjiArai 0:21a3f84ad1c9 13
kenjiArai 0:21a3f84ad1c9 14 #ifndef ADXL345_H
kenjiArai 0:21a3f84ad1c9 15 #define ADXL345_H
kenjiArai 0:21a3f84ad1c9 16
kenjiArai 0:21a3f84ad1c9 17 #include "mbed.h"
kenjiArai 0:21a3f84ad1c9 18
kenjiArai 0:21a3f84ad1c9 19 // ADXL345 Address
kenjiArai 0:21a3f84ad1c9 20 // 7bit address = 0x1D or 0x53 (depends on ALT ADDRESS pin)
kenjiArai 0:21a3f84ad1c9 21 #define ADXL345_G_CHIP_ADDR (0x53 << 1) // ALT ADDRESS = Ground
kenjiArai 0:21a3f84ad1c9 22 #define ADXL345_V_CHIP_ADDR (0x1D << 1) // ALT ADDRESS = Vdd
kenjiArai 0:21a3f84ad1c9 23
kenjiArai 0:21a3f84ad1c9 24 // ADXL345 ID
kenjiArai 0:21a3f84ad1c9 25 #define ADXL345_DEVICE_ID 0xE5
kenjiArai 0:21a3f84ad1c9 26
kenjiArai 0:21a3f84ad1c9 27 // Register's definition
kenjiArai 0:21a3f84ad1c9 28 #define ADXL345_DEVID 0x00
kenjiArai 0:21a3f84ad1c9 29 #define ADXL345_THRESH_TAP 0x1D
kenjiArai 0:21a3f84ad1c9 30 #define ADXL345_OFSX 0x1E
kenjiArai 0:21a3f84ad1c9 31 #define ADXL345_OFSY 0x1F
kenjiArai 0:21a3f84ad1c9 32 #define ADXL345_OFSZ 0x20
kenjiArai 0:21a3f84ad1c9 33 #define ADXL345_DUR 0x21
kenjiArai 0:21a3f84ad1c9 34 #define ADXL345_LATENT 0x22
kenjiArai 0:21a3f84ad1c9 35 #define ADXL345_WINDOW 0x23
kenjiArai 0:21a3f84ad1c9 36 #define ADXL345_THRESH_ACT 0x24
kenjiArai 0:21a3f84ad1c9 37 #define ADXL345_THRESH_INACT 0x25
kenjiArai 0:21a3f84ad1c9 38 #define ADXL345_TIME_INACT 0x26
kenjiArai 0:21a3f84ad1c9 39 #define ADXL345_ACT_INACT_CTL 0x27
kenjiArai 0:21a3f84ad1c9 40 #define ADXL345_THRESH_FF 0x28
kenjiArai 0:21a3f84ad1c9 41 #define ADXL345_TIME_FF 0x29
kenjiArai 0:21a3f84ad1c9 42 #define ADXL345_TAP_AXES 0x2A
kenjiArai 0:21a3f84ad1c9 43 #define ADXL345_ACT_TAP_STATUS 0x2B
kenjiArai 0:21a3f84ad1c9 44 #define ADXL345_BW_RATE 0x2C
kenjiArai 0:21a3f84ad1c9 45 #define ADXL345_POWER_CTL 0x2D
kenjiArai 0:21a3f84ad1c9 46 #define ADXL345_INT_ENABLE 0x2E
kenjiArai 0:21a3f84ad1c9 47 #define ADXL345_INT_MAP 0x2F
kenjiArai 0:21a3f84ad1c9 48 #define ADXL345_INT_SOURCE 0x30
kenjiArai 0:21a3f84ad1c9 49 #define ADXL345_DATA_FORMAT 0x31
kenjiArai 0:21a3f84ad1c9 50 #define ADXL345_DATAX0 0x32
kenjiArai 0:21a3f84ad1c9 51 #define ADXL345_DATAX1 0x33
kenjiArai 0:21a3f84ad1c9 52 #define ADXL345_DATAY0 0x34
kenjiArai 0:21a3f84ad1c9 53 #define ADXL345_DATAY1 0x35
kenjiArai 0:21a3f84ad1c9 54 #define ADXL345_DATAZ0 0x36
kenjiArai 0:21a3f84ad1c9 55 #define ADXL345_DATAZ1 0x37
kenjiArai 0:21a3f84ad1c9 56 #define ADXL345_FIFO_CTL 0x38
kenjiArai 0:21a3f84ad1c9 57 #define ADXL345_FIFO_STATUS 0x39
kenjiArai 0:21a3f84ad1c9 58
kenjiArai 0:21a3f84ad1c9 59 // Data Rate
kenjiArai 0:21a3f84ad1c9 60 #define ADXL345_LOW_PWR 0x10
kenjiArai 0:21a3f84ad1c9 61 #define ADXL345_NOT_LOW_PWR 0x00
kenjiArai 0:21a3f84ad1c9 62 #define ADXL345_DR_R10HZ 0x00
kenjiArai 0:21a3f84ad1c9 63 #define ADXL345_DR_R20HZ 0x01
kenjiArai 0:21a3f84ad1c9 64 #define ADXL345_DR_R39HZ 0x02
kenjiArai 0:21a3f84ad1c9 65 #define ADXL345_DR_R78HZ 0x03
kenjiArai 0:21a3f84ad1c9 66 #define ADXL345_DR_1R56HZ 0x04
kenjiArai 0:21a3f84ad1c9 67 #define ADXL345_DR_3R13HZ 0x05
kenjiArai 0:21a3f84ad1c9 68 #define ADXL345_DR_6R25HZ 0x06
kenjiArai 0:21a3f84ad1c9 69 #define ADXL345_DR_12R5HZ 0x07
kenjiArai 0:21a3f84ad1c9 70 #define ADXL345_DR_25HZ 0x08
kenjiArai 0:21a3f84ad1c9 71 #define ADXL345_DR_50HZ 0x09
kenjiArai 0:21a3f84ad1c9 72 #define ADXL345_DR_100HZ 0x0A
kenjiArai 0:21a3f84ad1c9 73 #define ADXL345_DR_200HZ 0x0B
kenjiArai 0:21a3f84ad1c9 74 #define ADXL345_DR_400HZ 0x0C
kenjiArai 0:21a3f84ad1c9 75 #define ADXL345_DR_800HZ 0x0D
kenjiArai 0:21a3f84ad1c9 76 #define ADXL345_DR_1R6KHZ 0x0E
kenjiArai 0:21a3f84ad1c9 77 #define ADXL345_DR_3R2KHZ 0x0F
kenjiArai 0:21a3f84ad1c9 78
kenjiArai 0:21a3f84ad1c9 79 // FIFO Mode
kenjiArai 0:21a3f84ad1c9 80 #define ADXL345_FIFO_BYPASS 0x00 // Not use FIFO
kenjiArai 0:21a3f84ad1c9 81 #define ADXL345_FIFO_FIFO 0x40 // FIFO collects 32 then stop
kenjiArai 0:21a3f84ad1c9 82 #define ADXL345_FIFO_STREAM 0x80 // last 32 & continue sampling
kenjiArai 0:21a3f84ad1c9 83 #define ADXL345_FIFO_TRIGER 0xC0 // Start by trigger
kenjiArai 0:21a3f84ad1c9 84
kenjiArai 0:21a3f84ad1c9 85 // FIFO Trigger Source
kenjiArai 0:21a3f84ad1c9 86 #define ADXL345_FIFO_TRG_INT1 0x00
kenjiArai 0:21a3f84ad1c9 87 #define ADXL345_FIFO_TRG_INT2 0x20
kenjiArai 0:21a3f84ad1c9 88
kenjiArai 0:21a3f84ad1c9 89 // FIFO Trigger Source
kenjiArai 0:21a3f84ad1c9 90 #define ADXL345_FIFO_SAMPLES 0x31 // default value
kenjiArai 0:21a3f84ad1c9 91
kenjiArai 0:21a3f84ad1c9 92 // Full Scale
kenjiArai 0:21a3f84ad1c9 93 #define ADXL345_FS_2G 0x00
kenjiArai 0:21a3f84ad1c9 94 #define ADXL345_FS_4G 0x01
kenjiArai 0:21a3f84ad1c9 95 #define ADXL345_FS_8G 0x02
kenjiArai 0:21a3f84ad1c9 96 #define ADXL345_FS_16G 0x03
kenjiArai 0:21a3f84ad1c9 97 #define ADXL345_FULL_RES_16G 0x0B
kenjiArai 0:21a3f84ad1c9 98
kenjiArai 0:21a3f84ad1c9 99 /** Interface for Analog Devices : 3-axis accelerometer
kenjiArai 0:21a3f84ad1c9 100 * Chip: ADXL345
kenjiArai 0:21a3f84ad1c9 101 *
kenjiArai 0:21a3f84ad1c9 102 * @code
kenjiArai 0:21a3f84ad1c9 103 * #include "mbed.h"
kenjiArai 0:21a3f84ad1c9 104 *
kenjiArai 0:21a3f84ad1c9 105 * // I2C Communication
kenjiArai 0:21a3f84ad1c9 106 * I2C i2c(D14,D15); // SDA, SCL
kenjiArai 0:21a3f84ad1c9 107 * ADXL345 acc(i2c);
kenjiArai 0:21a3f84ad1c9 108 *
kenjiArai 0:21a3f84ad1c9 109 * int main() {
kenjiArai 0:21a3f84ad1c9 110 * float f[3];
kenjiArai 0:21a3f84ad1c9 111 * while(1){
kenjiArai 0:21a3f84ad1c9 112 * acc.read_data(f);
kenjiArai 0:21a3f84ad1c9 113 * }
kenjiArai 0:21a3f84ad1c9 114 * }
kenjiArai 0:21a3f84ad1c9 115 * @endcode
kenjiArai 0:21a3f84ad1c9 116 */
kenjiArai 0:21a3f84ad1c9 117
kenjiArai 0:21a3f84ad1c9 118 class ADXL345
kenjiArai 0:21a3f84ad1c9 119 {
kenjiArai 0:21a3f84ad1c9 120 public:
kenjiArai 0:21a3f84ad1c9 121 /** Configure data pin (with other devices on I2C line)
kenjiArai 0:21a3f84ad1c9 122 * @param I2C PinName SDA &SDL
kenjiArai 0:21a3f84ad1c9 123 * @param device address
kenjiArai 0:21a3f84ad1c9 124 * @param output data rate selection, power down mode, 0.1Hz to 3.2KHz
kenjiArai 0:21a3f84ad1c9 125 * @param full scale selection, +/-2g to +/-16g
kenjiArai 0:21a3f84ad1c9 126 */
kenjiArai 0:21a3f84ad1c9 127 ADXL345(PinName p_sda, PinName p_scl,
kenjiArai 0:21a3f84ad1c9 128 uint8_t addr, uint8_t data_rate, uint8_t fullscale);
kenjiArai 0:21a3f84ad1c9 129
kenjiArai 0:21a3f84ad1c9 130 /** Configure data pin (with other devices on I2C line)
kenjiArai 0:21a3f84ad1c9 131 * @param I2C previous definition
kenjiArai 0:21a3f84ad1c9 132 * @param device address
kenjiArai 0:21a3f84ad1c9 133 */
kenjiArai 0:21a3f84ad1c9 134 ADXL345(PinName p_sda, PinName p_scl, uint8_t addr);
kenjiArai 0:21a3f84ad1c9 135
kenjiArai 0:21a3f84ad1c9 136 /** Configure data pin (with other devices on I2C line)
kenjiArai 0:21a3f84ad1c9 137 * @param I2C previous definition
kenjiArai 0:21a3f84ad1c9 138 */
kenjiArai 0:21a3f84ad1c9 139 ADXL345(PinName p_sda, PinName p_scl);
kenjiArai 0:21a3f84ad1c9 140
kenjiArai 0:21a3f84ad1c9 141 /** Configure data pin (with other devices on I2C line)
kenjiArai 0:21a3f84ad1c9 142 * @param I2C previous definition
kenjiArai 0:21a3f84ad1c9 143 * @param device address
kenjiArai 0:21a3f84ad1c9 144 * @param output data rate selection, power down mode, 0.1Hz to 3.2KHz
kenjiArai 0:21a3f84ad1c9 145 * @param full scale selection, +/-2g to +/-16g
kenjiArai 0:21a3f84ad1c9 146 */
kenjiArai 0:21a3f84ad1c9 147 ADXL345(I2C& p_i2c,
kenjiArai 0:21a3f84ad1c9 148 uint8_t addr, uint8_t data_rate, uint8_t fullscale);
kenjiArai 0:21a3f84ad1c9 149
kenjiArai 0:21a3f84ad1c9 150 /** Configure data pin (with other devices on I2C line)
kenjiArai 0:21a3f84ad1c9 151 * @param I2C previous definition
kenjiArai 0:21a3f84ad1c9 152 * @default output data rate selection = 100Hz
kenjiArai 0:21a3f84ad1c9 153 * @default full scale selection = +/-2g
kenjiArai 0:21a3f84ad1c9 154 */
kenjiArai 0:21a3f84ad1c9 155 ADXL345(I2C& p_i2c, uint8_t addr);
kenjiArai 0:21a3f84ad1c9 156
kenjiArai 0:21a3f84ad1c9 157 /** Configure data pin (with other devices on I2C line)
kenjiArai 0:21a3f84ad1c9 158 * @param I2C previous definition
kenjiArai 0:21a3f84ad1c9 159 * @default address check both G & V
kenjiArai 0:21a3f84ad1c9 160 * @default output data rate selection = 100Hz
kenjiArai 0:21a3f84ad1c9 161 * @default full scale selection = +/-2g
kenjiArai 0:21a3f84ad1c9 162 */
kenjiArai 0:21a3f84ad1c9 163 ADXL345(I2C& p_i2c);
kenjiArai 0:21a3f84ad1c9 164
kenjiArai 0:21a3f84ad1c9 165 /** Read a float type data from acc
kenjiArai 0:21a3f84ad1c9 166 * @param float type of three arry's address, e.g. float dt_usr[3];
kenjiArai 0:21a3f84ad1c9 167 * @return acc motion data unit: m/s/s(m/s2)
kenjiArai 0:21a3f84ad1c9 168 * @return dt_usr[0]->x, dt_usr[1]->y, dt_usr[2]->z
kenjiArai 0:21a3f84ad1c9 169 */
kenjiArai 0:21a3f84ad1c9 170 void read_data(float *dt_usr);
kenjiArai 0:21a3f84ad1c9 171
kenjiArai 0:21a3f84ad1c9 172 /** Read a float type data from acc
kenjiArai 0:21a3f84ad1c9 173 * @param float type of three arry's address, e.g. float dt_usr[3];
kenjiArai 0:21a3f84ad1c9 174 * @return acc motion data unit: mg
kenjiArai 0:21a3f84ad1c9 175 * @return dt_usr[0]->x, dt_usr[1]->y, dt_usr[2]->z
kenjiArai 0:21a3f84ad1c9 176 */
kenjiArai 0:21a3f84ad1c9 177 void read_mg_data(float *dt_usr);
kenjiArai 0:21a3f84ad1c9 178
kenjiArai 0:21a3f84ad1c9 179 /** Read a float type data from acc
kenjiArai 0:21a3f84ad1c9 180 * @param float type of three arry's address, e.g. float dt_usr[3];
kenjiArai 0:21a3f84ad1c9 181 * @return acc motion data unit: g
kenjiArai 0:21a3f84ad1c9 182 * @return dt_usr[0]->x, dt_usr[1]->y, dt_usr[2]->z
kenjiArai 0:21a3f84ad1c9 183 */
kenjiArai 0:21a3f84ad1c9 184 void read_g_data(float *dt_usr);
kenjiArai 0:21a3f84ad1c9 185
kenjiArai 0:21a3f84ad1c9 186 /** Read a acc ID number
kenjiArai 0:21a3f84ad1c9 187 * @param none
kenjiArai 0:21a3f84ad1c9 188 * @return ID is okay (I_AM_ ADXL345(0x33)) or not
kenjiArai 0:21a3f84ad1c9 189 */
kenjiArai 0:21a3f84ad1c9 190 uint8_t read_id();
kenjiArai 0:21a3f84ad1c9 191
kenjiArai 0:21a3f84ad1c9 192 /** Read Data Ready flag
kenjiArai 0:21a3f84ad1c9 193 * @param none
kenjiArai 0:21a3f84ad1c9 194 * @return true = Ready
kenjiArai 0:21a3f84ad1c9 195 */
kenjiArai 0:21a3f84ad1c9 196 bool data_ready();
kenjiArai 0:21a3f84ad1c9 197
kenjiArai 0:21a3f84ad1c9 198 /** Set I2C clock frequency
kenjiArai 0:21a3f84ad1c9 199 * @param freq.
kenjiArai 0:21a3f84ad1c9 200 * @return none
kenjiArai 0:21a3f84ad1c9 201 */
kenjiArai 0:21a3f84ad1c9 202 void frequency(int hz);
kenjiArai 0:21a3f84ad1c9 203
kenjiArai 0:21a3f84ad1c9 204 /** Read register (general purpose)
kenjiArai 0:21a3f84ad1c9 205 * @param register's address
kenjiArai 0:21a3f84ad1c9 206 * @return register data
kenjiArai 0:21a3f84ad1c9 207 */
kenjiArai 0:21a3f84ad1c9 208 uint8_t read_reg(uint8_t addr);
kenjiArai 0:21a3f84ad1c9 209
kenjiArai 0:21a3f84ad1c9 210 /** Write register (general purpose)
kenjiArai 0:21a3f84ad1c9 211 * @param register's address
kenjiArai 0:21a3f84ad1c9 212 * @param data
kenjiArai 0:21a3f84ad1c9 213 * @return none
kenjiArai 0:21a3f84ad1c9 214 */
kenjiArai 0:21a3f84ad1c9 215 void write_reg(uint8_t addr, uint8_t data);
kenjiArai 0:21a3f84ad1c9 216
kenjiArai 0:21a3f84ad1c9 217 /** data print for debug
kenjiArai 0:21a3f84ad1c9 218 * @param none
kenjiArai 0:21a3f84ad1c9 219 * @return none
kenjiArai 0:21a3f84ad1c9 220 */
kenjiArai 0:21a3f84ad1c9 221 void debug_print(void);
kenjiArai 0:21a3f84ad1c9 222
kenjiArai 0:21a3f84ad1c9 223 /** Self-Test Feature
kenjiArai 0:21a3f84ad1c9 224 * @param none
kenjiArai 0:21a3f84ad1c9 225 * @return none
kenjiArai 0:21a3f84ad1c9 226 */
kenjiArai 0:21a3f84ad1c9 227 void self_test(void);
kenjiArai 0:21a3f84ad1c9 228
kenjiArai 0:21a3f84ad1c9 229 protected:
kenjiArai 0:21a3f84ad1c9 230 void initialize(uint8_t, uint8_t, uint8_t);
kenjiArai 0:21a3f84ad1c9 231 void read_reg_data(char *data);
kenjiArai 0:21a3f84ad1c9 232 void read_mg_g_data(float *dt_usr, uint8_t n);
kenjiArai 0:21a3f84ad1c9 233
kenjiArai 0:21a3f84ad1c9 234 I2C *_i2c_p;
kenjiArai 0:21a3f84ad1c9 235 I2C &_i2c;
kenjiArai 0:21a3f84ad1c9 236
kenjiArai 0:21a3f84ad1c9 237 private:
kenjiArai 0:21a3f84ad1c9 238 float fs_factor; // full scale factor
kenjiArai 0:21a3f84ad1c9 239 char dt[2]; // working buffer
kenjiArai 0:21a3f84ad1c9 240 uint8_t acc_addr; // acc sensor address
kenjiArai 0:21a3f84ad1c9 241 uint8_t acc_id; // acc ID
kenjiArai 0:21a3f84ad1c9 242 bool acc_ready; // acc is on I2C line = 1, not = 0
kenjiArai 0:21a3f84ad1c9 243 uint8_t setting_data[4]; // Reg. recovery data
kenjiArai 0:21a3f84ad1c9 244
kenjiArai 0:21a3f84ad1c9 245 };
kenjiArai 0:21a3f84ad1c9 246
kenjiArai 0:21a3f84ad1c9 247 #endif // ADXL345_H