ITG-3200 triple axis, digital gyroscope library.

Dependents:   RoboticsCatAndMouse_HumanDriver

Fork of ITG3200 by Aaron Berk

Committer:
Strikewolf
Date:
Wed Apr 30 05:53:45 2014 +0000
Revision:
1:9e6042257318
Parent:
0:b098d99dd81e
works without any motors

Who changed what in which revision?

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