IMU

Dependents:   EM_Logger

Committer:
YSB
Date:
Fri Jul 05 04:16:49 2013 +0000
Revision:
0:7b3acf8e2a6f
ADXL345/ITG3200

Who changed what in which revision?

UserRevisionLine numberNew contents of line
YSB 0:7b3acf8e2a6f 1 #include "IMU_I2C.h"
YSB 0:7b3acf8e2a6f 2 #include <math.h>
YSB 0:7b3acf8e2a6f 3 //#include "mbed.h"
YSB 0:7b3acf8e2a6f 4
YSB 0:7b3acf8e2a6f 5 #define GYR_ADDRESS 0xD2
YSB 0:7b3acf8e2a6f 6
YSB 0:7b3acf8e2a6f 7 IMU_I2C::IMU_I2C(PinName sda, PinName scl) : i2c_(sda, scl) {
YSB 0:7b3acf8e2a6f 8
YSB 0:7b3acf8e2a6f 9 ///////////////////ADXL345////////////////////////////////////////////////////
YSB 0:7b3acf8e2a6f 10 //400kHz, allowing us to use the fastest data rates.
YSB 0:7b3acf8e2a6f 11 i2c_.frequency(400000);
YSB 0:7b3acf8e2a6f 12 // initialize the BW data rate
YSB 0:7b3acf8e2a6f 13 char tx[2];
YSB 0:7b3acf8e2a6f 14 tx[0] = ADXL345_BW_RATE_REG;
YSB 0:7b3acf8e2a6f 15 tx[1] = ADXL345_1600HZ; //value greater than or equal to 0x0A is written into the rate bits (Bit D3 through Bit D0) in the BW_RATE register
YSB 0:7b3acf8e2a6f 16 i2c_.write( ADXL345_I2C_WRITE , tx, 2);
YSB 0:7b3acf8e2a6f 17
YSB 0:7b3acf8e2a6f 18 //Data format (for +-16g) - This is done by setting Bit D3 of the DATA_FORMAT register (Address 0x31) and writing a value of 0x03 to the range bits (Bit D1 and Bit D0) of the DATA_FORMAT register (Address 0x31).
YSB 0:7b3acf8e2a6f 19
YSB 0:7b3acf8e2a6f 20 char rx[2];
YSB 0:7b3acf8e2a6f 21 rx[0] = ADXL345_DATA_FORMAT_REG;
YSB 0:7b3acf8e2a6f 22 rx[1] = 0x0B;
YSB 0:7b3acf8e2a6f 23 // full res and +_16g
YSB 0:7b3acf8e2a6f 24 i2c_.write( ADXL345_I2C_WRITE , rx, 2);
YSB 0:7b3acf8e2a6f 25
YSB 0:7b3acf8e2a6f 26 // Set Offset - programmed into the OFSX, OFSY, and OFXZ registers, respectively, as 0xFD, 0x03 and 0xFE.
YSB 0:7b3acf8e2a6f 27 char x[2];
YSB 0:7b3acf8e2a6f 28 x[0] = ADXL345_OFSX_REG ;
YSB 0:7b3acf8e2a6f 29 x[1] = 0xFD;
YSB 0:7b3acf8e2a6f 30 i2c_.write( ADXL345_I2C_WRITE , x, 2);
YSB 0:7b3acf8e2a6f 31 char y[2];
YSB 0:7b3acf8e2a6f 32 y[0] = ADXL345_OFSY_REG ;
YSB 0:7b3acf8e2a6f 33 y[1] = 0x03;
YSB 0:7b3acf8e2a6f 34 i2c_.write( ADXL345_I2C_WRITE , y, 2);
YSB 0:7b3acf8e2a6f 35 char z[2];
YSB 0:7b3acf8e2a6f 36 z[0] = ADXL345_OFSZ_REG ;
YSB 0:7b3acf8e2a6f 37 z[1] = 0xFE;
YSB 0:7b3acf8e2a6f 38 i2c_.write( ADXL345_I2C_WRITE , z, 2);
YSB 0:7b3acf8e2a6f 39
YSB 0:7b3acf8e2a6f 40 //////////////////L3G4200D//////////////////////////////////////////////
YSB 0:7b3acf8e2a6f 41 // Turns on the L3G4200D's gyro and places it in normal mode.
YSB 0:7b3acf8e2a6f 42 // 0x0F = 0b00001111
YSB 0:7b3acf8e2a6f 43 // Normal power mode, all axes enabled
YSB 0:7b3acf8e2a6f 44 writeReg(L3G4200D_CTRL_REG1, 0x0F);
YSB 0:7b3acf8e2a6f 45 writeReg(L3G4200D_CTRL_REG4, 0x20); // 2000 dps full scale_device.frequency(400000);
YSB 0:7b3acf8e2a6f 46 // Turns on the L3G4200D's gyro and places it in normal mode.
YSB 0:7b3acf8e2a6f 47 // 0x0F = 0b00001111
YSB 0:7b3acf8e2a6f 48 // Normal power mode, all axes enabled
YSB 0:7b3acf8e2a6f 49 writeReg(L3G4200D_CTRL_REG1, 0x0F);
YSB 0:7b3acf8e2a6f 50 writeReg(L3G4200D_CTRL_REG4, 0x20); // 2000 dps full scale
YSB 0:7b3acf8e2a6f 51
YSB 0:7b3acf8e2a6f 52 /////////////////ITG3200//////////////////////////////////////////////////
YSB 0:7b3acf8e2a6f 53 //Set FS_SEL to 0x03 for proper operation.
YSB 0:7b3acf8e2a6f 54 //See datasheet for details.
YSB 0:7b3acf8e2a6f 55 char gtx[2];
YSB 0:7b3acf8e2a6f 56 gtx[0] = DLPF_FS_REG;
YSB 0:7b3acf8e2a6f 57 //FS_SEL bits sit in bits 4 and 3 of DLPF_FS register.
YSB 0:7b3acf8e2a6f 58 gtx[1] = 0x03 << 3;
YSB 0:7b3acf8e2a6f 59 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, gtx, 2);
YSB 0:7b3acf8e2a6f 60
YSB 0:7b3acf8e2a6f 61 }
YSB 0:7b3acf8e2a6f 62
YSB 0:7b3acf8e2a6f 63
YSB 0:7b3acf8e2a6f 64 char IMU_I2C::SingleByteRead(char address){
YSB 0:7b3acf8e2a6f 65 char tx = address;
YSB 0:7b3acf8e2a6f 66 char output;
YSB 0:7b3acf8e2a6f 67 i2c_.write( ADXL345_I2C_WRITE , &tx, 1); //tell it what you want to read
YSB 0:7b3acf8e2a6f 68 i2c_.read( ADXL345_I2C_READ , &output, 1); //tell it where to store the data
YSB 0:7b3acf8e2a6f 69 return output;
YSB 0:7b3acf8e2a6f 70
YSB 0:7b3acf8e2a6f 71 }
YSB 0:7b3acf8e2a6f 72
YSB 0:7b3acf8e2a6f 73 int IMU_I2C::SingleByteWrite(char address, char data){
YSB 0:7b3acf8e2a6f 74 int ack = 0;
YSB 0:7b3acf8e2a6f 75 char tx[2];
YSB 0:7b3acf8e2a6f 76 tx[0] = address;
YSB 0:7b3acf8e2a6f 77 tx[1] = data;
YSB 0:7b3acf8e2a6f 78 return ack | i2c_.write( ADXL345_I2C_WRITE , tx, 2);
YSB 0:7b3acf8e2a6f 79 }
YSB 0:7b3acf8e2a6f 80
YSB 0:7b3acf8e2a6f 81 void IMU_I2C::multiByteRead(char address, char* output, int size) {
YSB 0:7b3acf8e2a6f 82 i2c_.write( ADXL345_I2C_WRITE, &address, 1); //tell it where to read from
YSB 0:7b3acf8e2a6f 83 i2c_.read( ADXL345_I2C_READ , output, size); //tell it where to store the data read
YSB 0:7b3acf8e2a6f 84 }
YSB 0:7b3acf8e2a6f 85
YSB 0:7b3acf8e2a6f 86 int IMU_I2C::multiByteWrite(char address, char* ptr_data, int size) {
YSB 0:7b3acf8e2a6f 87 int ack;
YSB 0:7b3acf8e2a6f 88
YSB 0:7b3acf8e2a6f 89 ack = i2c_.write( ADXL345_I2C_WRITE, &address, 1); //tell it where to write to
YSB 0:7b3acf8e2a6f 90 return ack | i2c_.write( ADXL345_I2C_READ, ptr_data, size); //tell it what data to write
YSB 0:7b3acf8e2a6f 91
YSB 0:7b3acf8e2a6f 92 }
YSB 0:7b3acf8e2a6f 93
YSB 0:7b3acf8e2a6f 94 void IMU_I2C::getOutput(int* readings){
YSB 0:7b3acf8e2a6f 95 char buffer[6];
YSB 0:7b3acf8e2a6f 96 multiByteRead(ADXL345_DATAX0_REG, buffer, 6);
YSB 0:7b3acf8e2a6f 97
YSB 0:7b3acf8e2a6f 98 readings[0] = (int)buffer[1] << 8 | (int)buffer[0];
YSB 0:7b3acf8e2a6f 99 readings[1] = (int)buffer[3] << 8 | (int)buffer[2];
YSB 0:7b3acf8e2a6f 100 readings[2] = (int)buffer[5] << 8 | (int)buffer[4];
YSB 0:7b3acf8e2a6f 101
YSB 0:7b3acf8e2a6f 102 }
YSB 0:7b3acf8e2a6f 103
YSB 0:7b3acf8e2a6f 104 char IMU_I2C::getDeviceID() {
YSB 0:7b3acf8e2a6f 105 return SingleByteRead(ADXL345_DEVID_REG);
YSB 0:7b3acf8e2a6f 106 }
YSB 0:7b3acf8e2a6f 107
YSB 0:7b3acf8e2a6f 108 int IMU_I2C::setPowerMode(char mode) {
YSB 0:7b3acf8e2a6f 109
YSB 0:7b3acf8e2a6f 110 //Get the current register contents, so we don't clobber the rate value.
YSB 0:7b3acf8e2a6f 111 char registerContents = (mode << 4) | SingleByteRead(ADXL345_BW_RATE_REG);
YSB 0:7b3acf8e2a6f 112
YSB 0:7b3acf8e2a6f 113 return SingleByteWrite(ADXL345_BW_RATE_REG, registerContents);
YSB 0:7b3acf8e2a6f 114
YSB 0:7b3acf8e2a6f 115 }
YSB 0:7b3acf8e2a6f 116
YSB 0:7b3acf8e2a6f 117 char IMU_I2C::getPowerControl() {
YSB 0:7b3acf8e2a6f 118 return SingleByteRead(ADXL345_POWER_CTL_REG);
YSB 0:7b3acf8e2a6f 119 }
YSB 0:7b3acf8e2a6f 120
YSB 0:7b3acf8e2a6f 121 int IMU_I2C::setPowerControl(char settings) {
YSB 0:7b3acf8e2a6f 122 return SingleByteWrite(ADXL345_POWER_CTL_REG, settings);
YSB 0:7b3acf8e2a6f 123
YSB 0:7b3acf8e2a6f 124 }
YSB 0:7b3acf8e2a6f 125
YSB 0:7b3acf8e2a6f 126 char IMU_I2C::getDataFormatControl(void){
YSB 0:7b3acf8e2a6f 127
YSB 0:7b3acf8e2a6f 128 return SingleByteRead(ADXL345_DATA_FORMAT_REG);
YSB 0:7b3acf8e2a6f 129 }
YSB 0:7b3acf8e2a6f 130
YSB 0:7b3acf8e2a6f 131 int IMU_I2C::setDataFormatControl(char settings){
YSB 0:7b3acf8e2a6f 132
YSB 0:7b3acf8e2a6f 133 return SingleByteWrite(ADXL345_DATA_FORMAT_REG, settings);
YSB 0:7b3acf8e2a6f 134
YSB 0:7b3acf8e2a6f 135 }
YSB 0:7b3acf8e2a6f 136
YSB 0:7b3acf8e2a6f 137 int IMU_I2C::setDataRate(char rate) {
YSB 0:7b3acf8e2a6f 138
YSB 0:7b3acf8e2a6f 139 //Get the current register contents, so we don't clobber the power bit.
YSB 0:7b3acf8e2a6f 140 char registerContents = SingleByteRead(ADXL345_BW_RATE_REG);
YSB 0:7b3acf8e2a6f 141
YSB 0:7b3acf8e2a6f 142 registerContents &= 0x10;
YSB 0:7b3acf8e2a6f 143 registerContents |= rate;
YSB 0:7b3acf8e2a6f 144
YSB 0:7b3acf8e2a6f 145 return SingleByteWrite(ADXL345_BW_RATE_REG, registerContents);
YSB 0:7b3acf8e2a6f 146 }
YSB 0:7b3acf8e2a6f 147
YSB 0:7b3acf8e2a6f 148 char IMU_I2C::getOffset(char axis) {
YSB 0:7b3acf8e2a6f 149
YSB 0:7b3acf8e2a6f 150 char address = 0;
YSB 0:7b3acf8e2a6f 151
YSB 0:7b3acf8e2a6f 152 if (axis == ADXL345_X) {
YSB 0:7b3acf8e2a6f 153 address = ADXL345_OFSX_REG;
YSB 0:7b3acf8e2a6f 154 } else if (axis == ADXL345_Y) {
YSB 0:7b3acf8e2a6f 155 address = ADXL345_OFSY_REG;
YSB 0:7b3acf8e2a6f 156 } else if (axis == ADXL345_Z) {
YSB 0:7b3acf8e2a6f 157 address = ADXL345_OFSZ_REG;
YSB 0:7b3acf8e2a6f 158 }
YSB 0:7b3acf8e2a6f 159
YSB 0:7b3acf8e2a6f 160 return SingleByteRead(address);
YSB 0:7b3acf8e2a6f 161 }
YSB 0:7b3acf8e2a6f 162
YSB 0:7b3acf8e2a6f 163 int IMU_I2C::setOffset(char axis, char offset) {
YSB 0:7b3acf8e2a6f 164
YSB 0:7b3acf8e2a6f 165 char address = 0;
YSB 0:7b3acf8e2a6f 166
YSB 0:7b3acf8e2a6f 167 if (axis == ADXL345_X) {
YSB 0:7b3acf8e2a6f 168 address = ADXL345_OFSX_REG;
YSB 0:7b3acf8e2a6f 169 } else if (axis == ADXL345_Y) {
YSB 0:7b3acf8e2a6f 170 address = ADXL345_OFSY_REG;
YSB 0:7b3acf8e2a6f 171 } else if (axis == ADXL345_Z) {
YSB 0:7b3acf8e2a6f 172 address = ADXL345_OFSZ_REG;
YSB 0:7b3acf8e2a6f 173 }
YSB 0:7b3acf8e2a6f 174 return SingleByteWrite(address, offset);
YSB 0:7b3acf8e2a6f 175 }
YSB 0:7b3acf8e2a6f 176
YSB 0:7b3acf8e2a6f 177 char IMU_I2C::getFifoControl(void){
YSB 0:7b3acf8e2a6f 178
YSB 0:7b3acf8e2a6f 179 return SingleByteRead(ADXL345_FIFO_CTL);
YSB 0:7b3acf8e2a6f 180 }
YSB 0:7b3acf8e2a6f 181
YSB 0:7b3acf8e2a6f 182 int IMU_I2C::setFifoControl(char settings){
YSB 0:7b3acf8e2a6f 183 return SingleByteWrite(ADXL345_FIFO_STATUS, settings);
YSB 0:7b3acf8e2a6f 184
YSB 0:7b3acf8e2a6f 185 }
YSB 0:7b3acf8e2a6f 186
YSB 0:7b3acf8e2a6f 187 char IMU_I2C::getFifoStatus(void){
YSB 0:7b3acf8e2a6f 188 return SingleByteRead(ADXL345_FIFO_STATUS);
YSB 0:7b3acf8e2a6f 189 }
YSB 0:7b3acf8e2a6f 190
YSB 0:7b3acf8e2a6f 191 char IMU_I2C::getTapThreshold(void) {
YSB 0:7b3acf8e2a6f 192
YSB 0:7b3acf8e2a6f 193 return SingleByteRead(ADXL345_THRESH_TAP_REG);
YSB 0:7b3acf8e2a6f 194 }
YSB 0:7b3acf8e2a6f 195
YSB 0:7b3acf8e2a6f 196 int IMU_I2C::setTapThreshold(char threshold) {
YSB 0:7b3acf8e2a6f 197
YSB 0:7b3acf8e2a6f 198 return SingleByteWrite(ADXL345_THRESH_TAP_REG, threshold);
YSB 0:7b3acf8e2a6f 199 }
YSB 0:7b3acf8e2a6f 200
YSB 0:7b3acf8e2a6f 201 float IMU_I2C::getTapDuration(void) {
YSB 0:7b3acf8e2a6f 202
YSB 0:7b3acf8e2a6f 203 return (float)SingleByteRead(ADXL345_DUR_REG)*625;
YSB 0:7b3acf8e2a6f 204 }
YSB 0:7b3acf8e2a6f 205
YSB 0:7b3acf8e2a6f 206 int IMU_I2C::setTapDuration(short int duration_us) {
YSB 0:7b3acf8e2a6f 207
YSB 0:7b3acf8e2a6f 208 short int tapDuration = duration_us / 625;
YSB 0:7b3acf8e2a6f 209 char tapChar[2];
YSB 0:7b3acf8e2a6f 210 tapChar[0] = (tapDuration & 0x00FF);
YSB 0:7b3acf8e2a6f 211 tapChar[1] = (tapDuration >> 8) & 0x00FF;
YSB 0:7b3acf8e2a6f 212 return multiByteWrite(ADXL345_DUR_REG, tapChar, 2);
YSB 0:7b3acf8e2a6f 213 }
YSB 0:7b3acf8e2a6f 214
YSB 0:7b3acf8e2a6f 215 float IMU_I2C::getTapLatency(void) {
YSB 0:7b3acf8e2a6f 216
YSB 0:7b3acf8e2a6f 217 return (float)SingleByteRead(ADXL345_LATENT_REG)*1.25;
YSB 0:7b3acf8e2a6f 218 }
YSB 0:7b3acf8e2a6f 219
YSB 0:7b3acf8e2a6f 220 int IMU_I2C::setTapLatency(short int latency_ms) {
YSB 0:7b3acf8e2a6f 221
YSB 0:7b3acf8e2a6f 222 latency_ms = latency_ms / 1.25;
YSB 0:7b3acf8e2a6f 223 char latChar[2];
YSB 0:7b3acf8e2a6f 224 latChar[0] = (latency_ms & 0x00FF);
YSB 0:7b3acf8e2a6f 225 latChar[1] = (latency_ms << 8) & 0xFF00;
YSB 0:7b3acf8e2a6f 226 return multiByteWrite(ADXL345_LATENT_REG, latChar, 2);
YSB 0:7b3acf8e2a6f 227 }
YSB 0:7b3acf8e2a6f 228
YSB 0:7b3acf8e2a6f 229 float IMU_I2C::getWindowTime(void) {
YSB 0:7b3acf8e2a6f 230
YSB 0:7b3acf8e2a6f 231 return (float)SingleByteRead(ADXL345_WINDOW_REG)*1.25;
YSB 0:7b3acf8e2a6f 232 }
YSB 0:7b3acf8e2a6f 233
YSB 0:7b3acf8e2a6f 234 int IMU_I2C::setWindowTime(short int window_ms) {
YSB 0:7b3acf8e2a6f 235
YSB 0:7b3acf8e2a6f 236 window_ms = window_ms / 1.25;
YSB 0:7b3acf8e2a6f 237 char windowChar[2];
YSB 0:7b3acf8e2a6f 238 windowChar[0] = (window_ms & 0x00FF);
YSB 0:7b3acf8e2a6f 239 windowChar[1] = ((window_ms << 8) & 0xFF00);
YSB 0:7b3acf8e2a6f 240 return multiByteWrite(ADXL345_WINDOW_REG, windowChar, 2);
YSB 0:7b3acf8e2a6f 241 }
YSB 0:7b3acf8e2a6f 242
YSB 0:7b3acf8e2a6f 243 char IMU_I2C::getActivityThreshold(void) {
YSB 0:7b3acf8e2a6f 244
YSB 0:7b3acf8e2a6f 245 return SingleByteRead(ADXL345_THRESH_ACT_REG);
YSB 0:7b3acf8e2a6f 246 }
YSB 0:7b3acf8e2a6f 247
YSB 0:7b3acf8e2a6f 248 int IMU_I2C::setActivityThreshold(char threshold) {
YSB 0:7b3acf8e2a6f 249 return SingleByteWrite(ADXL345_THRESH_ACT_REG, threshold);
YSB 0:7b3acf8e2a6f 250 }
YSB 0:7b3acf8e2a6f 251
YSB 0:7b3acf8e2a6f 252 char IMU_I2C::getInactivityThreshold(void) {
YSB 0:7b3acf8e2a6f 253 return SingleByteRead(ADXL345_THRESH_INACT_REG);
YSB 0:7b3acf8e2a6f 254 }
YSB 0:7b3acf8e2a6f 255
YSB 0:7b3acf8e2a6f 256 //int FUNCTION(short int * ptr_Output)
YSB 0:7b3acf8e2a6f 257 //short int FUNCTION ()
YSB 0:7b3acf8e2a6f 258
YSB 0:7b3acf8e2a6f 259 int IMU_I2C::setInactivityThreshold(char threshold) {
YSB 0:7b3acf8e2a6f 260 return SingleByteWrite(ADXL345_THRESH_INACT_REG, threshold);
YSB 0:7b3acf8e2a6f 261 }
YSB 0:7b3acf8e2a6f 262
YSB 0:7b3acf8e2a6f 263 char IMU_I2C::getTimeInactivity(void) {
YSB 0:7b3acf8e2a6f 264
YSB 0:7b3acf8e2a6f 265 return SingleByteRead(ADXL345_TIME_INACT_REG);
YSB 0:7b3acf8e2a6f 266 }
YSB 0:7b3acf8e2a6f 267
YSB 0:7b3acf8e2a6f 268 int IMU_I2C::setTimeInactivity(char timeInactivity) {
YSB 0:7b3acf8e2a6f 269 return SingleByteWrite(ADXL345_TIME_INACT_REG, timeInactivity);
YSB 0:7b3acf8e2a6f 270 }
YSB 0:7b3acf8e2a6f 271
YSB 0:7b3acf8e2a6f 272 char IMU_I2C::getActivityInactivityControl(void) {
YSB 0:7b3acf8e2a6f 273
YSB 0:7b3acf8e2a6f 274 return SingleByteRead(ADXL345_ACT_INACT_CTL_REG);
YSB 0:7b3acf8e2a6f 275 }
YSB 0:7b3acf8e2a6f 276
YSB 0:7b3acf8e2a6f 277 int IMU_I2C::setActivityInactivityControl(char settings) {
YSB 0:7b3acf8e2a6f 278 return SingleByteWrite(ADXL345_ACT_INACT_CTL_REG, settings);
YSB 0:7b3acf8e2a6f 279 }
YSB 0:7b3acf8e2a6f 280
YSB 0:7b3acf8e2a6f 281 char IMU_I2C::getFreefallThreshold(void) {
YSB 0:7b3acf8e2a6f 282 return SingleByteRead(ADXL345_THRESH_FF_REG);
YSB 0:7b3acf8e2a6f 283 }
YSB 0:7b3acf8e2a6f 284
YSB 0:7b3acf8e2a6f 285 int IMU_I2C::setFreefallThreshold(char threshold) {
YSB 0:7b3acf8e2a6f 286 return SingleByteWrite(ADXL345_THRESH_FF_REG, threshold);
YSB 0:7b3acf8e2a6f 287 }
YSB 0:7b3acf8e2a6f 288
YSB 0:7b3acf8e2a6f 289 char IMU_I2C::getFreefallTime(void) {
YSB 0:7b3acf8e2a6f 290 return SingleByteRead(ADXL345_TIME_FF_REG)*5;
YSB 0:7b3acf8e2a6f 291 }
YSB 0:7b3acf8e2a6f 292
YSB 0:7b3acf8e2a6f 293 int IMU_I2C::setFreefallTime(short int freefallTime_ms) {
YSB 0:7b3acf8e2a6f 294 freefallTime_ms = freefallTime_ms / 5;
YSB 0:7b3acf8e2a6f 295 char fallChar[2];
YSB 0:7b3acf8e2a6f 296 fallChar[0] = (freefallTime_ms & 0x00FF);
YSB 0:7b3acf8e2a6f 297 fallChar[1] = (freefallTime_ms << 8) & 0xFF00;
YSB 0:7b3acf8e2a6f 298
YSB 0:7b3acf8e2a6f 299 return multiByteWrite(ADXL345_TIME_FF_REG, fallChar, 2);
YSB 0:7b3acf8e2a6f 300 }
YSB 0:7b3acf8e2a6f 301
YSB 0:7b3acf8e2a6f 302 char IMU_I2C::getTapAxisControl(void) {
YSB 0:7b3acf8e2a6f 303 return SingleByteRead(ADXL345_TAP_AXES_REG);
YSB 0:7b3acf8e2a6f 304 }
YSB 0:7b3acf8e2a6f 305
YSB 0:7b3acf8e2a6f 306 int IMU_I2C::setTapAxisControl(char settings) {
YSB 0:7b3acf8e2a6f 307 return SingleByteWrite(ADXL345_TAP_AXES_REG, settings);
YSB 0:7b3acf8e2a6f 308 }
YSB 0:7b3acf8e2a6f 309
YSB 0:7b3acf8e2a6f 310 char IMU_I2C::getTapSource(void) {
YSB 0:7b3acf8e2a6f 311 return SingleByteRead(ADXL345_ACT_TAP_STATUS_REG);
YSB 0:7b3acf8e2a6f 312 }
YSB 0:7b3acf8e2a6f 313
YSB 0:7b3acf8e2a6f 314 char IMU_I2C::getInterruptEnableControl(void) {
YSB 0:7b3acf8e2a6f 315 return SingleByteRead(ADXL345_INT_ENABLE_REG);
YSB 0:7b3acf8e2a6f 316 }
YSB 0:7b3acf8e2a6f 317
YSB 0:7b3acf8e2a6f 318 int IMU_I2C::setInterruptEnableControl(char settings) {
YSB 0:7b3acf8e2a6f 319 return SingleByteWrite(ADXL345_INT_ENABLE_REG, settings);
YSB 0:7b3acf8e2a6f 320 }
YSB 0:7b3acf8e2a6f 321
YSB 0:7b3acf8e2a6f 322 char IMU_I2C::getInterruptMappingControl(void) {
YSB 0:7b3acf8e2a6f 323 return SingleByteRead(ADXL345_INT_MAP_REG);
YSB 0:7b3acf8e2a6f 324 }
YSB 0:7b3acf8e2a6f 325
YSB 0:7b3acf8e2a6f 326 int IMU_I2C::setInterruptMappingControl(char settings) {
YSB 0:7b3acf8e2a6f 327 return SingleByteWrite(ADXL345_INT_MAP_REG, settings);
YSB 0:7b3acf8e2a6f 328 }
YSB 0:7b3acf8e2a6f 329
YSB 0:7b3acf8e2a6f 330 char IMU_I2C::getInterruptSource(void){
YSB 0:7b3acf8e2a6f 331 return SingleByteRead(ADXL345_INT_SOURCE_REG);
YSB 0:7b3acf8e2a6f 332 }
YSB 0:7b3acf8e2a6f 333
YSB 0:7b3acf8e2a6f 334 //////////////L3G4200D//////////////////////////////////////////////////////////
YSB 0:7b3acf8e2a6f 335
YSB 0:7b3acf8e2a6f 336 // Writes a gyro register
YSB 0:7b3acf8e2a6f 337 void IMU_I2C::writeReg(byte reg, byte value)
YSB 0:7b3acf8e2a6f 338 {
YSB 0:7b3acf8e2a6f 339 data[0] = reg;
YSB 0:7b3acf8e2a6f 340 data[1] = value;
YSB 0:7b3acf8e2a6f 341
YSB 0:7b3acf8e2a6f 342 i2c_.write(GYR_ADDRESS, data, 2);
YSB 0:7b3acf8e2a6f 343 }// Writes a gyro register
YSB 0:7b3acf8e2a6f 344
YSB 0:7b3acf8e2a6f 345 // Reads a gyro register
YSB 0:7b3acf8e2a6f 346 byte IMU_I2C::readReg(byte reg)
YSB 0:7b3acf8e2a6f 347 {
YSB 0:7b3acf8e2a6f 348 byte value = 0;
YSB 0:7b3acf8e2a6f 349
YSB 0:7b3acf8e2a6f 350 i2c_.write(GYR_ADDRESS, &reg, 1);
YSB 0:7b3acf8e2a6f 351 i2c_.read(GYR_ADDRESS, &value, 1);
YSB 0:7b3acf8e2a6f 352
YSB 0:7b3acf8e2a6f 353 return value;
YSB 0:7b3acf8e2a6f 354 }// Reads a gyro register
YSB 0:7b3acf8e2a6f 355
YSB 0:7b3acf8e2a6f 356 // Reads the 3 gyro channels and stores them in vector g
YSB 0:7b3acf8e2a6f 357 void IMU_I2C::read(int g[3])
YSB 0:7b3acf8e2a6f 358 {
YSB 0:7b3acf8e2a6f 359 // assert the MSB of the address to get the gyro
YSB 0:7b3acf8e2a6f 360 // to do slave-transmit subaddress updating.
YSB 0:7b3acf8e2a6f 361 data[0] = L3G4200D_OUT_X_L | (1 << 7);
YSB 0:7b3acf8e2a6f 362 i2c_.write(GYR_ADDRESS, data, 1);
YSB 0:7b3acf8e2a6f 363
YSB 0:7b3acf8e2a6f 364 // Wire.requestFrom(GYR_ADDRESS, 6);
YSB 0:7b3acf8e2a6f 365 // while (Wire.available() < 6);
YSB 0:7b3acf8e2a6f 366
YSB 0:7b3acf8e2a6f 367 i2c_.read(GYR_ADDRESS, data, 6);
YSB 0:7b3acf8e2a6f 368
YSB 0:7b3acf8e2a6f 369 uint8_t xla = data[0];
YSB 0:7b3acf8e2a6f 370 uint8_t xha = data[1];
YSB 0:7b3acf8e2a6f 371 uint8_t yla = data[2];
YSB 0:7b3acf8e2a6f 372 uint8_t yha = data[3];
YSB 0:7b3acf8e2a6f 373 uint8_t zla = data[4];
YSB 0:7b3acf8e2a6f 374 uint8_t zha = data[5];
YSB 0:7b3acf8e2a6f 375
YSB 0:7b3acf8e2a6f 376 g[0] = (short) (xha << 8 | xla);
YSB 0:7b3acf8e2a6f 377 g[1] = (short) (yha << 8 | yla);
YSB 0:7b3acf8e2a6f 378 g[2] = (short) (zha << 8 | zla);
YSB 0:7b3acf8e2a6f 379 }
YSB 0:7b3acf8e2a6f 380
YSB 0:7b3acf8e2a6f 381 char IMU_I2C::getWhoAmI(void){
YSB 0:7b3acf8e2a6f 382
YSB 0:7b3acf8e2a6f 383 //WhoAmI Register address.
YSB 0:7b3acf8e2a6f 384 char tx = WHO_AM_I_REG;
YSB 0:7b3acf8e2a6f 385 char rx;
YSB 0:7b3acf8e2a6f 386
YSB 0:7b3acf8e2a6f 387 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
YSB 0:7b3acf8e2a6f 388
YSB 0:7b3acf8e2a6f 389 i2c_.read((ITG3200_I2C_ADDRESS << 1) | 0x01, &rx, 1);
YSB 0:7b3acf8e2a6f 390
YSB 0:7b3acf8e2a6f 391 return rx;
YSB 0:7b3acf8e2a6f 392
YSB 0:7b3acf8e2a6f 393 }
YSB 0:7b3acf8e2a6f 394
YSB 0:7b3acf8e2a6f 395 void IMU_I2C::setWhoAmI(char address){
YSB 0:7b3acf8e2a6f 396
YSB 0:7b3acf8e2a6f 397 char tx[2];
YSB 0:7b3acf8e2a6f 398 tx[0] = WHO_AM_I_REG;
YSB 0:7b3acf8e2a6f 399 tx[1] = address;
YSB 0:7b3acf8e2a6f 400
YSB 0:7b3acf8e2a6f 401 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, tx, 2);
YSB 0:7b3acf8e2a6f 402
YSB 0:7b3acf8e2a6f 403 }
YSB 0:7b3acf8e2a6f 404
YSB 0:7b3acf8e2a6f 405 char IMU_I2C::getSampleRateDivider(void){
YSB 0:7b3acf8e2a6f 406
YSB 0:7b3acf8e2a6f 407 char tx = SMPLRT_DIV_REG;
YSB 0:7b3acf8e2a6f 408 char rx;
YSB 0:7b3acf8e2a6f 409
YSB 0:7b3acf8e2a6f 410 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
YSB 0:7b3acf8e2a6f 411
YSB 0:7b3acf8e2a6f 412 i2c_.read((ITG3200_I2C_ADDRESS << 1) | 0x01, &rx, 1);
YSB 0:7b3acf8e2a6f 413
YSB 0:7b3acf8e2a6f 414 return rx;
YSB 0:7b3acf8e2a6f 415
YSB 0:7b3acf8e2a6f 416 }
YSB 0:7b3acf8e2a6f 417
YSB 0:7b3acf8e2a6f 418 void IMU_I2C::setSampleRateDivider(char divider){
YSB 0:7b3acf8e2a6f 419
YSB 0:7b3acf8e2a6f 420 char tx[2];
YSB 0:7b3acf8e2a6f 421 tx[0] = SMPLRT_DIV_REG;
YSB 0:7b3acf8e2a6f 422 tx[1] = divider;
YSB 0:7b3acf8e2a6f 423
YSB 0:7b3acf8e2a6f 424 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, tx, 2);
YSB 0:7b3acf8e2a6f 425
YSB 0:7b3acf8e2a6f 426 }
YSB 0:7b3acf8e2a6f 427
YSB 0:7b3acf8e2a6f 428 int IMU_I2C::getInternalSampleRate(void){
YSB 0:7b3acf8e2a6f 429
YSB 0:7b3acf8e2a6f 430 char tx = DLPF_FS_REG;
YSB 0:7b3acf8e2a6f 431 char rx;
YSB 0:7b3acf8e2a6f 432
YSB 0:7b3acf8e2a6f 433 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
YSB 0:7b3acf8e2a6f 434
YSB 0:7b3acf8e2a6f 435 i2c_.read((ITG3200_I2C_ADDRESS << 1) | 0x01, &rx, 1);
YSB 0:7b3acf8e2a6f 436
YSB 0:7b3acf8e2a6f 437 //DLPF_CFG == 0 -> sample rate = 8kHz.
YSB 0:7b3acf8e2a6f 438 if(rx == 0){
YSB 0:7b3acf8e2a6f 439 return 8;
YSB 0:7b3acf8e2a6f 440 }
YSB 0:7b3acf8e2a6f 441 //DLPF_CFG = 1..7 -> sample rate = 1kHz.
YSB 0:7b3acf8e2a6f 442 else if(rx >= 1 && rx <= 7){
YSB 0:7b3acf8e2a6f 443 return 1;
YSB 0:7b3acf8e2a6f 444 }
YSB 0:7b3acf8e2a6f 445 //DLPF_CFG = anything else -> something's wrong!
YSB 0:7b3acf8e2a6f 446 else{
YSB 0:7b3acf8e2a6f 447 return -1;
YSB 0:7b3acf8e2a6f 448 }
YSB 0:7b3acf8e2a6f 449
YSB 0:7b3acf8e2a6f 450 }
YSB 0:7b3acf8e2a6f 451
YSB 0:7b3acf8e2a6f 452 void IMU_I2C::setLpBandwidth(char bandwidth){
YSB 0:7b3acf8e2a6f 453
YSB 0:7b3acf8e2a6f 454 char tx[2];
YSB 0:7b3acf8e2a6f 455 tx[0] = DLPF_FS_REG;
YSB 0:7b3acf8e2a6f 456 //Bits 4,3 are required to be 0x03 for proper operation.
YSB 0:7b3acf8e2a6f 457 tx[1] = bandwidth | (0x03 << 3);
YSB 0:7b3acf8e2a6f 458
YSB 0:7b3acf8e2a6f 459 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, tx, 2);
YSB 0:7b3acf8e2a6f 460
YSB 0:7b3acf8e2a6f 461 }
YSB 0:7b3acf8e2a6f 462
YSB 0:7b3acf8e2a6f 463 char IMU_I2C::getInterruptConfiguration(void){
YSB 0:7b3acf8e2a6f 464
YSB 0:7b3acf8e2a6f 465 char tx = INT_CFG_REG;
YSB 0:7b3acf8e2a6f 466 char rx;
YSB 0:7b3acf8e2a6f 467
YSB 0:7b3acf8e2a6f 468 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
YSB 0:7b3acf8e2a6f 469
YSB 0:7b3acf8e2a6f 470 i2c_.read((ITG3200_I2C_ADDRESS << 1) | 0x01, &rx, 1);
YSB 0:7b3acf8e2a6f 471
YSB 0:7b3acf8e2a6f 472 return rx;
YSB 0:7b3acf8e2a6f 473
YSB 0:7b3acf8e2a6f 474 }
YSB 0:7b3acf8e2a6f 475
YSB 0:7b3acf8e2a6f 476 void IMU_I2C::setInterruptConfiguration(char config){
YSB 0:7b3acf8e2a6f 477
YSB 0:7b3acf8e2a6f 478 char tx[2];
YSB 0:7b3acf8e2a6f 479 tx[0] = INT_CFG_REG;
YSB 0:7b3acf8e2a6f 480 tx[1] = config;
YSB 0:7b3acf8e2a6f 481
YSB 0:7b3acf8e2a6f 482 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, tx, 2);
YSB 0:7b3acf8e2a6f 483
YSB 0:7b3acf8e2a6f 484 }
YSB 0:7b3acf8e2a6f 485
YSB 0:7b3acf8e2a6f 486 bool IMU_I2C::isPllReady(void){
YSB 0:7b3acf8e2a6f 487
YSB 0:7b3acf8e2a6f 488 char tx = INT_STATUS;
YSB 0:7b3acf8e2a6f 489 char rx;
YSB 0:7b3acf8e2a6f 490
YSB 0:7b3acf8e2a6f 491 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
YSB 0:7b3acf8e2a6f 492
YSB 0:7b3acf8e2a6f 493 i2c_.read((ITG3200_I2C_ADDRESS << 1) | 0x01, &rx, 1);
YSB 0:7b3acf8e2a6f 494
YSB 0:7b3acf8e2a6f 495 //ITG_RDY bit is bit 4 of INT_STATUS register.
YSB 0:7b3acf8e2a6f 496 if(rx & 0x04){
YSB 0:7b3acf8e2a6f 497 return true;
YSB 0:7b3acf8e2a6f 498 }
YSB 0:7b3acf8e2a6f 499 else{
YSB 0:7b3acf8e2a6f 500 return false;
YSB 0:7b3acf8e2a6f 501 }
YSB 0:7b3acf8e2a6f 502
YSB 0:7b3acf8e2a6f 503 }
YSB 0:7b3acf8e2a6f 504
YSB 0:7b3acf8e2a6f 505 bool IMU_I2C::isRawDataReady(void){
YSB 0:7b3acf8e2a6f 506
YSB 0:7b3acf8e2a6f 507 char tx = INT_STATUS;
YSB 0:7b3acf8e2a6f 508 char rx;
YSB 0:7b3acf8e2a6f 509
YSB 0:7b3acf8e2a6f 510 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
YSB 0:7b3acf8e2a6f 511
YSB 0:7b3acf8e2a6f 512 i2c_.read((ITG3200_I2C_ADDRESS << 1) | 0x01, &rx, 1);
YSB 0:7b3acf8e2a6f 513
YSB 0:7b3acf8e2a6f 514 //RAW_DATA_RDY bit is bit 1 of INT_STATUS register.
YSB 0:7b3acf8e2a6f 515 if(rx & 0x01){
YSB 0:7b3acf8e2a6f 516 return true;
YSB 0:7b3acf8e2a6f 517 }
YSB 0:7b3acf8e2a6f 518 else{
YSB 0:7b3acf8e2a6f 519 return false;
YSB 0:7b3acf8e2a6f 520 }
YSB 0:7b3acf8e2a6f 521
YSB 0:7b3acf8e2a6f 522 }
YSB 0:7b3acf8e2a6f 523
YSB 0:7b3acf8e2a6f 524 float IMU_I2C::getTemperature(void){
YSB 0:7b3acf8e2a6f 525
YSB 0:7b3acf8e2a6f 526 char tx = TEMP_OUT_H_REG;
YSB 0:7b3acf8e2a6f 527 char rx[2];
YSB 0:7b3acf8e2a6f 528
YSB 0:7b3acf8e2a6f 529 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
YSB 0:7b3acf8e2a6f 530
YSB 0:7b3acf8e2a6f 531 i2c_.read((ITG3200_I2C_ADDRESS << 1) | 0x01, rx, 2);
YSB 0:7b3acf8e2a6f 532
YSB 0:7b3acf8e2a6f 533 int16_t temperature = ((int) rx[0] << 8) | ((int) rx[1]);
YSB 0:7b3acf8e2a6f 534 //Offset = -35 degrees, 13200 counts. 280 counts/degrees C.
YSB 0:7b3acf8e2a6f 535 return 35.0 + ((temperature + 13200)/280.0);
YSB 0:7b3acf8e2a6f 536
YSB 0:7b3acf8e2a6f 537 }
YSB 0:7b3acf8e2a6f 538
YSB 0:7b3acf8e2a6f 539 int IMU_I2C::getGyroX(void){
YSB 0:7b3acf8e2a6f 540
YSB 0:7b3acf8e2a6f 541 char tx = GYRO_XOUT_H_REG;
YSB 0:7b3acf8e2a6f 542 char rx[2];
YSB 0:7b3acf8e2a6f 543
YSB 0:7b3acf8e2a6f 544 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
YSB 0:7b3acf8e2a6f 545
YSB 0:7b3acf8e2a6f 546 i2c_.read((ITG3200_I2C_ADDRESS << 1) | 0x01, rx, 2);
YSB 0:7b3acf8e2a6f 547
YSB 0:7b3acf8e2a6f 548 int16_t output = ((int) rx[0] << 8) | ((int) rx[1]);
YSB 0:7b3acf8e2a6f 549
YSB 0:7b3acf8e2a6f 550 return output;
YSB 0:7b3acf8e2a6f 551
YSB 0:7b3acf8e2a6f 552 }
YSB 0:7b3acf8e2a6f 553
YSB 0:7b3acf8e2a6f 554 int IMU_I2C::getGyroY(void){
YSB 0:7b3acf8e2a6f 555
YSB 0:7b3acf8e2a6f 556 char tx = GYRO_YOUT_H_REG;
YSB 0:7b3acf8e2a6f 557 char rx[2];
YSB 0:7b3acf8e2a6f 558
YSB 0:7b3acf8e2a6f 559 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
YSB 0:7b3acf8e2a6f 560
YSB 0:7b3acf8e2a6f 561 i2c_.read((ITG3200_I2C_ADDRESS << 1) | 0x01, rx, 2);
YSB 0:7b3acf8e2a6f 562
YSB 0:7b3acf8e2a6f 563 int16_t output = ((int) rx[0] << 8) | ((int) rx[1]);
YSB 0:7b3acf8e2a6f 564
YSB 0:7b3acf8e2a6f 565 return output;
YSB 0:7b3acf8e2a6f 566
YSB 0:7b3acf8e2a6f 567 }
YSB 0:7b3acf8e2a6f 568
YSB 0:7b3acf8e2a6f 569 int IMU_I2C::getGyroZ(void){
YSB 0:7b3acf8e2a6f 570
YSB 0:7b3acf8e2a6f 571 char tx = GYRO_ZOUT_H_REG;
YSB 0:7b3acf8e2a6f 572 char rx[2];
YSB 0:7b3acf8e2a6f 573
YSB 0:7b3acf8e2a6f 574 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
YSB 0:7b3acf8e2a6f 575
YSB 0:7b3acf8e2a6f 576 i2c_.read((ITG3200_I2C_ADDRESS << 1) | 0x01, rx, 2);
YSB 0:7b3acf8e2a6f 577
YSB 0:7b3acf8e2a6f 578 int16_t output = ((int) rx[0] << 8) | ((int) rx[1]);
YSB 0:7b3acf8e2a6f 579
YSB 0:7b3acf8e2a6f 580 return output;
YSB 0:7b3acf8e2a6f 581
YSB 0:7b3acf8e2a6f 582 }
YSB 0:7b3acf8e2a6f 583
YSB 0:7b3acf8e2a6f 584 char IMU_I2C::getPowerManagement(void){
YSB 0:7b3acf8e2a6f 585
YSB 0:7b3acf8e2a6f 586 char tx = PWR_MGM_REG;
YSB 0:7b3acf8e2a6f 587 char rx;
YSB 0:7b3acf8e2a6f 588
YSB 0:7b3acf8e2a6f 589 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
YSB 0:7b3acf8e2a6f 590
YSB 0:7b3acf8e2a6f 591 i2c_.read((ITG3200_I2C_ADDRESS << 1) | 0x01, &rx, 1);
YSB 0:7b3acf8e2a6f 592
YSB 0:7b3acf8e2a6f 593 return rx;
YSB 0:7b3acf8e2a6f 594
YSB 0:7b3acf8e2a6f 595 }
YSB 0:7b3acf8e2a6f 596
YSB 0:7b3acf8e2a6f 597 void IMU_I2C::setPowerManagement(char config){
YSB 0:7b3acf8e2a6f 598
YSB 0:7b3acf8e2a6f 599 char tx[2];
YSB 0:7b3acf8e2a6f 600 tx[0] = PWR_MGM_REG;
YSB 0:7b3acf8e2a6f 601 tx[1] = config;
YSB 0:7b3acf8e2a6f 602
YSB 0:7b3acf8e2a6f 603 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, tx, 2);
YSB 0:7b3acf8e2a6f 604
YSB 0:7b3acf8e2a6f 605 }
YSB 0:7b3acf8e2a6f 606
YSB 0:7b3acf8e2a6f 607