k.j

Dependents:   6DoF_IMU_readvalue_thingy 10dof

Fork of ITG3200 by Uwe Gartmann

Committer:
Digixx
Date:
Fri Oct 07 21:08:25 2011 +0000
Revision:
0:8967cbe04d96
Child:
1:de82c71cfc08
Had to modify I2C address from 0x69 to 0x68 to use this Lib

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Digixx 0:8967cbe04d96 1 /**
Digixx 0:8967cbe04d96 2 * @author Aaron Berk
Digixx 0:8967cbe04d96 3 *
Digixx 0:8967cbe04d96 4 * @section LICENSE
Digixx 0:8967cbe04d96 5 *
Digixx 0:8967cbe04d96 6 * Copyright (c) 2010 ARM Limited
Digixx 0:8967cbe04d96 7 *
Digixx 0:8967cbe04d96 8 * Permission is hereby granted, free of charge, to any person obtaining a copy
Digixx 0:8967cbe04d96 9 * of this software and associated documentation files (the "Software"), to deal
Digixx 0:8967cbe04d96 10 * in the Software without restriction, including without limitation the rights
Digixx 0:8967cbe04d96 11 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
Digixx 0:8967cbe04d96 12 * copies of the Software, and to permit persons to whom the Software is
Digixx 0:8967cbe04d96 13 * furnished to do so, subject to the following conditions:
Digixx 0:8967cbe04d96 14 *
Digixx 0:8967cbe04d96 15 * The above copyright notice and this permission notice shall be included in
Digixx 0:8967cbe04d96 16 * all copies or substantial portions of the Software.
Digixx 0:8967cbe04d96 17 *
Digixx 0:8967cbe04d96 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Digixx 0:8967cbe04d96 19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Digixx 0:8967cbe04d96 20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
Digixx 0:8967cbe04d96 21 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
Digixx 0:8967cbe04d96 22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
Digixx 0:8967cbe04d96 23 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
Digixx 0:8967cbe04d96 24 * THE SOFTWARE.
Digixx 0:8967cbe04d96 25 *
Digixx 0:8967cbe04d96 26 * @section DESCRIPTION
Digixx 0:8967cbe04d96 27 *
Digixx 0:8967cbe04d96 28 * ITG-3200 triple axis, digital interface, gyroscope.
Digixx 0:8967cbe04d96 29 *
Digixx 0:8967cbe04d96 30 * Datasheet:
Digixx 0:8967cbe04d96 31 *
Digixx 0:8967cbe04d96 32 * http://invensense.com/mems/gyro/documents/PS-ITG-3200-00-01.4.pdf
Digixx 0:8967cbe04d96 33 */
Digixx 0:8967cbe04d96 34
Digixx 0:8967cbe04d96 35 /**
Digixx 0:8967cbe04d96 36 * Includes
Digixx 0:8967cbe04d96 37 */
Digixx 0:8967cbe04d96 38 #include "ITG3200.h"
Digixx 0:8967cbe04d96 39
Digixx 0:8967cbe04d96 40 ITG3200::ITG3200(PinName sda, PinName scl) : i2c_(sda, scl) {
Digixx 0:8967cbe04d96 41
Digixx 0:8967cbe04d96 42 //100kHz, mode.
Digixx 0:8967cbe04d96 43 i2c_.frequency(100000);
Digixx 0:8967cbe04d96 44
Digixx 0:8967cbe04d96 45 //Set FS_SEL to 0x03 for proper operation.
Digixx 0:8967cbe04d96 46 //See datasheet for details.
Digixx 0:8967cbe04d96 47 char tx[2];
Digixx 0:8967cbe04d96 48 tx[0] = DLPF_FS_REG;
Digixx 0:8967cbe04d96 49 //FS_SEL bits sit in bits 4 and 3 of DLPF_FS register.
Digixx 0:8967cbe04d96 50 tx[1] = 0x03 << 3;
Digixx 0:8967cbe04d96 51
Digixx 0:8967cbe04d96 52 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, tx, 2);
Digixx 0:8967cbe04d96 53
Digixx 0:8967cbe04d96 54 }
Digixx 0:8967cbe04d96 55
Digixx 0:8967cbe04d96 56 char ITG3200::getWhoAmI(void){
Digixx 0:8967cbe04d96 57
Digixx 0:8967cbe04d96 58 //WhoAmI Register address.
Digixx 0:8967cbe04d96 59 char tx = WHO_AM_I_REG;
Digixx 0:8967cbe04d96 60 char rx;
Digixx 0:8967cbe04d96 61
Digixx 0:8967cbe04d96 62 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
Digixx 0:8967cbe04d96 63
Digixx 0:8967cbe04d96 64 i2c_.read((ITG3200_I2C_ADDRESS << 1) | 0x01, &rx, 1);
Digixx 0:8967cbe04d96 65
Digixx 0:8967cbe04d96 66 return rx;
Digixx 0:8967cbe04d96 67
Digixx 0:8967cbe04d96 68 }
Digixx 0:8967cbe04d96 69
Digixx 0:8967cbe04d96 70 void ITG3200::setWhoAmI(char address){
Digixx 0:8967cbe04d96 71
Digixx 0:8967cbe04d96 72 char tx[2];
Digixx 0:8967cbe04d96 73 tx[0] = WHO_AM_I_REG;
Digixx 0:8967cbe04d96 74 tx[1] = address;
Digixx 0:8967cbe04d96 75
Digixx 0:8967cbe04d96 76 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, tx, 2);
Digixx 0:8967cbe04d96 77
Digixx 0:8967cbe04d96 78 }
Digixx 0:8967cbe04d96 79
Digixx 0:8967cbe04d96 80 char ITG3200::getSampleRateDivider(void){
Digixx 0:8967cbe04d96 81
Digixx 0:8967cbe04d96 82 char tx = SMPLRT_DIV_REG;
Digixx 0:8967cbe04d96 83 char rx;
Digixx 0:8967cbe04d96 84
Digixx 0:8967cbe04d96 85 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
Digixx 0:8967cbe04d96 86
Digixx 0:8967cbe04d96 87 i2c_.read((ITG3200_I2C_ADDRESS << 1) | 0x01, &rx, 1);
Digixx 0:8967cbe04d96 88
Digixx 0:8967cbe04d96 89 return rx;
Digixx 0:8967cbe04d96 90
Digixx 0:8967cbe04d96 91 }
Digixx 0:8967cbe04d96 92
Digixx 0:8967cbe04d96 93 void ITG3200::setSampleRateDivider(char divider){
Digixx 0:8967cbe04d96 94
Digixx 0:8967cbe04d96 95 char tx[2];
Digixx 0:8967cbe04d96 96 tx[0] = SMPLRT_DIV_REG;
Digixx 0:8967cbe04d96 97 tx[1] = divider;
Digixx 0:8967cbe04d96 98
Digixx 0:8967cbe04d96 99 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, tx, 2);
Digixx 0:8967cbe04d96 100
Digixx 0:8967cbe04d96 101 }
Digixx 0:8967cbe04d96 102
Digixx 0:8967cbe04d96 103 int ITG3200::getInternalSampleRate(void){
Digixx 0:8967cbe04d96 104
Digixx 0:8967cbe04d96 105 char tx = DLPF_FS_REG;
Digixx 0:8967cbe04d96 106 char rx;
Digixx 0:8967cbe04d96 107
Digixx 0:8967cbe04d96 108 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
Digixx 0:8967cbe04d96 109
Digixx 0:8967cbe04d96 110 i2c_.read((ITG3200_I2C_ADDRESS << 1) | 0x01, &rx, 1);
Digixx 0:8967cbe04d96 111
Digixx 0:8967cbe04d96 112 //DLPF_CFG == 0 -> sample rate = 8kHz.
Digixx 0:8967cbe04d96 113 if(rx == 0){
Digixx 0:8967cbe04d96 114 return 8;
Digixx 0:8967cbe04d96 115 }
Digixx 0:8967cbe04d96 116 //DLPF_CFG = 1..7 -> sample rate = 1kHz.
Digixx 0:8967cbe04d96 117 else if(rx >= 1 && rx <= 7){
Digixx 0:8967cbe04d96 118 return 1;
Digixx 0:8967cbe04d96 119 }
Digixx 0:8967cbe04d96 120 //DLPF_CFG = anything else -> something's wrong!
Digixx 0:8967cbe04d96 121 else{
Digixx 0:8967cbe04d96 122 return -1;
Digixx 0:8967cbe04d96 123 }
Digixx 0:8967cbe04d96 124
Digixx 0:8967cbe04d96 125 }
Digixx 0:8967cbe04d96 126
Digixx 0:8967cbe04d96 127 void ITG3200::setLpBandwidth(char bandwidth){
Digixx 0:8967cbe04d96 128
Digixx 0:8967cbe04d96 129 char tx[2];
Digixx 0:8967cbe04d96 130 tx[0] = DLPF_FS_REG;
Digixx 0:8967cbe04d96 131 //Bits 4,3 are required to be 0x03 for proper operation.
Digixx 0:8967cbe04d96 132 tx[1] = bandwidth | (0x03 << 3);
Digixx 0:8967cbe04d96 133
Digixx 0:8967cbe04d96 134 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, tx, 2);
Digixx 0:8967cbe04d96 135
Digixx 0:8967cbe04d96 136 }
Digixx 0:8967cbe04d96 137
Digixx 0:8967cbe04d96 138 char ITG3200::getInterruptConfiguration(void){
Digixx 0:8967cbe04d96 139
Digixx 0:8967cbe04d96 140 char tx = INT_CFG_REG;
Digixx 0:8967cbe04d96 141 char rx;
Digixx 0:8967cbe04d96 142
Digixx 0:8967cbe04d96 143 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
Digixx 0:8967cbe04d96 144
Digixx 0:8967cbe04d96 145 i2c_.read((ITG3200_I2C_ADDRESS << 1) | 0x01, &rx, 1);
Digixx 0:8967cbe04d96 146
Digixx 0:8967cbe04d96 147 return rx;
Digixx 0:8967cbe04d96 148
Digixx 0:8967cbe04d96 149 }
Digixx 0:8967cbe04d96 150
Digixx 0:8967cbe04d96 151 void ITG3200::setInterruptConfiguration(char config){
Digixx 0:8967cbe04d96 152
Digixx 0:8967cbe04d96 153 char tx[2];
Digixx 0:8967cbe04d96 154 tx[0] = INT_CFG_REG;
Digixx 0:8967cbe04d96 155 tx[1] = config;
Digixx 0:8967cbe04d96 156
Digixx 0:8967cbe04d96 157 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, tx, 2);
Digixx 0:8967cbe04d96 158
Digixx 0:8967cbe04d96 159 }
Digixx 0:8967cbe04d96 160
Digixx 0:8967cbe04d96 161 bool ITG3200::isPllReady(void){
Digixx 0:8967cbe04d96 162
Digixx 0:8967cbe04d96 163 char tx = INT_STATUS;
Digixx 0:8967cbe04d96 164 char rx;
Digixx 0:8967cbe04d96 165
Digixx 0:8967cbe04d96 166 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
Digixx 0:8967cbe04d96 167
Digixx 0:8967cbe04d96 168 i2c_.read((ITG3200_I2C_ADDRESS << 1) | 0x01, &rx, 1);
Digixx 0:8967cbe04d96 169
Digixx 0:8967cbe04d96 170 //ITG_RDY bit is bit 4 of INT_STATUS register.
Digixx 0:8967cbe04d96 171 if(rx & 0x04){
Digixx 0:8967cbe04d96 172 return true;
Digixx 0:8967cbe04d96 173 }
Digixx 0:8967cbe04d96 174 else{
Digixx 0:8967cbe04d96 175 return false;
Digixx 0:8967cbe04d96 176 }
Digixx 0:8967cbe04d96 177
Digixx 0:8967cbe04d96 178 }
Digixx 0:8967cbe04d96 179
Digixx 0:8967cbe04d96 180 bool ITG3200::isRawDataReady(void){
Digixx 0:8967cbe04d96 181
Digixx 0:8967cbe04d96 182 char tx = INT_STATUS;
Digixx 0:8967cbe04d96 183 char rx;
Digixx 0:8967cbe04d96 184
Digixx 0:8967cbe04d96 185 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
Digixx 0:8967cbe04d96 186
Digixx 0:8967cbe04d96 187 i2c_.read((ITG3200_I2C_ADDRESS << 1) | 0x01, &rx, 1);
Digixx 0:8967cbe04d96 188
Digixx 0:8967cbe04d96 189 //RAW_DATA_RDY bit is bit 1 of INT_STATUS register.
Digixx 0:8967cbe04d96 190 if(rx & 0x01){
Digixx 0:8967cbe04d96 191 return true;
Digixx 0:8967cbe04d96 192 }
Digixx 0:8967cbe04d96 193 else{
Digixx 0:8967cbe04d96 194 return false;
Digixx 0:8967cbe04d96 195 }
Digixx 0:8967cbe04d96 196
Digixx 0:8967cbe04d96 197 }
Digixx 0:8967cbe04d96 198
Digixx 0:8967cbe04d96 199 float ITG3200::getTemperature(void){
Digixx 0:8967cbe04d96 200
Digixx 0:8967cbe04d96 201 char tx = TEMP_OUT_H_REG;
Digixx 0:8967cbe04d96 202 char rx[2];
Digixx 0:8967cbe04d96 203
Digixx 0:8967cbe04d96 204 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
Digixx 0:8967cbe04d96 205
Digixx 0:8967cbe04d96 206 i2c_.read((ITG3200_I2C_ADDRESS << 1) | 0x01, rx, 2);
Digixx 0:8967cbe04d96 207
Digixx 0:8967cbe04d96 208 int16_t temperature = ((int) rx[0] << 8) | ((int) rx[1]);
Digixx 0:8967cbe04d96 209 //Offset = -35 degrees, 13200 counts. 280 counts/degrees C.
Digixx 0:8967cbe04d96 210 return 35.0 + ((temperature + 13200)/280.0);
Digixx 0:8967cbe04d96 211
Digixx 0:8967cbe04d96 212 }
Digixx 0:8967cbe04d96 213
Digixx 0:8967cbe04d96 214 int ITG3200::getGyroX(void){
Digixx 0:8967cbe04d96 215
Digixx 0:8967cbe04d96 216 char tx = GYRO_XOUT_H_REG;
Digixx 0:8967cbe04d96 217 char rx[2];
Digixx 0:8967cbe04d96 218
Digixx 0:8967cbe04d96 219 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
Digixx 0:8967cbe04d96 220
Digixx 0:8967cbe04d96 221 i2c_.read((ITG3200_I2C_ADDRESS << 1) | 0x01, rx, 2);
Digixx 0:8967cbe04d96 222
Digixx 0:8967cbe04d96 223 int16_t output = ((int) rx[0] << 8) | ((int) rx[1]);
Digixx 0:8967cbe04d96 224
Digixx 0:8967cbe04d96 225 return output;
Digixx 0:8967cbe04d96 226
Digixx 0:8967cbe04d96 227 }
Digixx 0:8967cbe04d96 228
Digixx 0:8967cbe04d96 229 int ITG3200::getGyroY(void){
Digixx 0:8967cbe04d96 230
Digixx 0:8967cbe04d96 231 char tx = GYRO_YOUT_H_REG;
Digixx 0:8967cbe04d96 232 char rx[2];
Digixx 0:8967cbe04d96 233
Digixx 0:8967cbe04d96 234 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
Digixx 0:8967cbe04d96 235
Digixx 0:8967cbe04d96 236 i2c_.read((ITG3200_I2C_ADDRESS << 1) | 0x01, rx, 2);
Digixx 0:8967cbe04d96 237
Digixx 0:8967cbe04d96 238 int16_t output = ((int) rx[0] << 8) | ((int) rx[1]);
Digixx 0:8967cbe04d96 239
Digixx 0:8967cbe04d96 240 return output;
Digixx 0:8967cbe04d96 241
Digixx 0:8967cbe04d96 242 }
Digixx 0:8967cbe04d96 243
Digixx 0:8967cbe04d96 244 int ITG3200::getGyroZ(void){
Digixx 0:8967cbe04d96 245
Digixx 0:8967cbe04d96 246 char tx = GYRO_ZOUT_H_REG;
Digixx 0:8967cbe04d96 247 char rx[2];
Digixx 0:8967cbe04d96 248
Digixx 0:8967cbe04d96 249 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
Digixx 0:8967cbe04d96 250
Digixx 0:8967cbe04d96 251 i2c_.read((ITG3200_I2C_ADDRESS << 1) | 0x01, rx, 2);
Digixx 0:8967cbe04d96 252
Digixx 0:8967cbe04d96 253 int16_t output = ((int) rx[0] << 8) | ((int) rx[1]);
Digixx 0:8967cbe04d96 254
Digixx 0:8967cbe04d96 255 return output;
Digixx 0:8967cbe04d96 256
Digixx 0:8967cbe04d96 257 }
Digixx 0:8967cbe04d96 258
Digixx 0:8967cbe04d96 259 char ITG3200::getPowerManagement(void){
Digixx 0:8967cbe04d96 260
Digixx 0:8967cbe04d96 261 char tx = PWR_MGM_REG;
Digixx 0:8967cbe04d96 262 char rx;
Digixx 0:8967cbe04d96 263
Digixx 0:8967cbe04d96 264 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, &tx, 1);
Digixx 0:8967cbe04d96 265
Digixx 0:8967cbe04d96 266 i2c_.read((ITG3200_I2C_ADDRESS << 1) | 0x01, &rx, 1);
Digixx 0:8967cbe04d96 267
Digixx 0:8967cbe04d96 268 return rx;
Digixx 0:8967cbe04d96 269
Digixx 0:8967cbe04d96 270 }
Digixx 0:8967cbe04d96 271
Digixx 0:8967cbe04d96 272 void ITG3200::setPowerManagement(char config){
Digixx 0:8967cbe04d96 273
Digixx 0:8967cbe04d96 274 char tx[2];
Digixx 0:8967cbe04d96 275 tx[0] = PWR_MGM_REG;
Digixx 0:8967cbe04d96 276 tx[1] = config;
Digixx 0:8967cbe04d96 277
Digixx 0:8967cbe04d96 278 i2c_.write((ITG3200_I2C_ADDRESS << 1) & 0xFE, tx, 2);
Digixx 0:8967cbe04d96 279
Digixx 0:8967cbe04d96 280 }