LSM9DS1 IMU sensor driver

Dependents:   LSM9DS1_Demo LSM9DS1_Demo Nucleo_i2c_master

Committer:
beanmachine44
Date:
Mon Oct 19 13:56:52 2015 +0000
Revision:
1:0e76f237c23d
Parent:
0:622e8874902e
Updated docs to match my changes to the base LSM9DS0 code.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
beanmachine44 0:622e8874902e 1 #include "LSM9DS1.h"
beanmachine44 0:622e8874902e 2
beanmachine44 0:622e8874902e 3 LSM9DS1::LSM9DS1(PinName sda, PinName scl, uint8_t xgAddr, uint8_t mAddr) : i2c(sda, scl)
beanmachine44 0:622e8874902e 4 {
beanmachine44 0:622e8874902e 5 // xgAddress and mAddress will store the 7-bit I2C address, if using I2C.
beanmachine44 0:622e8874902e 6 xgAddress = xgAddr;
beanmachine44 0:622e8874902e 7 mAddress = mAddr;
beanmachine44 0:622e8874902e 8 }
beanmachine44 0:622e8874902e 9
beanmachine44 0:622e8874902e 10 uint16_t LSM9DS1::begin(gyro_scale gScl, accel_scale aScl, mag_scale mScl,
beanmachine44 0:622e8874902e 11 gyro_odr gODR, accel_odr aODR, mag_odr mODR)
beanmachine44 0:622e8874902e 12 {
beanmachine44 0:622e8874902e 13 // Store the given scales in class variables. These scale variables
beanmachine44 0:622e8874902e 14 // are used throughout to calculate the actual g's, DPS,and Gs's.
beanmachine44 0:622e8874902e 15 gScale = gScl;
beanmachine44 0:622e8874902e 16 aScale = aScl;
beanmachine44 0:622e8874902e 17 mScale = mScl;
beanmachine44 0:622e8874902e 18
beanmachine44 0:622e8874902e 19 // Once we have the scale values, we can calculate the resolution
beanmachine44 0:622e8874902e 20 // of each sensor. That's what these functions are for. One for each sensor
beanmachine44 0:622e8874902e 21 calcgRes(); // Calculate DPS / ADC tick, stored in gRes variable
beanmachine44 0:622e8874902e 22 calcmRes(); // Calculate Gs / ADC tick, stored in mRes variable
beanmachine44 0:622e8874902e 23 calcaRes(); // Calculate g / ADC tick, stored in aRes variable
beanmachine44 0:622e8874902e 24
beanmachine44 0:622e8874902e 25
beanmachine44 0:622e8874902e 26 // To verify communication, we can read from the WHO_AM_I register of
beanmachine44 0:622e8874902e 27 // each device. Store those in a variable so we can return them.
beanmachine44 0:622e8874902e 28 // The start of the addresses we want to read from
beanmachine44 0:622e8874902e 29 char cmd[2] = {
beanmachine44 0:622e8874902e 30 WHO_AM_I_XG,
beanmachine44 0:622e8874902e 31 0
beanmachine44 0:622e8874902e 32 };
beanmachine44 0:622e8874902e 33
beanmachine44 0:622e8874902e 34 // Write the address we are going to read from and don't end the transaction
beanmachine44 0:622e8874902e 35 i2c.write(xgAddress, cmd, 1, true);
beanmachine44 0:622e8874902e 36 // Read in all the 8 bits of data
beanmachine44 0:622e8874902e 37 i2c.read(xgAddress, cmd+1, 1);
beanmachine44 0:622e8874902e 38 uint8_t xgTest = cmd[1]; // Read the accel/gyro WHO_AM_I
beanmachine44 0:622e8874902e 39
beanmachine44 0:622e8874902e 40 // Reset to the address of the mag who am i
beanmachine44 0:622e8874902e 41 cmd[1] = WHO_AM_I_M;
beanmachine44 0:622e8874902e 42 // Write the address we are going to read from and don't end the transaction
beanmachine44 0:622e8874902e 43 i2c.write(mAddress, cmd, 1, true);
beanmachine44 0:622e8874902e 44 // Read in all the 8 bits of data
beanmachine44 0:622e8874902e 45 i2c.read(mAddress, cmd+1, 1);
beanmachine44 0:622e8874902e 46 uint8_t mTest = cmd[1]; // Read the mag WHO_AM_I
beanmachine44 0:622e8874902e 47
beanmachine44 0:622e8874902e 48 // Gyro initialization stuff:
beanmachine44 0:622e8874902e 49 initGyro(); // This will "turn on" the gyro. Setting up interrupts, etc.
beanmachine44 0:622e8874902e 50 setGyroODR(gODR); // Set the gyro output data rate and bandwidth.
beanmachine44 0:622e8874902e 51 setGyroScale(gScale); // Set the gyro range
beanmachine44 0:622e8874902e 52
beanmachine44 0:622e8874902e 53 // Accelerometer initialization stuff:
beanmachine44 0:622e8874902e 54 initAccel(); // "Turn on" all axes of the accel. Set up interrupts, etc.
beanmachine44 0:622e8874902e 55 setAccelODR(aODR); // Set the accel data rate.
beanmachine44 0:622e8874902e 56 setAccelScale(aScale); // Set the accel range.
beanmachine44 0:622e8874902e 57
beanmachine44 0:622e8874902e 58 // Magnetometer initialization stuff:
beanmachine44 0:622e8874902e 59 initMag(); // "Turn on" all axes of the mag. Set up interrupts, etc.
beanmachine44 0:622e8874902e 60 setMagODR(mODR); // Set the magnetometer output data rate.
beanmachine44 0:622e8874902e 61 setMagScale(mScale); // Set the magnetometer's range.
beanmachine44 0:622e8874902e 62
beanmachine44 0:622e8874902e 63 // Once everything is initialized, return the WHO_AM_I registers we read:
beanmachine44 0:622e8874902e 64 return (xgTest << 8) | mTest;
beanmachine44 0:622e8874902e 65 }
beanmachine44 0:622e8874902e 66
beanmachine44 0:622e8874902e 67 void LSM9DS1::initGyro()
beanmachine44 0:622e8874902e 68 {
beanmachine44 0:622e8874902e 69 char cmd[4] = {
beanmachine44 0:622e8874902e 70 CTRL_REG1_G,
beanmachine44 0:622e8874902e 71 gScale | G_ODR_119_BW_14,
beanmachine44 0:622e8874902e 72 0, // Default data out and int out
beanmachine44 0:622e8874902e 73 0 // Default power mode and high pass settings
beanmachine44 0:622e8874902e 74 };
beanmachine44 0:622e8874902e 75
beanmachine44 0:622e8874902e 76 // Write the data to the gyro control registers
beanmachine44 0:622e8874902e 77 i2c.write(xgAddress, cmd, 4);
beanmachine44 0:622e8874902e 78 }
beanmachine44 0:622e8874902e 79
beanmachine44 0:622e8874902e 80 void LSM9DS1::initAccel()
beanmachine44 0:622e8874902e 81 {
beanmachine44 0:622e8874902e 82 char cmd[4] = {
beanmachine44 0:622e8874902e 83 CTRL_REG5_XL,
beanmachine44 0:622e8874902e 84 0x38, // Enable all axis and don't decimate data in out Registers
beanmachine44 0:622e8874902e 85 (A_ODR_119 << 5) | (aScale << 3) | (A_BW_AUTO_SCALE), // 119 Hz ODR, set scale, and auto BW
beanmachine44 0:622e8874902e 86 0 // Default resolution mode and filtering settings
beanmachine44 0:622e8874902e 87 };
beanmachine44 0:622e8874902e 88
beanmachine44 0:622e8874902e 89 // Write the data to the accel control registers
beanmachine44 0:622e8874902e 90 i2c.write(xgAddress, cmd, 4);
beanmachine44 0:622e8874902e 91 }
beanmachine44 0:622e8874902e 92
beanmachine44 0:622e8874902e 93 void LSM9DS1::initMag()
beanmachine44 0:622e8874902e 94 {
beanmachine44 0:622e8874902e 95 char cmd[4] = {
beanmachine44 0:622e8874902e 96 CTRL_REG1_M,
beanmachine44 0:622e8874902e 97 0x10, // Default data rate, xy axes mode, and temp comp
beanmachine44 0:622e8874902e 98 mScale << 5, // Set mag scale
beanmachine44 0:622e8874902e 99 0 // Enable I2C, write only SPI, not LP mode, Continuous conversion mode
beanmachine44 0:622e8874902e 100 };
beanmachine44 0:622e8874902e 101
beanmachine44 0:622e8874902e 102 // Write the data to the mag control registers
beanmachine44 0:622e8874902e 103 i2c.write(mAddress, cmd, 4);
beanmachine44 0:622e8874902e 104 }
beanmachine44 0:622e8874902e 105
beanmachine44 0:622e8874902e 106 void LSM9DS1::readAccel()
beanmachine44 0:622e8874902e 107 {
beanmachine44 0:622e8874902e 108 // The data we are going to read from the accel
beanmachine44 0:622e8874902e 109 char data[6];
beanmachine44 0:622e8874902e 110
beanmachine44 0:622e8874902e 111 // The start of the addresses we want to read from
beanmachine44 0:622e8874902e 112 char subAddress = OUT_X_L_XL;
beanmachine44 0:622e8874902e 113
beanmachine44 0:622e8874902e 114 // Write the address we are going to read from and don't end the transaction
beanmachine44 0:622e8874902e 115 i2c.write(xgAddress, &subAddress, 1, true);
beanmachine44 0:622e8874902e 116 // Read in all 8 bit registers containing the axes data
beanmachine44 0:622e8874902e 117 i2c.read(xgAddress, data, 6);
beanmachine44 0:622e8874902e 118
beanmachine44 0:622e8874902e 119 // Reassemble the data and convert to g
beanmachine44 0:622e8874902e 120 ax_raw = data[0] | (data[1] << 8);
beanmachine44 0:622e8874902e 121 ay_raw = data[2] | (data[3] << 8);
beanmachine44 0:622e8874902e 122 az_raw = data[4] | (data[5] << 8);
beanmachine44 0:622e8874902e 123 ax = ax_raw * aRes;
beanmachine44 0:622e8874902e 124 ay = ay_raw * aRes;
beanmachine44 0:622e8874902e 125 az = az_raw * aRes;
beanmachine44 0:622e8874902e 126 }
beanmachine44 0:622e8874902e 127
beanmachine44 0:622e8874902e 128 void LSM9DS1::readMag()
beanmachine44 0:622e8874902e 129 {
beanmachine44 0:622e8874902e 130 // The data we are going to read from the mag
beanmachine44 0:622e8874902e 131 char data[6];
beanmachine44 0:622e8874902e 132
beanmachine44 0:622e8874902e 133 // The start of the addresses we want to read from
beanmachine44 0:622e8874902e 134 char subAddress = OUT_X_L_M;
beanmachine44 0:622e8874902e 135
beanmachine44 0:622e8874902e 136 // Write the address we are going to read from and don't end the transaction
beanmachine44 0:622e8874902e 137 i2c.write(mAddress, &subAddress, 1, true);
beanmachine44 0:622e8874902e 138 // Read in all 8 bit registers containing the axes data
beanmachine44 0:622e8874902e 139 i2c.read(mAddress, data, 6);
beanmachine44 0:622e8874902e 140
beanmachine44 0:622e8874902e 141 // Reassemble the data and convert to degrees
beanmachine44 0:622e8874902e 142 mx_raw = data[0] | (data[1] << 8);
beanmachine44 0:622e8874902e 143 my_raw = data[2] | (data[3] << 8);
beanmachine44 0:622e8874902e 144 mz_raw = data[4] | (data[5] << 8);
beanmachine44 0:622e8874902e 145 mx = mx_raw * mRes;
beanmachine44 0:622e8874902e 146 my = my_raw * mRes;
beanmachine44 0:622e8874902e 147 mz = mz_raw * mRes;
beanmachine44 0:622e8874902e 148 }
beanmachine44 0:622e8874902e 149
beanmachine44 0:622e8874902e 150 void LSM9DS1::readTemp()
beanmachine44 0:622e8874902e 151 {
beanmachine44 0:622e8874902e 152 // The data we are going to read from the temp
beanmachine44 0:622e8874902e 153 char data[2];
beanmachine44 0:622e8874902e 154
beanmachine44 0:622e8874902e 155 // The start of the addresses we want to read from
beanmachine44 0:622e8874902e 156 char subAddress = OUT_TEMP_L;
beanmachine44 0:622e8874902e 157
beanmachine44 0:622e8874902e 158 // Write the address we are going to read from and don't end the transaction
beanmachine44 0:622e8874902e 159 i2c.write(xgAddress, &subAddress, 1, true);
beanmachine44 0:622e8874902e 160 // Read in all 8 bit registers containing the axes data
beanmachine44 0:622e8874902e 161 i2c.read(xgAddress, data, 2);
beanmachine44 0:622e8874902e 162
beanmachine44 0:622e8874902e 163 // Temperature is a 12-bit signed integer
beanmachine44 0:622e8874902e 164 temperature_raw = data[0] | (data[1] << 8);
beanmachine44 0:622e8874902e 165
beanmachine44 0:622e8874902e 166 temperature_c = (float)temperature_raw / 8.0 + 25;
beanmachine44 0:622e8874902e 167 temperature_f = temperature_c * 1.8 + 32;
beanmachine44 0:622e8874902e 168 }
beanmachine44 0:622e8874902e 169
beanmachine44 0:622e8874902e 170
beanmachine44 0:622e8874902e 171 void LSM9DS1::readGyro()
beanmachine44 0:622e8874902e 172 {
beanmachine44 0:622e8874902e 173 // The data we are going to read from the gyro
beanmachine44 0:622e8874902e 174 char data[6];
beanmachine44 0:622e8874902e 175
beanmachine44 0:622e8874902e 176 // The start of the addresses we want to read from
beanmachine44 0:622e8874902e 177 char subAddress = OUT_X_L_G;
beanmachine44 0:622e8874902e 178
beanmachine44 0:622e8874902e 179 // Write the address we are going to read from and don't end the transaction
beanmachine44 0:622e8874902e 180 i2c.write(xgAddress, &subAddress, 1, true);
beanmachine44 0:622e8874902e 181 // Read in all 8 bit registers containing the axes data
beanmachine44 0:622e8874902e 182 i2c.read(xgAddress, data, 6);
beanmachine44 0:622e8874902e 183
beanmachine44 0:622e8874902e 184 // Reassemble the data and convert to degrees/sec
beanmachine44 0:622e8874902e 185 gx_raw = data[0] | (data[1] << 8);
beanmachine44 0:622e8874902e 186 gy_raw = data[2] | (data[3] << 8);
beanmachine44 0:622e8874902e 187 gz_raw = data[4] | (data[5] << 8);
beanmachine44 0:622e8874902e 188 gx = gx_raw * gRes;
beanmachine44 0:622e8874902e 189 gy = gy_raw * gRes;
beanmachine44 0:622e8874902e 190 gz = gz_raw * gRes;
beanmachine44 0:622e8874902e 191 }
beanmachine44 0:622e8874902e 192
beanmachine44 0:622e8874902e 193 void LSM9DS1::setGyroScale(gyro_scale gScl)
beanmachine44 0:622e8874902e 194 {
beanmachine44 0:622e8874902e 195 // The start of the addresses we want to read from
beanmachine44 0:622e8874902e 196 char cmd[2] = {
beanmachine44 0:622e8874902e 197 CTRL_REG1_G,
beanmachine44 0:622e8874902e 198 0
beanmachine44 0:622e8874902e 199 };
beanmachine44 0:622e8874902e 200
beanmachine44 0:622e8874902e 201 // Write the address we are going to read from and don't end the transaction
beanmachine44 0:622e8874902e 202 i2c.write(xgAddress, cmd, 1, true);
beanmachine44 0:622e8874902e 203 // Read in all the 8 bits of data
beanmachine44 0:622e8874902e 204 i2c.read(xgAddress, cmd+1, 1);
beanmachine44 0:622e8874902e 205
beanmachine44 0:622e8874902e 206 // Then mask out the gyro scale bits:
beanmachine44 0:622e8874902e 207 cmd[1] &= 0xFF^(0x3 << 3);
beanmachine44 0:622e8874902e 208 // Then shift in our new scale bits:
beanmachine44 0:622e8874902e 209 cmd[1] |= gScl << 3;
beanmachine44 0:622e8874902e 210
beanmachine44 0:622e8874902e 211 // Write the gyroscale out to the gyro
beanmachine44 0:622e8874902e 212 i2c.write(xgAddress, cmd, 2);
beanmachine44 0:622e8874902e 213
beanmachine44 0:622e8874902e 214 // We've updated the sensor, but we also need to update our class variables
beanmachine44 0:622e8874902e 215 // First update gScale:
beanmachine44 0:622e8874902e 216 gScale = gScl;
beanmachine44 0:622e8874902e 217 // Then calculate a new gRes, which relies on gScale being set correctly:
beanmachine44 0:622e8874902e 218 calcgRes();
beanmachine44 0:622e8874902e 219 }
beanmachine44 0:622e8874902e 220
beanmachine44 0:622e8874902e 221 void LSM9DS1::setAccelScale(accel_scale aScl)
beanmachine44 0:622e8874902e 222 {
beanmachine44 0:622e8874902e 223 // The start of the addresses we want to read from
beanmachine44 0:622e8874902e 224 char cmd[2] = {
beanmachine44 0:622e8874902e 225 CTRL_REG6_XL,
beanmachine44 0:622e8874902e 226 0
beanmachine44 0:622e8874902e 227 };
beanmachine44 0:622e8874902e 228
beanmachine44 0:622e8874902e 229 // Write the address we are going to read from and don't end the transaction
beanmachine44 0:622e8874902e 230 i2c.write(xgAddress, cmd, 1, true);
beanmachine44 0:622e8874902e 231 // Read in all the 8 bits of data
beanmachine44 0:622e8874902e 232 i2c.read(xgAddress, cmd+1, 1);
beanmachine44 0:622e8874902e 233
beanmachine44 0:622e8874902e 234 // Then mask out the accel scale bits:
beanmachine44 0:622e8874902e 235 cmd[1] &= 0xFF^(0x3 << 3);
beanmachine44 0:622e8874902e 236 // Then shift in our new scale bits:
beanmachine44 0:622e8874902e 237 cmd[1] |= aScl << 3;
beanmachine44 0:622e8874902e 238
beanmachine44 0:622e8874902e 239 // Write the accelscale out to the accel
beanmachine44 0:622e8874902e 240 i2c.write(xgAddress, cmd, 2);
beanmachine44 0:622e8874902e 241
beanmachine44 0:622e8874902e 242 // We've updated the sensor, but we also need to update our class variables
beanmachine44 0:622e8874902e 243 // First update aScale:
beanmachine44 0:622e8874902e 244 aScale = aScl;
beanmachine44 0:622e8874902e 245 // Then calculate a new aRes, which relies on aScale being set correctly:
beanmachine44 0:622e8874902e 246 calcaRes();
beanmachine44 0:622e8874902e 247 }
beanmachine44 0:622e8874902e 248
beanmachine44 0:622e8874902e 249 void LSM9DS1::setMagScale(mag_scale mScl)
beanmachine44 0:622e8874902e 250 {
beanmachine44 0:622e8874902e 251 // The start of the addresses we want to read from
beanmachine44 0:622e8874902e 252 char cmd[2] = {
beanmachine44 0:622e8874902e 253 CTRL_REG2_M,
beanmachine44 0:622e8874902e 254 0
beanmachine44 0:622e8874902e 255 };
beanmachine44 0:622e8874902e 256
beanmachine44 0:622e8874902e 257 // Write the address we are going to read from and don't end the transaction
beanmachine44 0:622e8874902e 258 i2c.write(mAddress, cmd, 1, true);
beanmachine44 0:622e8874902e 259 // Read in all the 8 bits of data
beanmachine44 0:622e8874902e 260 i2c.read(mAddress, cmd+1, 1);
beanmachine44 0:622e8874902e 261
beanmachine44 0:622e8874902e 262 // Then mask out the mag scale bits:
beanmachine44 0:622e8874902e 263 cmd[1] &= 0xFF^(0x3 << 5);
beanmachine44 0:622e8874902e 264 // Then shift in our new scale bits:
beanmachine44 0:622e8874902e 265 cmd[1] |= mScl << 5;
beanmachine44 0:622e8874902e 266
beanmachine44 0:622e8874902e 267 // Write the magscale out to the mag
beanmachine44 0:622e8874902e 268 i2c.write(mAddress, cmd, 2);
beanmachine44 0:622e8874902e 269
beanmachine44 0:622e8874902e 270 // We've updated the sensor, but we also need to update our class variables
beanmachine44 0:622e8874902e 271 // First update mScale:
beanmachine44 0:622e8874902e 272 mScale = mScl;
beanmachine44 0:622e8874902e 273 // Then calculate a new mRes, which relies on mScale being set correctly:
beanmachine44 0:622e8874902e 274 calcmRes();
beanmachine44 0:622e8874902e 275 }
beanmachine44 0:622e8874902e 276
beanmachine44 0:622e8874902e 277 void LSM9DS1::setGyroODR(gyro_odr gRate)
beanmachine44 0:622e8874902e 278 {
beanmachine44 0:622e8874902e 279 // The start of the addresses we want to read from
beanmachine44 0:622e8874902e 280 char cmd[2] = {
beanmachine44 0:622e8874902e 281 CTRL_REG1_G,
beanmachine44 0:622e8874902e 282 0
beanmachine44 0:622e8874902e 283 };
beanmachine44 0:622e8874902e 284
beanmachine44 0:622e8874902e 285 // Write the address we are going to read from and don't end the transaction
beanmachine44 0:622e8874902e 286 i2c.write(xgAddress, cmd, 1, true);
beanmachine44 0:622e8874902e 287 // Read in all the 8 bits of data
beanmachine44 0:622e8874902e 288 i2c.read(xgAddress, cmd+1, 1);
beanmachine44 0:622e8874902e 289
beanmachine44 0:622e8874902e 290 // Then mask out the gyro odr bits:
beanmachine44 0:622e8874902e 291 cmd[1] &= (0x3 << 3);
beanmachine44 0:622e8874902e 292 // Then shift in our new odr bits:
beanmachine44 0:622e8874902e 293 cmd[1] |= gRate;
beanmachine44 0:622e8874902e 294
beanmachine44 0:622e8874902e 295 // Write the gyroodr out to the gyro
beanmachine44 0:622e8874902e 296 i2c.write(xgAddress, cmd, 2);
beanmachine44 0:622e8874902e 297 }
beanmachine44 0:622e8874902e 298
beanmachine44 0:622e8874902e 299 void LSM9DS1::setAccelODR(accel_odr aRate)
beanmachine44 0:622e8874902e 300 {
beanmachine44 0:622e8874902e 301 // The start of the addresses we want to read from
beanmachine44 0:622e8874902e 302 char cmd[2] = {
beanmachine44 0:622e8874902e 303 CTRL_REG6_XL,
beanmachine44 0:622e8874902e 304 0
beanmachine44 0:622e8874902e 305 };
beanmachine44 0:622e8874902e 306
beanmachine44 0:622e8874902e 307 // Write the address we are going to read from and don't end the transaction
beanmachine44 0:622e8874902e 308 i2c.write(xgAddress, cmd, 1, true);
beanmachine44 0:622e8874902e 309 // Read in all the 8 bits of data
beanmachine44 0:622e8874902e 310 i2c.read(xgAddress, cmd+1, 1);
beanmachine44 0:622e8874902e 311
beanmachine44 0:622e8874902e 312 // Then mask out the accel odr bits:
beanmachine44 0:622e8874902e 313 cmd[1] &= 0xFF^(0x7 << 5);
beanmachine44 0:622e8874902e 314 // Then shift in our new odr bits:
beanmachine44 0:622e8874902e 315 cmd[1] |= aRate << 5;
beanmachine44 0:622e8874902e 316
beanmachine44 0:622e8874902e 317 // Write the accelodr out to the accel
beanmachine44 0:622e8874902e 318 i2c.write(xgAddress, cmd, 2);
beanmachine44 0:622e8874902e 319 }
beanmachine44 0:622e8874902e 320
beanmachine44 0:622e8874902e 321 void LSM9DS1::setMagODR(mag_odr mRate)
beanmachine44 0:622e8874902e 322 {
beanmachine44 0:622e8874902e 323 // The start of the addresses we want to read from
beanmachine44 0:622e8874902e 324 char cmd[2] = {
beanmachine44 0:622e8874902e 325 CTRL_REG1_M,
beanmachine44 0:622e8874902e 326 0
beanmachine44 0:622e8874902e 327 };
beanmachine44 0:622e8874902e 328
beanmachine44 0:622e8874902e 329 // Write the address we are going to read from and don't end the transaction
beanmachine44 0:622e8874902e 330 i2c.write(mAddress, cmd, 1, true);
beanmachine44 0:622e8874902e 331 // Read in all the 8 bits of data
beanmachine44 0:622e8874902e 332 i2c.read(mAddress, cmd+1, 1);
beanmachine44 0:622e8874902e 333
beanmachine44 0:622e8874902e 334 // Then mask out the mag odr bits:
beanmachine44 0:622e8874902e 335 cmd[1] &= 0xFF^(0x7 << 2);
beanmachine44 0:622e8874902e 336 // Then shift in our new odr bits:
beanmachine44 0:622e8874902e 337 cmd[1] |= mRate << 2;
beanmachine44 0:622e8874902e 338
beanmachine44 0:622e8874902e 339 // Write the magodr out to the mag
beanmachine44 0:622e8874902e 340 i2c.write(mAddress, cmd, 2);
beanmachine44 0:622e8874902e 341 }
beanmachine44 0:622e8874902e 342
beanmachine44 0:622e8874902e 343 void LSM9DS1::calcgRes()
beanmachine44 0:622e8874902e 344 {
beanmachine44 0:622e8874902e 345 // Possible gyro scales (and their register bit settings) are:
beanmachine44 0:622e8874902e 346 // 245 DPS (00), 500 DPS (01), 2000 DPS (10).
beanmachine44 0:622e8874902e 347 switch (gScale)
beanmachine44 0:622e8874902e 348 {
beanmachine44 0:622e8874902e 349 case G_SCALE_245DPS:
beanmachine44 0:622e8874902e 350 gRes = 245.0 / 32768.0;
beanmachine44 0:622e8874902e 351 break;
beanmachine44 0:622e8874902e 352 case G_SCALE_500DPS:
beanmachine44 0:622e8874902e 353 gRes = 500.0 / 32768.0;
beanmachine44 0:622e8874902e 354 break;
beanmachine44 0:622e8874902e 355 case G_SCALE_2000DPS:
beanmachine44 0:622e8874902e 356 gRes = 2000.0 / 32768.0;
beanmachine44 0:622e8874902e 357 break;
beanmachine44 0:622e8874902e 358 }
beanmachine44 0:622e8874902e 359 }
beanmachine44 0:622e8874902e 360
beanmachine44 0:622e8874902e 361 void LSM9DS1::calcaRes()
beanmachine44 0:622e8874902e 362 {
beanmachine44 0:622e8874902e 363 // Possible accelerometer scales (and their register bit settings) are:
beanmachine44 0:622e8874902e 364 // 2 g (000), 4g (001), 6g (010) 8g (011), 16g (100).
beanmachine44 0:622e8874902e 365 switch (aScale)
beanmachine44 0:622e8874902e 366 {
beanmachine44 0:622e8874902e 367 case A_SCALE_2G:
beanmachine44 0:622e8874902e 368 aRes = 2.0 / 32768.0;
beanmachine44 0:622e8874902e 369 break;
beanmachine44 0:622e8874902e 370 case A_SCALE_4G:
beanmachine44 0:622e8874902e 371 aRes = 4.0 / 32768.0;
beanmachine44 0:622e8874902e 372 break;
beanmachine44 0:622e8874902e 373 case A_SCALE_8G:
beanmachine44 0:622e8874902e 374 aRes = 8.0 / 32768.0;
beanmachine44 0:622e8874902e 375 break;
beanmachine44 0:622e8874902e 376 case A_SCALE_16G:
beanmachine44 0:622e8874902e 377 aRes = 16.0 / 32768.0;
beanmachine44 0:622e8874902e 378 break;
beanmachine44 0:622e8874902e 379 }
beanmachine44 0:622e8874902e 380 }
beanmachine44 0:622e8874902e 381
beanmachine44 0:622e8874902e 382 void LSM9DS1::calcmRes()
beanmachine44 0:622e8874902e 383 {
beanmachine44 0:622e8874902e 384 // Possible magnetometer scales (and their register bit settings) are:
beanmachine44 0:622e8874902e 385 // 2 Gs (00), 4 Gs (01), 8 Gs (10) 12 Gs (11).
beanmachine44 0:622e8874902e 386 switch (mScale)
beanmachine44 0:622e8874902e 387 {
beanmachine44 0:622e8874902e 388 case M_SCALE_4GS:
beanmachine44 0:622e8874902e 389 mRes = 4.0 / 32768.0;
beanmachine44 0:622e8874902e 390 break;
beanmachine44 0:622e8874902e 391 case M_SCALE_8GS:
beanmachine44 0:622e8874902e 392 mRes = 8.0 / 32768.0;
beanmachine44 0:622e8874902e 393 break;
beanmachine44 0:622e8874902e 394 case M_SCALE_12GS:
beanmachine44 0:622e8874902e 395 mRes = 12.0 / 32768.0;
beanmachine44 0:622e8874902e 396 break;
beanmachine44 0:622e8874902e 397 case M_SCALE_16GS:
beanmachine44 0:622e8874902e 398 mRes = 16.0 / 32768.0;
beanmachine44 0:622e8874902e 399 break;
beanmachine44 0:622e8874902e 400 }
beanmachine44 0:622e8874902e 401 }