Kazuki Fujita / LSM9DS1
Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers LSM9DS1.h Source File

LSM9DS1.h

00001 // Linear Acceleration: mg per LSB
00002 #define LSM9DS1_ACCEL_MG_LSB_2G (0.061F)
00003 #define LSM9DS1_ACCEL_MG_LSB_4G (0.122F)
00004 #define LSM9DS1_ACCEL_MG_LSB_8G (0.244F)
00005 #define LSM9DS1_ACCEL_MG_LSB_16G (0.732F) 
00006 
00007 // Magnetic Field Strength: gauss range
00008 #define LSM9DS1_MAG_MGAUSS_4GAUSS      (0.14F)
00009 #define LSM9DS1_MAG_MGAUSS_8GAUSS      (0.29F)
00010 #define LSM9DS1_MAG_MGAUSS_12GAUSS     (0.43F)
00011 #define LSM9DS1_MAG_MGAUSS_16GAUSS     (0.58F)
00012 
00013 // Angular Rate: dps per LSB
00014 #define LSM9DS1_GYRO_DPS_DIGIT_245DPS      (0.00875F)
00015 #define LSM9DS1_GYRO_DPS_DIGIT_500DPS      (0.01750F)
00016 #define LSM9DS1_GYRO_DPS_DIGIT_2000DPS     (0.07000F)
00017 
00018 #include "mbed.h"
00019 
00020 class LSM9DS1
00021 {
00022     SPI spi8;
00023     DigitalOut cs_AG;
00024     DigitalOut cs_M;
00025 
00026     public:
00027 
00028         LSM9DS1(PinName _mosi, PinName _miso, PinName _sclk, PinName _cs_AG, PinName _cs_M);
00029         float gyro_x;
00030         float gyro_y;
00031         float gyro_z;
00032         float accel_x;
00033         float accel_y;
00034         float accel_z;
00035         float mag_x;
00036         float mag_y;
00037         float mag_z;
00038 
00039         typedef enum
00040         {
00041             LSM9DS1_cs_AG  = 0,
00042             LSM9DS1_cs_M   = 1,
00043 
00044         } lsm9ds1ChipSelect_t;
00045 
00046         typedef enum
00047         {
00048             LSM9DS1_REGISTER_WHO_AM_I_XG         = 0x0F,
00049             LSM9DS1_REGISTER_CTRL_REG1_G         = 0x10,
00050             LSM9DS1_REGISTER_CTRL_REG2_G         = 0x11,
00051             LSM9DS1_REGISTER_CTRL_REG3_G         = 0x12,
00052             LSM9DS1_REGISTER_TEMP_OUT_L          = 0x15,
00053             LSM9DS1_REGISTER_TEMP_OUT_H          = 0x16,
00054             LSM9DS1_REGISTER_STATUS_REG          = 0x17,
00055             LSM9DS1_REGISTER_OUT_X_L_G           = 0x18,
00056             LSM9DS1_REGISTER_OUT_X_H_G           = 0x19,
00057             LSM9DS1_REGISTER_OUT_Y_L_G           = 0x1A,
00058             LSM9DS1_REGISTER_OUT_Y_H_G           = 0x1B,
00059             LSM9DS1_REGISTER_OUT_Z_L_G           = 0x1C,
00060             LSM9DS1_REGISTER_OUT_Z_H_G           = 0x1D,
00061             LSM9DS1_REGISTER_CTRL_REG4           = 0x1E,
00062             LSM9DS1_REGISTER_CTRL_REG5_XL        = 0x1F,
00063             LSM9DS1_REGISTER_CTRL_REG6_XL        = 0x20,
00064             LSM9DS1_REGISTER_CTRL_REG7_XL        = 0x21,
00065             LSM9DS1_REGISTER_CTRL_REG8           = 0x22,
00066             LSM9DS1_REGISTER_CTRL_REG9           = 0x23,
00067             LSM9DS1_REGISTER_CTRL_REG10          = 0x24,
00068 
00069             LSM9DS1_REGISTER_OUT_X_L_XL          = 0x28,
00070             LSM9DS1_REGISTER_OUT_X_H_XL          = 0x29,
00071             LSM9DS1_REGISTER_OUT_Y_L_XL          = 0x2A,
00072             LSM9DS1_REGISTER_OUT_Y_H_XL          = 0x2B,
00073             LSM9DS1_REGISTER_OUT_Z_L_XL          = 0x2C,
00074             LSM9DS1_REGISTER_OUT_Z_H_XL          = 0x2D,
00075 
00076         } lsm9ds1AccGyroRegisters_t;
00077         
00078         typedef enum
00079         {
00080             LSM9DS1_REGISTER_WHO_AM_I_M         = 0x0F,
00081             LSM9DS1_REGISTER_CTRL_REG1_M        = 0x20,
00082             LSM9DS1_REGISTER_CTRL_REG2_M        = 0x21,
00083             LSM9DS1_REGISTER_CTRL_REG3_M        = 0x22,
00084             LSM9DS1_REGISTER_CTRL_REG4_M        = 0x23,
00085             LSM9DS1_REGISTER_CTRL_REG5_M        = 0x24,
00086             LSM9DS1_REGISTER_STATUS_REG_M       = 0x27,
00087             LSM9DS1_REGISTER_OUT_X_L_M          = 0x28,
00088             LSM9DS1_REGISTER_OUT_X_H_M          = 0x29,
00089             LSM9DS1_REGISTER_OUT_Y_L_M          = 0x2A,
00090             LSM9DS1_REGISTER_OUT_Y_H_M          = 0x2B,
00091             LSM9DS1_REGISTER_OUT_Z_L_M          = 0x2C,
00092             LSM9DS1_REGISTER_OUT_Z_H_M          = 0x2D,
00093             LSM9DS1_REGISTER_CFG_M              = 0x30,
00094             LSM9DS1_REGISTER_INT_SRC_M          = 0x31,
00095         } lsm9ds1MagRegisters_t;
00096 
00097         typedef enum
00098         {
00099             LSM9DS1_ACCELRANGE_2G                = (0b00 << 3),
00100             LSM9DS1_ACCELRANGE_16G               = (0b01 << 3),
00101             LSM9DS1_ACCELRANGE_4G                = (0b10 << 3),
00102             LSM9DS1_ACCELRANGE_8G                = (0b11 << 3),
00103         } lsm9ds1AccelRange_t;
00104         
00105         typedef enum
00106         {
00107             LSM9DS1_ACCELDATARATE_POWERDOWN      = (0b0000 << 4),
00108             LSM9DS1_ACCELDATARATE_3_125HZ        = (0b0001 << 4),
00109             LSM9DS1_ACCELDATARATE_6_25HZ         = (0b0010 << 4),
00110             LSM9DS1_ACCELDATARATE_12_5HZ         = (0b0011 << 4),
00111             LSM9DS1_ACCELDATARATE_25HZ           = (0b0100 << 4),
00112             LSM9DS1_ACCELDATARATE_50HZ           = (0b0101 << 4),
00113             LSM9DS1_ACCELDATARATE_100HZ          = (0b0110 << 4),
00114             LSM9DS1_ACCELDATARATE_200HZ          = (0b0111 << 4),
00115             LSM9DS1_ACCELDATARATE_400HZ          = (0b1000 << 4),
00116             LSM9DS1_ACCELDATARATE_800HZ          = (0b1001 << 4),
00117             LSM9DS1_ACCELDATARATE_1600HZ         = (0b1010 << 4)
00118         } lm9ds1AccelDataRate_t;
00119         
00120         typedef enum
00121         {
00122             LSM9DS1_MAGGAIN_4GAUSS               = (0b00 << 5),  // +/- 4 gauss
00123             LSM9DS1_MAGGAIN_8GAUSS               = (0b01 << 5),  // +/- 8 gauss
00124             LSM9DS1_MAGGAIN_12GAUSS              = (0b10 << 5),  // +/- 12 gauss
00125             LSM9DS1_MAGGAIN_16GAUSS              = (0b11 << 5)   // +/- 16 gauss
00126         } lsm9ds1MagGain_t;
00127         
00128         typedef enum
00129         {
00130             LSM9DS1_MAGDATARATE_3_125HZ          = (0b000 << 2),
00131             LSM9DS1_MAGDATARATE_6_25HZ           = (0b001 << 2),
00132             LSM9DS1_MAGDATARATE_12_5HZ           = (0b010 << 2),
00133             LSM9DS1_MAGDATARATE_25HZ             = (0b011 << 2),
00134             LSM9DS1_MAGDATARATE_50HZ             = (0b100 << 2),
00135             LSM9DS1_MAGDATARATE_100HZ            = (0b101 << 2)
00136         } lsm9ds1MagDataRate_t;
00137 
00138         typedef enum
00139         {
00140             LSM9DS1_GYROSCALE_245DPS             = (0b00 << 3),  // +/- 245 degrees per second rotation
00141             LSM9DS1_GYROSCALE_500DPS             = (0b01 << 3),  // +/- 500 degrees per second rotation
00142             LSM9DS1_GYROSCALE_2000DPS            = (0b11 << 3)   // +/- 2000 degrees per second rotation
00143         } lsm9ds1GyroScale_t;
00144         
00145         typedef struct vector_s
00146         {
00147             float x;
00148             float y;
00149             float z;
00150         } lsm9ds1Vector_t;   
00151 
00152         void initSPI(void);
00153         void initAccel(lsm9ds1AccelRange_t scale);
00154         void initGyro(lsm9ds1GyroScale_t scale);
00155         void initMag(lsm9ds1MagGain_t scale);
00156         void readAccel();
00157         void readGyro();
00158         void readMag();
00159         uint8_t whoami();
00160         uint8_t read8(lsm9ds1ChipSelect_t cs,uint8_t address);
00161         void write8(lsm9ds1ChipSelect_t cs,uint8_t address,uint8_t data);
00162 
00163     private:
00164         float   _accel_mg_lsb;
00165         float   _mag_mgauss_lsb;
00166         float   _gyro_dps_digit;
00167 };