Modified getOffset for calibrating Thermal Drift coefficients.

Dependents:   9Dof_unit_testing

Fork of ITG3200 by James Watanabe

Modified to make getOffset() function easier to use.

Committer:
gltest26
Date:
Thu Sep 13 14:36:13 2012 +0000
Revision:
6:a7ad6046824c
Parent:
5:0a0315f0f34e
Child:
7:43b936a53b64
Made ITG3200::calibrate precisely measures time for calibration. Also added calibSamples variable that indicate number of samples for the last calibration.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gltest26 1:9bef044f45ad 1 /**
gltest26 3:eea9733ca427 2 * @file ITG3200.h
gltest26 1:9bef044f45ad 3 * @author Aaron Berk
gltest26 1:9bef044f45ad 4 *
gltest26 1:9bef044f45ad 5 * @section LICENSE
gltest26 1:9bef044f45ad 6 *
gltest26 1:9bef044f45ad 7 * Copyright (c) 2010 ARM Limited
gltest26 1:9bef044f45ad 8 *
gltest26 1:9bef044f45ad 9 * Permission is hereby granted, free of charge, to any person obtaining a copy
gltest26 1:9bef044f45ad 10 * of this software and associated documentation files (the "Software"), to deal
gltest26 1:9bef044f45ad 11 * in the Software without restriction, including without limitation the rights
gltest26 1:9bef044f45ad 12 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
gltest26 1:9bef044f45ad 13 * copies of the Software, and to permit persons to whom the Software is
gltest26 1:9bef044f45ad 14 * furnished to do so, subject to the following conditions:
gltest26 1:9bef044f45ad 15 *
gltest26 1:9bef044f45ad 16 * The above copyright notice and this permission notice shall be included in
gltest26 1:9bef044f45ad 17 * all copies or substantial portions of the Software.
gltest26 1:9bef044f45ad 18 *
gltest26 1:9bef044f45ad 19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
gltest26 1:9bef044f45ad 20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
gltest26 1:9bef044f45ad 21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
gltest26 1:9bef044f45ad 22 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
gltest26 1:9bef044f45ad 23 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
gltest26 1:9bef044f45ad 24 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
gltest26 1:9bef044f45ad 25 * THE SOFTWARE.
gltest26 1:9bef044f45ad 26 *
gltest26 1:9bef044f45ad 27 * @section DESCRIPTION
gltest26 1:9bef044f45ad 28 *
gltest26 1:9bef044f45ad 29 * ITG-3200 triple axis, digital interface, gyroscope.
gltest26 3:eea9733ca427 30 * Forked from Aaron Berk's work.
gltest26 1:9bef044f45ad 31 *
gltest26 1:9bef044f45ad 32 * Datasheet:
gltest26 1:9bef044f45ad 33 *
gltest26 1:9bef044f45ad 34 * http://invensense.com/mems/gyro/documents/PS-ITG-3200-00-01.4.pdf
gltest26 1:9bef044f45ad 35 */
gltest26 1:9bef044f45ad 36
gltest26 1:9bef044f45ad 37 #ifndef ITG3200_H
gltest26 1:9bef044f45ad 38 #define ITG3200_H
gltest26 1:9bef044f45ad 39
gltest26 3:eea9733ca427 40 /*
gltest26 1:9bef044f45ad 41 * Includes
gltest26 1:9bef044f45ad 42 */
gltest26 1:9bef044f45ad 43 #include "mbed.h"
gltest26 1:9bef044f45ad 44
gltest26 3:eea9733ca427 45 /*
gltest26 1:9bef044f45ad 46 * Defines
gltest26 1:9bef044f45ad 47 */
gltest26 1:9bef044f45ad 48 #define ITG3200_I2C_ADDRESS 0x68 //7-bit address.
gltest26 1:9bef044f45ad 49
gltest26 1:9bef044f45ad 50 //-----------
gltest26 1:9bef044f45ad 51 // Registers
gltest26 1:9bef044f45ad 52 //-----------
gltest26 1:9bef044f45ad 53 #define WHO_AM_I_REG 0x00
gltest26 1:9bef044f45ad 54 #define SMPLRT_DIV_REG 0x15
gltest26 1:9bef044f45ad 55 #define DLPF_FS_REG 0x16
gltest26 1:9bef044f45ad 56 #define INT_CFG_REG 0x17
gltest26 1:9bef044f45ad 57 #define INT_STATUS 0x1A
gltest26 1:9bef044f45ad 58 #define TEMP_OUT_H_REG 0x1B
gltest26 1:9bef044f45ad 59 #define TEMP_OUT_L_REG 0x1C
gltest26 1:9bef044f45ad 60 #define GYRO_XOUT_H_REG 0x1D
gltest26 1:9bef044f45ad 61 #define GYRO_XOUT_L_REG 0x1E
gltest26 1:9bef044f45ad 62 #define GYRO_YOUT_H_REG 0x1F
gltest26 1:9bef044f45ad 63 #define GYRO_YOUT_L_REG 0x20
gltest26 1:9bef044f45ad 64 #define GYRO_ZOUT_H_REG 0x21
gltest26 1:9bef044f45ad 65 #define GYRO_ZOUT_L_REG 0x22
gltest26 1:9bef044f45ad 66 #define PWR_MGM_REG 0x3E
gltest26 1:9bef044f45ad 67
gltest26 1:9bef044f45ad 68 //----------------------------
gltest26 1:9bef044f45ad 69 // Low Pass Filter Bandwidths
gltest26 1:9bef044f45ad 70 //----------------------------
gltest26 1:9bef044f45ad 71 #define LPFBW_256HZ 0x00
gltest26 1:9bef044f45ad 72 #define LPFBW_188HZ 0x01
gltest26 1:9bef044f45ad 73 #define LPFBW_98HZ 0x02
gltest26 1:9bef044f45ad 74 #define LPFBW_42HZ 0x03
gltest26 1:9bef044f45ad 75 #define LPFBW_20HZ 0x04
gltest26 1:9bef044f45ad 76 #define LPFBW_10HZ 0x05
gltest26 1:9bef044f45ad 77 #define LPFBW_5HZ 0x06
gltest26 1:9bef044f45ad 78
gltest26 1:9bef044f45ad 79 // Utility
gltest26 1:9bef044f45ad 80 #ifndef M_PI
gltest26 1:9bef044f45ad 81 #define M_PI 3.1415926535897932384626433832795
gltest26 1:9bef044f45ad 82 #endif
gltest26 1:9bef044f45ad 83
gltest26 1:9bef044f45ad 84 /**
gltest26 1:9bef044f45ad 85 * ITG-3200 triple axis digital gyroscope.
gltest26 1:9bef044f45ad 86 */
gltest26 1:9bef044f45ad 87 class ITG3200 {
gltest26 1:9bef044f45ad 88
gltest26 1:9bef044f45ad 89 public:
gltest26 1:9bef044f45ad 90
gltest26 3:eea9733ca427 91 /**
gltest26 3:eea9733ca427 92 * The I2C address that can be passed directly to i2c object (it's already shifted 1 bit left).
gltest26 3:eea9733ca427 93 *
gltest26 3:eea9733ca427 94 * You don't need to manually set or clear the LSB when calling I2C::read() or I2C::write(),
gltest26 3:eea9733ca427 95 * the library takes care of it. We just always clear the LSB.
gltest26 3:eea9733ca427 96 */
gltest26 1:9bef044f45ad 97 static const int I2C_ADDRESS = 0xD0;
gltest26 1:9bef044f45ad 98
gltest26 1:9bef044f45ad 99 /**
gltest26 1:9bef044f45ad 100 * Constructor.
gltest26 1:9bef044f45ad 101 *
gltest26 1:9bef044f45ad 102 * Sets FS_SEL to 0x03 for proper opertaion.
gltest26 1:9bef044f45ad 103 *
gltest26 1:9bef044f45ad 104 * @param sda - mbed pin to use for the SDA I2C line.
gltest26 1:9bef044f45ad 105 * @param scl - mbed pin to use for the SCL I2C line.
gltest26 1:9bef044f45ad 106 */
gltest26 1:9bef044f45ad 107 ITG3200(PinName sda, PinName scl);
gltest26 1:9bef044f45ad 108
gltest26 1:9bef044f45ad 109 /**
gltest26 1:9bef044f45ad 110 * Get the identity of the device.
gltest26 1:9bef044f45ad 111 *
gltest26 1:9bef044f45ad 112 * @return The contents of the Who Am I register which contains the I2C
gltest26 1:9bef044f45ad 113 * address of the device.
gltest26 1:9bef044f45ad 114 */
gltest26 1:9bef044f45ad 115 char getWhoAmI(void);
gltest26 1:9bef044f45ad 116
gltest26 1:9bef044f45ad 117 /**
gltest26 1:9bef044f45ad 118 * Set the address of the device.
gltest26 1:9bef044f45ad 119 *
gltest26 1:9bef044f45ad 120 * @param address The I2C slave address to write to the Who Am I register
gltest26 1:9bef044f45ad 121 * on the device.
gltest26 1:9bef044f45ad 122 */
gltest26 1:9bef044f45ad 123 void setWhoAmI(char address);
gltest26 1:9bef044f45ad 124
gltest26 1:9bef044f45ad 125 /**
gltest26 1:9bef044f45ad 126 * Get the sample rate divider.
gltest26 1:9bef044f45ad 127 *
gltest26 1:9bef044f45ad 128 * @return The sample rate divider as a number from 0-255.
gltest26 1:9bef044f45ad 129 */
gltest26 1:9bef044f45ad 130 char getSampleRateDivider(void);
gltest26 1:9bef044f45ad 131
gltest26 1:9bef044f45ad 132 /**
gltest26 1:9bef044f45ad 133 * Set the sample rate divider.
gltest26 1:9bef044f45ad 134 *
gltest26 1:9bef044f45ad 135 * Fsample = Finternal / (divider + 1), where Finternal = 1kHz or 8kHz,
gltest26 1:9bef044f45ad 136 * as decidied by the DLPF_FS register.
gltest26 1:9bef044f45ad 137 *
gltest26 1:9bef044f45ad 138 * @param The sample rate divider as a number from 0-255.
gltest26 1:9bef044f45ad 139 */
gltest26 1:9bef044f45ad 140 void setSampleRateDivider(char divider);
gltest26 1:9bef044f45ad 141
gltest26 1:9bef044f45ad 142 /**
gltest26 1:9bef044f45ad 143 * Get the internal sample rate.
gltest26 1:9bef044f45ad 144 *
gltest26 1:9bef044f45ad 145 * @return The internal sample rate in kHz - either 1 or 8.
gltest26 1:9bef044f45ad 146 */
gltest26 1:9bef044f45ad 147 int getInternalSampleRate(void);
gltest26 1:9bef044f45ad 148
gltest26 1:9bef044f45ad 149 /**
gltest26 1:9bef044f45ad 150 * Set the low pass filter bandwidth.
gltest26 1:9bef044f45ad 151 *
gltest26 1:9bef044f45ad 152 * Also used to set the internal sample rate.
gltest26 1:9bef044f45ad 153 * Pass the #define bandwidth codes as a parameter.
gltest26 1:9bef044f45ad 154 *
gltest26 1:9bef044f45ad 155 * 256Hz -> 8kHz internal sample rate.
gltest26 1:9bef044f45ad 156 * Everything else -> 1kHz internal rate.
gltest26 1:9bef044f45ad 157 *
gltest26 1:9bef044f45ad 158 * @param bandwidth Low pass filter bandwidth code
gltest26 1:9bef044f45ad 159 */
gltest26 1:9bef044f45ad 160 void setLpBandwidth(char bandwidth);
gltest26 1:9bef044f45ad 161
gltest26 1:9bef044f45ad 162 /**
gltest26 1:9bef044f45ad 163 * Get the interrupt configuration.
gltest26 1:9bef044f45ad 164 *
gltest26 1:9bef044f45ad 165 * See datasheet for register contents details.
gltest26 1:9bef044f45ad 166 *
gltest26 1:9bef044f45ad 167 * 7 6 5 4
gltest26 1:9bef044f45ad 168 * +------+------+--------------+------------------+
gltest26 1:9bef044f45ad 169 * | ACTL | OPEN | LATCH_INT_EN | INT_ANYRD_2CLEAR |
gltest26 1:9bef044f45ad 170 * +------+------+--------------+------------------+
gltest26 1:9bef044f45ad 171 *
gltest26 1:9bef044f45ad 172 * 3 2 1 0
gltest26 1:9bef044f45ad 173 * +---+------------+------------+---+
gltest26 1:9bef044f45ad 174 * | 0 | ITG_RDY_EN | RAW_RDY_EN | 0 |
gltest26 1:9bef044f45ad 175 * +---+------------+------------+---+
gltest26 1:9bef044f45ad 176 *
gltest26 1:9bef044f45ad 177 * ACTL Logic level for INT output pin; 1 = active low, 0 = active high.
gltest26 1:9bef044f45ad 178 * OPEN Drive type for INT output pin; 1 = open drain, 0 = push-pull.
gltest26 1:9bef044f45ad 179 * LATCH_INT_EN Latch mode; 1 = latch until interrupt is cleared,
gltest26 1:9bef044f45ad 180 * 0 = 50us pulse.
gltest26 1:9bef044f45ad 181 * INT_ANYRD_2CLEAR Latch clear method; 1 = any register read,
gltest26 1:9bef044f45ad 182 * 0 = status register read only.
gltest26 1:9bef044f45ad 183 * ITG_RDY_EN Enable interrupt when device is ready,
gltest26 1:9bef044f45ad 184 * (PLL ready after changing clock source).
gltest26 1:9bef044f45ad 185 * RAW_RDY_EN Enable interrupt when data is available.
gltest26 1:9bef044f45ad 186 * 0 Bits 1 and 3 of the INT_CFG register should be zero.
gltest26 1:9bef044f45ad 187 *
gltest26 1:9bef044f45ad 188 * @return the contents of the INT_CFG register.
gltest26 1:9bef044f45ad 189 */
gltest26 1:9bef044f45ad 190 char getInterruptConfiguration(void);
gltest26 1:9bef044f45ad 191
gltest26 1:9bef044f45ad 192 /**
gltest26 1:9bef044f45ad 193 * Set the interrupt configuration.
gltest26 1:9bef044f45ad 194 *
gltest26 1:9bef044f45ad 195 * See datasheet for configuration byte details.
gltest26 1:9bef044f45ad 196 *
gltest26 1:9bef044f45ad 197 * 7 6 5 4
gltest26 1:9bef044f45ad 198 * +------+------+--------------+------------------+
gltest26 1:9bef044f45ad 199 * | ACTL | OPEN | LATCH_INT_EN | INT_ANYRD_2CLEAR |
gltest26 1:9bef044f45ad 200 * +------+------+--------------+------------------+
gltest26 1:9bef044f45ad 201 *
gltest26 1:9bef044f45ad 202 * 3 2 1 0
gltest26 1:9bef044f45ad 203 * +---+------------+------------+---+
gltest26 1:9bef044f45ad 204 * | 0 | ITG_RDY_EN | RAW_RDY_EN | 0 |
gltest26 1:9bef044f45ad 205 * +---+------------+------------+---+
gltest26 1:9bef044f45ad 206 *
gltest26 1:9bef044f45ad 207 * ACTL Logic level for INT output pin; 1 = active low, 0 = active high.
gltest26 1:9bef044f45ad 208 * OPEN Drive type for INT output pin; 1 = open drain, 0 = push-pull.
gltest26 1:9bef044f45ad 209 * LATCH_INT_EN Latch mode; 1 = latch until interrupt is cleared,
gltest26 1:9bef044f45ad 210 * 0 = 50us pulse.
gltest26 1:9bef044f45ad 211 * INT_ANYRD_2CLEAR Latch clear method; 1 = any register read,
gltest26 1:9bef044f45ad 212 * 0 = status register read only.
gltest26 1:9bef044f45ad 213 * ITG_RDY_EN Enable interrupt when device is ready,
gltest26 1:9bef044f45ad 214 * (PLL ready after changing clock source).
gltest26 1:9bef044f45ad 215 * RAW_RDY_EN Enable interrupt when data is available.
gltest26 1:9bef044f45ad 216 * 0 Bits 1 and 3 of the INT_CFG register should be zero.
gltest26 1:9bef044f45ad 217 *
gltest26 1:9bef044f45ad 218 * @param config Configuration byte to write to INT_CFG register.
gltest26 1:9bef044f45ad 219 */
gltest26 1:9bef044f45ad 220 void setInterruptConfiguration(char config);
gltest26 1:9bef044f45ad 221
gltest26 1:9bef044f45ad 222 /**
gltest26 1:9bef044f45ad 223 * Check the ITG_RDY bit of the INT_STATUS register.
gltest26 1:9bef044f45ad 224 *
gltest26 1:9bef044f45ad 225 * @return True if the ITG_RDY bit is set, corresponding to PLL ready,
gltest26 1:9bef044f45ad 226 * false if the ITG_RDY bit is not set, corresponding to PLL not
gltest26 1:9bef044f45ad 227 * ready.
gltest26 1:9bef044f45ad 228 */
gltest26 1:9bef044f45ad 229 bool isPllReady(void);
gltest26 1:9bef044f45ad 230
gltest26 1:9bef044f45ad 231 /**
gltest26 1:9bef044f45ad 232 * Check the RAW_DATA_RDY bit of the INT_STATUS register.
gltest26 1:9bef044f45ad 233 *
gltest26 1:9bef044f45ad 234 * @return True if the RAW_DATA_RDY bit is set, corresponding to new data
gltest26 1:9bef044f45ad 235 * in the sensor registers, false if the RAW_DATA_RDY bit is not
gltest26 1:9bef044f45ad 236 * set, corresponding to no new data yet in the sensor registers.
gltest26 1:9bef044f45ad 237 */
gltest26 1:9bef044f45ad 238 bool isRawDataReady(void);
gltest26 1:9bef044f45ad 239
gltest26 1:9bef044f45ad 240 /**
gltest26 1:9bef044f45ad 241 * Get the temperature in raw format.
gltest26 1:9bef044f45ad 242 *
gltest26 1:9bef044f45ad 243 * @return The temperature in raw 16bit integer.
gltest26 1:9bef044f45ad 244 */
gltest26 4:155c44407af5 245 int getRawTemperature(void){ return getWord(TEMP_OUT_H_REG); }
gltest26 1:9bef044f45ad 246
gltest26 1:9bef044f45ad 247 /**
gltest26 1:9bef044f45ad 248 * Get the temperature of the device.
gltest26 1:9bef044f45ad 249 *
gltest26 1:9bef044f45ad 250 * @return The temperature in degrees celsius.
gltest26 1:9bef044f45ad 251 */
gltest26 1:9bef044f45ad 252 float getTemperature(void);
gltest26 1:9bef044f45ad 253
gltest26 1:9bef044f45ad 254 /**
gltest26 1:9bef044f45ad 255 * Get the output for the x-axis gyroscope.
gltest26 1:9bef044f45ad 256 *
gltest26 1:9bef044f45ad 257 * Typical sensitivity is 14.375 LSB/(degrees/sec).
gltest26 1:9bef044f45ad 258 *
gltest26 1:9bef044f45ad 259 * @return The output on the x-axis in raw ADC counts.
gltest26 1:9bef044f45ad 260 */
gltest26 4:155c44407af5 261 int getGyroX(void){ return getWord(GYRO_XOUT_H_REG); }
gltest26 1:9bef044f45ad 262
gltest26 1:9bef044f45ad 263 /**
gltest26 1:9bef044f45ad 264 * Get the output for the y-axis gyroscope.
gltest26 1:9bef044f45ad 265 *
gltest26 1:9bef044f45ad 266 * Typical sensitivity is 14.375 LSB/(degrees/sec).
gltest26 1:9bef044f45ad 267 *
gltest26 1:9bef044f45ad 268 * @return The output on the y-axis in raw ADC counts.
gltest26 1:9bef044f45ad 269 */
gltest26 4:155c44407af5 270 int getGyroY(void){ return getWord(GYRO_YOUT_H_REG); }
gltest26 1:9bef044f45ad 271
gltest26 1:9bef044f45ad 272 /**
gltest26 1:9bef044f45ad 273 * Get the output on the z-axis gyroscope.
gltest26 1:9bef044f45ad 274 *
gltest26 1:9bef044f45ad 275 * Typical sensitivity is 14.375 LSB/(degrees/sec).
gltest26 1:9bef044f45ad 276 *
gltest26 1:9bef044f45ad 277 * @return The output on the z-axis in raw ADC counts.
gltest26 1:9bef044f45ad 278 */
gltest26 4:155c44407af5 279 int getGyroZ(void){ return getWord(GYRO_ZOUT_H_REG); }
gltest26 1:9bef044f45ad 280
gltest26 1:9bef044f45ad 281 /**
gltest26 1:9bef044f45ad 282 * Burst read the outputs on the x,y,z-axis gyroscope.
gltest26 1:9bef044f45ad 283 *
gltest26 1:9bef044f45ad 284 * Typical sensitivity is 14.375 LSB/(degrees/sec).
gltest26 1:9bef044f45ad 285 *
gltest26 1:9bef044f45ad 286 * @param readings The output buffer array that has at least 3 length.
gltest26 1:9bef044f45ad 287 */
gltest26 1:9bef044f45ad 288 void getGyroXYZ(int readings[3]);
gltest26 1:9bef044f45ad 289
gltest26 1:9bef044f45ad 290 /**
gltest26 1:9bef044f45ad 291 * Burst read the outputs on the x,y,z-axis gyroscope and convert them into degrees per second.
gltest26 1:9bef044f45ad 292 *
gltest26 1:9bef044f45ad 293 * @param readings The output buffer array that has at least 3 length.
gltest26 1:9bef044f45ad 294 */
gltest26 1:9bef044f45ad 295 void getGyroXYZDegrees(double readings[3]);
gltest26 1:9bef044f45ad 296
gltest26 1:9bef044f45ad 297 /**
gltest26 1:9bef044f45ad 298 * Burst read the outputs on the x,y,z-axis gyroscope and convert them into degrees per second.
gltest26 1:9bef044f45ad 299 *
gltest26 1:9bef044f45ad 300 * @param readings The output buffer array that has at least 3 length.
gltest26 1:9bef044f45ad 301 */
gltest26 1:9bef044f45ad 302 void getGyroXYZRadians(double readings[3]);
gltest26 1:9bef044f45ad 303
gltest26 1:9bef044f45ad 304 /**
gltest26 1:9bef044f45ad 305 * Get the power management configuration.
gltest26 1:9bef044f45ad 306 *
gltest26 1:9bef044f45ad 307 * See the datasheet for register contents details.
gltest26 1:9bef044f45ad 308 *
gltest26 1:9bef044f45ad 309 * 7 6 5 4
gltest26 1:9bef044f45ad 310 * +---------+-------+---------+---------+
gltest26 1:9bef044f45ad 311 * | H_RESET | SLEEP | STBY_XG | STBY_YG |
gltest26 1:9bef044f45ad 312 * +---------+-------+---------+---------+
gltest26 1:9bef044f45ad 313 *
gltest26 1:9bef044f45ad 314 * 3 2 1 0
gltest26 1:9bef044f45ad 315 * +---------+----------+----------+----------+
gltest26 1:9bef044f45ad 316 * | STBY_ZG | CLK_SEL2 | CLK_SEL1 | CLK_SEL0 |
gltest26 1:9bef044f45ad 317 * +---------+----------+----------+----------+
gltest26 1:9bef044f45ad 318 *
gltest26 1:9bef044f45ad 319 * H_RESET Reset device and internal registers to the power-up-default settings.
gltest26 1:9bef044f45ad 320 * SLEEP Enable low power sleep mode.
gltest26 1:9bef044f45ad 321 * STBY_XG Put gyro X in standby mode (1=standby, 0=normal).
gltest26 1:9bef044f45ad 322 * STBY_YG Put gyro Y in standby mode (1=standby, 0=normal).
gltest26 1:9bef044f45ad 323 * STBY_ZG Put gyro Z in standby mode (1=standby, 0=normal).
gltest26 1:9bef044f45ad 324 * CLK_SEL Select device clock source:
gltest26 1:9bef044f45ad 325 *
gltest26 1:9bef044f45ad 326 * CLK_SEL | Clock Source
gltest26 1:9bef044f45ad 327 * --------+--------------
gltest26 1:9bef044f45ad 328 * 0 Internal oscillator
gltest26 1:9bef044f45ad 329 * 1 PLL with X Gyro reference
gltest26 1:9bef044f45ad 330 * 2 PLL with Y Gyro reference
gltest26 1:9bef044f45ad 331 * 3 PLL with Z Gyro reference
gltest26 1:9bef044f45ad 332 * 4 PLL with external 32.768kHz reference
gltest26 1:9bef044f45ad 333 * 5 PLL with external 19.2MHz reference
gltest26 1:9bef044f45ad 334 * 6 Reserved
gltest26 1:9bef044f45ad 335 * 7 Reserved
gltest26 1:9bef044f45ad 336 *
gltest26 1:9bef044f45ad 337 * @return The contents of the PWR_MGM register.
gltest26 1:9bef044f45ad 338 */
gltest26 1:9bef044f45ad 339 char getPowerManagement(void);
gltest26 1:9bef044f45ad 340
gltest26 1:9bef044f45ad 341 /**
gltest26 1:9bef044f45ad 342 * Set power management configuration.
gltest26 1:9bef044f45ad 343 *
gltest26 1:9bef044f45ad 344 * See the datasheet for configuration byte details
gltest26 1:9bef044f45ad 345 *
gltest26 1:9bef044f45ad 346 * 7 6 5 4
gltest26 1:9bef044f45ad 347 * +---------+-------+---------+---------+
gltest26 1:9bef044f45ad 348 * | H_RESET | SLEEP | STBY_XG | STBY_YG |
gltest26 1:9bef044f45ad 349 * +---------+-------+---------+---------+
gltest26 1:9bef044f45ad 350 *
gltest26 1:9bef044f45ad 351 * 3 2 1 0
gltest26 1:9bef044f45ad 352 * +---------+----------+----------+----------+
gltest26 1:9bef044f45ad 353 * | STBY_ZG | CLK_SEL2 | CLK_SEL1 | CLK_SEL0 |
gltest26 1:9bef044f45ad 354 * +---------+----------+----------+----------+
gltest26 1:9bef044f45ad 355 *
gltest26 1:9bef044f45ad 356 * H_RESET Reset device and internal registers to the power-up-default settings.
gltest26 1:9bef044f45ad 357 * SLEEP Enable low power sleep mode.
gltest26 1:9bef044f45ad 358 * STBY_XG Put gyro X in standby mode (1=standby, 0=normal).
gltest26 1:9bef044f45ad 359 * STBY_YG Put gyro Y in standby mode (1=standby, 0=normal).
gltest26 1:9bef044f45ad 360 * STBY_ZG Put gyro Z in standby mode (1=standby, 0=normal).
gltest26 1:9bef044f45ad 361 * CLK_SEL Select device clock source:
gltest26 1:9bef044f45ad 362 *
gltest26 1:9bef044f45ad 363 * CLK_SEL | Clock Source
gltest26 1:9bef044f45ad 364 * --------+--------------
gltest26 1:9bef044f45ad 365 * 0 Internal oscillator
gltest26 1:9bef044f45ad 366 * 1 PLL with X Gyro reference
gltest26 1:9bef044f45ad 367 * 2 PLL with Y Gyro reference
gltest26 1:9bef044f45ad 368 * 3 PLL with Z Gyro reference
gltest26 1:9bef044f45ad 369 * 4 PLL with external 32.768kHz reference
gltest26 1:9bef044f45ad 370 * 5 PLL with external 19.2MHz reference
gltest26 1:9bef044f45ad 371 * 6 Reserved
gltest26 1:9bef044f45ad 372 * 7 Reserved
gltest26 1:9bef044f45ad 373 *
gltest26 1:9bef044f45ad 374 * @param config The configuration byte to write to the PWR_MGM register.
gltest26 1:9bef044f45ad 375 */
gltest26 1:9bef044f45ad 376 void setPowerManagement(char config);
gltest26 3:eea9733ca427 377
gltest26 3:eea9733ca427 378 /**
gltest26 3:eea9733ca427 379 * Calibrate the sensor drift by sampling zero offset.
gltest26 3:eea9733ca427 380 *
gltest26 3:eea9733ca427 381 * Be sure to keep the sensor stationary while sampling offset.
gltest26 3:eea9733ca427 382 *
gltest26 3:eea9733ca427 383 * Once this function is invoked, following getGyroXYZ*() functions return
gltest26 3:eea9733ca427 384 * corrected values.
gltest26 3:eea9733ca427 385 *
gltest26 3:eea9733ca427 386 * If the drift value changes over time, you can call this function once in a while
gltest26 3:eea9733ca427 387 * to follow it. But don't forget to fix the sensor while calibrating!
gltest26 3:eea9733ca427 388 *
gltest26 3:eea9733ca427 389 * @param time The time span to sample and average offset.
gltest26 3:eea9733ca427 390 * Sampling rate is limited, so giving long time to calibrate will improve
gltest26 3:eea9733ca427 391 * correction quality.
gltest26 3:eea9733ca427 392 */
gltest26 3:eea9733ca427 393 void calibrate(double time);
gltest26 6:a7ad6046824c 394
gltest26 6:a7ad6046824c 395 long getCalibrationSamples()const{
gltest26 6:a7ad6046824c 396 return calibSamples;
gltest26 6:a7ad6046824c 397 }
gltest26 3:eea9733ca427 398
gltest26 3:eea9733ca427 399 protected:
gltest26 4:155c44407af5 400
gltest26 4:155c44407af5 401 /**
gltest26 4:155c44407af5 402 * Reads a word (2 bytes) from the sensor via I2C bus.
gltest26 4:155c44407af5 403 *
gltest26 4:155c44407af5 404 * The queried value is assumed big-endian, 2's complement value.
gltest26 4:155c44407af5 405 *
gltest26 4:155c44407af5 406 * This protected function is added because we shouldn't write getGyroX(), getGyroY() and getGyroZ()
gltest26 4:155c44407af5 407 * independently, but collect common codes.
gltest26 4:155c44407af5 408 *
gltest26 4:155c44407af5 409 * @param regi Register address to be read.
gltest26 4:155c44407af5 410 */
gltest26 4:155c44407af5 411 int getWord(int regi);
gltest26 4:155c44407af5 412
gltest26 3:eea9733ca427 413 /**
gltest26 3:eea9733ca427 414 * An internal method to acquire gyro sensor readings before calibration correction.
gltest26 3:eea9733ca427 415 *
gltest26 3:eea9733ca427 416 * Protected for the time being, although there could be cases that raw values are
gltest26 3:eea9733ca427 417 * appreciated by the user.
gltest26 3:eea9733ca427 418 */
gltest26 3:eea9733ca427 419 void getRawGyroXYZ(int readings[3]);
gltest26 3:eea9733ca427 420
gltest26 3:eea9733ca427 421 /**
gltest26 3:eea9733ca427 422 * Offset values that will be subtracted from output.
gltest26 3:eea9733ca427 423 *
gltest26 3:eea9733ca427 424 * TODO: temperature drift calibration
gltest26 3:eea9733ca427 425 */
gltest26 3:eea9733ca427 426 int offset[3];
gltest26 6:a7ad6046824c 427
gltest26 6:a7ad6046824c 428 long calibSamples;
gltest26 1:9bef044f45ad 429
gltest26 1:9bef044f45ad 430 private:
gltest26 1:9bef044f45ad 431
gltest26 1:9bef044f45ad 432 I2C i2c_;
gltest26 1:9bef044f45ad 433
gltest26 5:0a0315f0f34e 434 /**
gltest26 5:0a0315f0f34e 435 * Converts big-endian 2's complement byte pair to native byte order of
gltest26 5:0a0315f0f34e 436 * the CPU and then sign extend it to the CPU's register size.
gltest26 5:0a0315f0f34e 437 *
gltest26 5:0a0315f0f34e 438 * Implemented here to make the compiler inline expand it.
gltest26 5:0a0315f0f34e 439 */
gltest26 5:0a0315f0f34e 440 int swapExtend(const char rx[2]){
gltest26 5:0a0315f0f34e 441 // Readings are expressed in 16bit 2's complement, so we must first
gltest26 5:0a0315f0f34e 442 // concatenate two bytes to make a word and sign extend it to obtain
gltest26 5:0a0315f0f34e 443 // correct negative values.
gltest26 5:0a0315f0f34e 444 // ARMCC compiles char as unsigned, which means no sign extension is
gltest26 5:0a0315f0f34e 445 // performed during bitwise operations to chars. But we should make sure
gltest26 5:0a0315f0f34e 446 // that lower byte won't extend its sign past upper byte for other
gltest26 5:0a0315f0f34e 447 // compilers if we want to keep it portable.
gltest26 5:0a0315f0f34e 448 return int16_t(((unsigned char)rx[0] << 8) | (unsigned char)rx[1]);
gltest26 5:0a0315f0f34e 449 }
gltest26 1:9bef044f45ad 450 };
gltest26 1:9bef044f45ad 451
gltest26 1:9bef044f45ad 452
gltest26 3:eea9733ca427 453 inline void ITG3200::getGyroXYZ(int readings[3]){
gltest26 3:eea9733ca427 454 getRawGyroXYZ(readings);
gltest26 3:eea9733ca427 455 for(int i = 0; i < 3; i++)
gltest26 3:eea9733ca427 456 readings[i] -= offset[i];
gltest26 3:eea9733ca427 457 }
gltest26 3:eea9733ca427 458
gltest26 1:9bef044f45ad 459 inline void ITG3200::getGyroXYZDegrees(double readings[3]){
gltest26 1:9bef044f45ad 460 int intData[3];
gltest26 1:9bef044f45ad 461 getGyroXYZ(intData);
gltest26 1:9bef044f45ad 462 for(int i = 0; i < 3; i++)
gltest26 1:9bef044f45ad 463 readings[i] = intData[i] * 2000. / 32767.;
gltest26 1:9bef044f45ad 464 }
gltest26 1:9bef044f45ad 465
gltest26 1:9bef044f45ad 466 inline void ITG3200::getGyroXYZRadians(double readings[3]){
gltest26 1:9bef044f45ad 467 int intData[3];
gltest26 1:9bef044f45ad 468 getGyroXYZ(intData);
gltest26 1:9bef044f45ad 469 for(int i = 0; i < 3; i++)
gltest26 1:9bef044f45ad 470 readings[i] = intData[i] * 2000. / 32767. * 2. * M_PI / 360.;
gltest26 1:9bef044f45ad 471 }
gltest26 1:9bef044f45ad 472
gltest26 1:9bef044f45ad 473 #endif /* ITG3200_H */