IMU driver (this thing is a mess).

Dependents:   PM2_Libary PM2_Libary

Committer:
pmic
Date:
Wed Feb 23 07:16:58 2022 +0000
Revision:
0:211f27847e85
Included driver for LSM9DS1 IMU.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pmic 0:211f27847e85 1 /******************************************************************************
pmic 0:211f27847e85 2 LSM9DS1_Types.h
pmic 0:211f27847e85 3 SFE_LSM9DS1 Library - LSM9DS1 Types and Enumerations
pmic 0:211f27847e85 4 Jim Lindblom @ SparkFun Electronics
pmic 0:211f27847e85 5 Original Creation Date: April 21, 2015
pmic 0:211f27847e85 6 https://github.com/sparkfun/LSM9DS1_Breakout
pmic 0:211f27847e85 7
pmic 0:211f27847e85 8 This file defines all types and enumerations used by the LSM9DS1 class.
pmic 0:211f27847e85 9
pmic 0:211f27847e85 10 Development environment specifics:
pmic 0:211f27847e85 11 IDE: Arduino 1.6.0
pmic 0:211f27847e85 12 Hardware Platform: Arduino Uno
pmic 0:211f27847e85 13 LSM9DS1 Breakout Version: 1.0
pmic 0:211f27847e85 14
pmic 0:211f27847e85 15 This code is beerware; if you see me (or any other SparkFun employee) at the
pmic 0:211f27847e85 16 local, and you've found our code helpful, please buy us a round!
pmic 0:211f27847e85 17
pmic 0:211f27847e85 18 Distributed as-is; no warranty is given.
pmic 0:211f27847e85 19 ******************************************************************************/
pmic 0:211f27847e85 20
pmic 0:211f27847e85 21 #ifndef __LSM9DS1_Types_H__
pmic 0:211f27847e85 22 #define __LSM9DS1_Types_H__
pmic 0:211f27847e85 23
pmic 0:211f27847e85 24 #include "LSM9DS1_Registers.h"
pmic 0:211f27847e85 25
pmic 0:211f27847e85 26 // The LSM9DS1 functions over both I2C or SPI. This library supports both.
pmic 0:211f27847e85 27 // But the interface mode used must be sent to the LSM9DS1 constructor. Use
pmic 0:211f27847e85 28 // one of these two as the first parameter of the constructor.
pmic 0:211f27847e85 29 enum interface_mode
pmic 0:211f27847e85 30 {
pmic 0:211f27847e85 31 IMU_MODE_SPI,
pmic 0:211f27847e85 32 IMU_MODE_I2C,
pmic 0:211f27847e85 33 };
pmic 0:211f27847e85 34
pmic 0:211f27847e85 35 // accel_scale defines all possible FSR's of the accelerometer:
pmic 0:211f27847e85 36 enum accel_scale
pmic 0:211f27847e85 37 {
pmic 0:211f27847e85 38 A_SCALE_2G, // 00: 2g
pmic 0:211f27847e85 39 A_SCALE_16G,// 01: 16g
pmic 0:211f27847e85 40 A_SCALE_4G, // 10: 4g
pmic 0:211f27847e85 41 A_SCALE_8G // 11: 8g
pmic 0:211f27847e85 42 };
pmic 0:211f27847e85 43
pmic 0:211f27847e85 44 // gyro_scale defines the possible full-scale ranges of the gyroscope:
pmic 0:211f27847e85 45 enum gyro_scale
pmic 0:211f27847e85 46 {
pmic 0:211f27847e85 47 G_SCALE_245DPS, // 00: 245 degrees per second
pmic 0:211f27847e85 48 G_SCALE_500DPS, // 01: 500 dps
pmic 0:211f27847e85 49 G_SCALE_2000DPS, // 11: 2000 dps
pmic 0:211f27847e85 50 };
pmic 0:211f27847e85 51
pmic 0:211f27847e85 52 // mag_scale defines all possible FSR's of the magnetometer:
pmic 0:211f27847e85 53 enum mag_scale
pmic 0:211f27847e85 54 {
pmic 0:211f27847e85 55 M_SCALE_4GS, // 00: 4Gs
pmic 0:211f27847e85 56 M_SCALE_8GS, // 01: 8Gs
pmic 0:211f27847e85 57 M_SCALE_12GS, // 10: 12Gs
pmic 0:211f27847e85 58 M_SCALE_16GS, // 11: 16Gs
pmic 0:211f27847e85 59 };
pmic 0:211f27847e85 60
pmic 0:211f27847e85 61 // gyro_odr defines all possible data rate/bandwidth combos of the gyro:
pmic 0:211f27847e85 62 enum gyro_odr
pmic 0:211f27847e85 63 {
pmic 0:211f27847e85 64 //! TODO
pmic 0:211f27847e85 65 G_ODR_PD, // Power down (0)
pmic 0:211f27847e85 66 G_ODR_149, // 14.9 Hz (1)
pmic 0:211f27847e85 67 G_ODR_595, // 59.5 Hz (2)
pmic 0:211f27847e85 68 G_ODR_119, // 119 Hz (3)
pmic 0:211f27847e85 69 G_ODR_238, // 238 Hz (4)
pmic 0:211f27847e85 70 G_ODR_476, // 476 Hz (5)
pmic 0:211f27847e85 71 G_ODR_952 // 952 Hz (6)
pmic 0:211f27847e85 72 };
pmic 0:211f27847e85 73 // accel_oder defines all possible output data rates of the accelerometer:
pmic 0:211f27847e85 74 enum accel_odr
pmic 0:211f27847e85 75 {
pmic 0:211f27847e85 76 XL_POWER_DOWN, // Power-down mode (0x0)
pmic 0:211f27847e85 77 XL_ODR_10, // 10 Hz (0x1)
pmic 0:211f27847e85 78 XL_ODR_50, // 50 Hz (0x02)
pmic 0:211f27847e85 79 XL_ODR_119, // 119 Hz (0x3)
pmic 0:211f27847e85 80 XL_ODR_238, // 238 Hz (0x4)
pmic 0:211f27847e85 81 XL_ODR_476, // 476 Hz (0x5)
pmic 0:211f27847e85 82 XL_ODR_952 // 952 Hz (0x6)
pmic 0:211f27847e85 83 };
pmic 0:211f27847e85 84
pmic 0:211f27847e85 85 // accel_abw defines all possible anti-aliasing filter rates of the accelerometer:
pmic 0:211f27847e85 86 enum accel_abw
pmic 0:211f27847e85 87 {
pmic 0:211f27847e85 88 A_ABW_408, // 408 Hz (0x0)
pmic 0:211f27847e85 89 A_ABW_211, // 211 Hz (0x1)
pmic 0:211f27847e85 90 A_ABW_105, // 105 Hz (0x2)
pmic 0:211f27847e85 91 A_ABW_50, // 50 Hz (0x3)
pmic 0:211f27847e85 92 };
pmic 0:211f27847e85 93
pmic 0:211f27847e85 94
pmic 0:211f27847e85 95 // mag_odr defines all possible output data rates of the magnetometer:
pmic 0:211f27847e85 96 enum mag_odr
pmic 0:211f27847e85 97 {
pmic 0:211f27847e85 98 M_ODR_0625, // 0.625 Hz (0)
pmic 0:211f27847e85 99 M_ODR_125, // 1.25 Hz (1)
pmic 0:211f27847e85 100 M_ODR_250, // 2.5 Hz (2)
pmic 0:211f27847e85 101 M_ODR_5, // 5 Hz (3)
pmic 0:211f27847e85 102 M_ODR_10, // 10 Hz (4)
pmic 0:211f27847e85 103 M_ODR_20, // 20 Hz (5)
pmic 0:211f27847e85 104 M_ODR_40, // 40 Hz (6)
pmic 0:211f27847e85 105 M_ODR_80 // 80 Hz (7)
pmic 0:211f27847e85 106 };
pmic 0:211f27847e85 107
pmic 0:211f27847e85 108 enum interrupt_select
pmic 0:211f27847e85 109 {
pmic 0:211f27847e85 110 XG_INT1 = INT1_CTRL,
pmic 0:211f27847e85 111 XG_INT2 = INT2_CTRL
pmic 0:211f27847e85 112 };
pmic 0:211f27847e85 113
pmic 0:211f27847e85 114 enum interrupt_generators
pmic 0:211f27847e85 115 {
pmic 0:211f27847e85 116 INT_DRDY_XL = (1<<0), // Accelerometer data ready (INT1 & INT2)
pmic 0:211f27847e85 117 INT_DRDY_G = (1<<1), // Gyroscope data ready (INT1 & INT2)
pmic 0:211f27847e85 118 INT1_BOOT = (1<<2), // Boot status (INT1)
pmic 0:211f27847e85 119 INT2_DRDY_TEMP = (1<<2),// Temp data ready (INT2)
pmic 0:211f27847e85 120 INT_FTH = (1<<3), // FIFO threshold interrupt (INT1 & INT2)
pmic 0:211f27847e85 121 INT_OVR = (1<<4), // Overrun interrupt (INT1 & INT2)
pmic 0:211f27847e85 122 INT_FSS5 = (1<<5), // FSS5 interrupt (INT1 & INT2)
pmic 0:211f27847e85 123 INT_IG_XL = (1<<6), // Accel interrupt generator (INT1)
pmic 0:211f27847e85 124 INT1_IG_G = (1<<7), // Gyro interrupt enable (INT1)
pmic 0:211f27847e85 125 INT2_INACT = (1<<7), // Inactivity interrupt output (INT2)
pmic 0:211f27847e85 126 };
pmic 0:211f27847e85 127
pmic 0:211f27847e85 128 enum accel_interrupt_generator
pmic 0:211f27847e85 129 {
pmic 0:211f27847e85 130 XLIE_XL = (1<<0),
pmic 0:211f27847e85 131 XHIE_XL = (1<<1),
pmic 0:211f27847e85 132 YLIE_XL = (1<<2),
pmic 0:211f27847e85 133 YHIE_XL = (1<<3),
pmic 0:211f27847e85 134 ZLIE_XL = (1<<4),
pmic 0:211f27847e85 135 ZHIE_XL = (1<<5),
pmic 0:211f27847e85 136 GEN_6D = (1<<6)
pmic 0:211f27847e85 137 };
pmic 0:211f27847e85 138
pmic 0:211f27847e85 139 enum gyro_interrupt_generator
pmic 0:211f27847e85 140 {
pmic 0:211f27847e85 141 XLIE_G = (1<<0),
pmic 0:211f27847e85 142 XHIE_G = (1<<1),
pmic 0:211f27847e85 143 YLIE_G = (1<<2),
pmic 0:211f27847e85 144 YHIE_G = (1<<3),
pmic 0:211f27847e85 145 ZLIE_G = (1<<4),
pmic 0:211f27847e85 146 ZHIE_G = (1<<5)
pmic 0:211f27847e85 147 };
pmic 0:211f27847e85 148
pmic 0:211f27847e85 149 enum mag_interrupt_generator
pmic 0:211f27847e85 150 {
pmic 0:211f27847e85 151 ZIEN = (1<<5),
pmic 0:211f27847e85 152 YIEN = (1<<6),
pmic 0:211f27847e85 153 XIEN = (1<<7)
pmic 0:211f27847e85 154 };
pmic 0:211f27847e85 155
pmic 0:211f27847e85 156 enum h_lactive
pmic 0:211f27847e85 157 {
pmic 0:211f27847e85 158 INT_ACTIVE_HIGH,
pmic 0:211f27847e85 159 INT_ACTIVE_LOW
pmic 0:211f27847e85 160 };
pmic 0:211f27847e85 161
pmic 0:211f27847e85 162 enum pp_od
pmic 0:211f27847e85 163 {
pmic 0:211f27847e85 164 INT_PUSH_PULL,
pmic 0:211f27847e85 165 INT_OPEN_DRAIN
pmic 0:211f27847e85 166 };
pmic 0:211f27847e85 167
pmic 0:211f27847e85 168 enum fifoMode_type
pmic 0:211f27847e85 169 {
pmic 0:211f27847e85 170 FIFO_OFF = 0,
pmic 0:211f27847e85 171 FIFO_THS = 1,
pmic 0:211f27847e85 172 FIFO_CONT_TRIGGER = 3,
pmic 0:211f27847e85 173 FIFO_OFF_TRIGGER = 4,
pmic 0:211f27847e85 174 FIFO_CONT = 5
pmic 0:211f27847e85 175 };
pmic 0:211f27847e85 176
pmic 0:211f27847e85 177 struct gyroSettings
pmic 0:211f27847e85 178 {
pmic 0:211f27847e85 179 // Gyroscope settings:
pmic 0:211f27847e85 180 uint8_t enabled;
pmic 0:211f27847e85 181 uint16_t scale; // Changed this to 16-bit
pmic 0:211f27847e85 182 uint8_t sampleRate;
pmic 0:211f27847e85 183 // New gyro stuff:
pmic 0:211f27847e85 184 uint8_t bandwidth;
pmic 0:211f27847e85 185 uint8_t lowPowerEnable;
pmic 0:211f27847e85 186 uint8_t HPFEnable;
pmic 0:211f27847e85 187 uint8_t HPFCutoff;
pmic 0:211f27847e85 188 uint8_t flipX;
pmic 0:211f27847e85 189 uint8_t flipY;
pmic 0:211f27847e85 190 uint8_t flipZ;
pmic 0:211f27847e85 191 uint8_t orientation;
pmic 0:211f27847e85 192 uint8_t enableX;
pmic 0:211f27847e85 193 uint8_t enableY;
pmic 0:211f27847e85 194 uint8_t enableZ;
pmic 0:211f27847e85 195 uint8_t latchInterrupt;
pmic 0:211f27847e85 196 };
pmic 0:211f27847e85 197
pmic 0:211f27847e85 198 struct deviceSettings
pmic 0:211f27847e85 199 {
pmic 0:211f27847e85 200 uint8_t commInterface; // Can be I2C, SPI 4-wire or SPI 3-wire
pmic 0:211f27847e85 201 uint8_t agAddress; // I2C address or SPI CS pin
pmic 0:211f27847e85 202 uint8_t mAddress; // I2C address or SPI CS pin
pmic 0:211f27847e85 203 };
pmic 0:211f27847e85 204
pmic 0:211f27847e85 205 struct accelSettings
pmic 0:211f27847e85 206 {
pmic 0:211f27847e85 207 // Accelerometer settings:
pmic 0:211f27847e85 208 uint8_t enabled;
pmic 0:211f27847e85 209 uint8_t scale;
pmic 0:211f27847e85 210 uint8_t sampleRate;
pmic 0:211f27847e85 211 // New accel stuff:
pmic 0:211f27847e85 212 uint8_t enableX;
pmic 0:211f27847e85 213 uint8_t enableY;
pmic 0:211f27847e85 214 uint8_t enableZ;
pmic 0:211f27847e85 215 int8_t bandwidth;
pmic 0:211f27847e85 216 uint8_t highResEnable;
pmic 0:211f27847e85 217 uint8_t highResBandwidth;
pmic 0:211f27847e85 218 };
pmic 0:211f27847e85 219
pmic 0:211f27847e85 220 struct magSettings
pmic 0:211f27847e85 221 {
pmic 0:211f27847e85 222 // Magnetometer settings:
pmic 0:211f27847e85 223 uint8_t enabled;
pmic 0:211f27847e85 224 uint8_t scale;
pmic 0:211f27847e85 225 uint8_t sampleRate;
pmic 0:211f27847e85 226 // New mag stuff:
pmic 0:211f27847e85 227 uint8_t tempCompensationEnable;
pmic 0:211f27847e85 228 uint8_t XYPerformance;
pmic 0:211f27847e85 229 uint8_t ZPerformance;
pmic 0:211f27847e85 230 uint8_t lowPowerEnable;
pmic 0:211f27847e85 231 uint8_t operatingMode;
pmic 0:211f27847e85 232 };
pmic 0:211f27847e85 233
pmic 0:211f27847e85 234 struct temperatureSettings
pmic 0:211f27847e85 235 {
pmic 0:211f27847e85 236 // Temperature settings
pmic 0:211f27847e85 237 uint8_t enabled;
pmic 0:211f27847e85 238 };
pmic 0:211f27847e85 239
pmic 0:211f27847e85 240 struct IMUSettings
pmic 0:211f27847e85 241 {
pmic 0:211f27847e85 242 deviceSettings device;
pmic 0:211f27847e85 243
pmic 0:211f27847e85 244 gyroSettings gyro;
pmic 0:211f27847e85 245 accelSettings accel;
pmic 0:211f27847e85 246 magSettings mag;
pmic 0:211f27847e85 247
pmic 0:211f27847e85 248 temperatureSettings temp;
pmic 0:211f27847e85 249 };
pmic 0:211f27847e85 250
pmic 0:211f27847e85 251 #endif