Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: InvertedPendulum2017
Lib_MPU9250.h
00001 #ifndef __LIBRARY_MPU9250_SPI_H__ 00002 #define __LIBRARY_MPU9250_SPI_H__ 00003 00004 #include "mbed.h" 00005 00006 #define MPU9250_FREQ_DEFAULT (4000000) // default clock speed 00007 #define MPU9250_ADDR (0x68) 00008 #define AK8963_ADDR (0x0C) // magnetometer address 00009 00010 #define I2C_WRITE_FLAG (0x00) 00011 #define I2C_READ_FLAG (0x01) 00012 00013 #define MPU9250A_2G ((float)0.000061035156f) // 0.000061035156 g/LSB 00014 #define MPU9250A_4G ((float)0.000122070312f) // 0.000122070312 g/LSB 00015 #define MPU9250A_8G ((float)0.000244140625f) // 0.000244140625 g/LSB 00016 #define MPU9250A_16G ((float)0.000488281250f) // 0.000488281250 g/LSB 00017 00018 #define MPU9250G_250DPS ((float)0.007633587786f) // 0.007633587786 dps/LSB 00019 #define MPU9250G_500DPS ((float)0.015267175572f) // 0.015267175572 dps/LSB 00020 #define MPU9250G_1000DPS ((float)0.030487804878f) // 0.030487804878 dps/LSB 00021 #define MPU9250G_2000DPS ((float)0.060975609756f) // 0.060975609756 dps/LSB 00022 00023 /* 00024 #define MPU9250G_250DPS_RAD ((float)0.00013323124f) // 0.00013323124 rad/LSB 00025 #define MPU9250G_500DPS_RAD ((float)0.00026646248f) // 0.00026646248 rad/LSB 00026 #define MPU9250G_1000DPS_RAD ((float)0.00053211257f) // 0.00053211257 rad/LSB 00027 #define MPU9250G_2000DPS_RAD ((float)0.00106422515f) // 0.00106422515 rad/LSB 00028 */ 00029 00030 #define MPU9250M_4800uT ((float)0.6f) // 0.6 uT/LSB 00031 #define MPU9250T_85degC ((float)0.002995177763f) // 0.002995177763 degC/LSB 00032 00033 #define MPU9250G_DEG2RAD ((float)0.01745329251f) // degree to radian 00034 00035 // enum 00036 typedef enum _MPU9250REG{ 00037 // gyro and accel 00038 SELF_TEST_X_GYRO = 0x00, 00039 SELF_TEST_Y_GYRO = 0x01, 00040 SELF_TEST_Z_GYRO = 0x02, 00041 00042 SELF_TEST_X_ACCEL = 0x0D, 00043 SELF_TEST_Y_ACCEL = 0x0E, 00044 SELF_TEST_Z_ACCEL = 0x0F, 00045 00046 XG_OFFSET_H = 0x13, 00047 XG_OFFSET_L = 0x14, 00048 YG_OFFSET_H = 0x15, 00049 YG_OFFSET_L = 0x16, 00050 ZG_OFFSET_H = 0x17, 00051 ZG_OFFSET_L = 0x18, 00052 00053 SMPLRT_DIV = 0x19, 00054 CONFIG = 0x1A, 00055 GYRO_CONFIG = 0x1B, 00056 ACCEL_CONFIG = 0x1C, 00057 ACCEL_CONFIG2 = 0x1D, 00058 LP_ACCEL_ODR = 0x1E, 00059 WOM_THR = 0x1F, 00060 00061 FIFO_EN = 0x23, 00062 00063 I2C_MST_CTRL = 0x24, 00064 I2C_SLV0_ADDR = 0x25, 00065 I2C_SLV0_REG = 0x26, 00066 I2C_SLV0_CTRL = 0x27, 00067 I2C_SLV1_ADDR = 0x28, 00068 I2C_SLV1_REG = 0x29, 00069 I2C_SLV1_CTRL = 0x2A, 00070 I2C_SLV2_ADDR = 0x2B, 00071 I2C_SLV2_REG = 0x2C, 00072 I2C_SLV2_CTRL = 0x2D, 00073 I2C_SLV3_ADDR = 0x2E, 00074 I2C_SLV3_REG = 0x2F, 00075 I2C_SLV3_CTRL = 0x30, 00076 I2C_SLV4_ADDR = 0x31, 00077 I2C_SLV4_REG = 0x32, 00078 I2C_SLV4_DO = 0x33, 00079 I2C_SLV4_CTRL = 0x34, 00080 I2C_SLV4_DI = 0x35, 00081 I2C_MST_STATUS = 0x36, 00082 00083 INT_PIN_CFG = 0x37, 00084 INT_ENABLE = 0x38, 00085 INT_STATUS = 0x3A, 00086 00087 ACCEL_XOUT_H = 0x3B, 00088 ACCEL_XOUT_L = 0x3C, 00089 ACCEL_YOUT_H = 0x3D, 00090 ACCEL_YOUT_L = 0x3E, 00091 ACCEL_ZOUT_H = 0x3F, 00092 ACCEL_ZOUT_L = 0x40, 00093 00094 TEMP_OUT_H = 0x41, 00095 TEMP_OUT_L = 0x42, 00096 00097 GYRO_XOUT_H = 0x43, 00098 GYRO_XOUT_L = 0x44, 00099 GYRO_YOUT_H = 0x45, 00100 GYRO_YOUT_L = 0x46, 00101 GYRO_ZOUT_H = 0x47, 00102 GYRO_ZOUT_L = 0x48, 00103 00104 EXT_SENS_DATA_00 = 0x49, 00105 EXT_SENS_DATA_01 = 0x4A, 00106 EXT_SENS_DATA_02 = 0x4B, 00107 EXT_SENS_DATA_03 = 0x4C, 00108 EXT_SENS_DATA_04 = 0x4D, 00109 EXT_SENS_DATA_05 = 0x4E, 00110 EXT_SENS_DATA_06 = 0x4F, 00111 EXT_SENS_DATA_07 = 0x50, 00112 EXT_SENS_DATA_08 = 0x51, 00113 EXT_SENS_DATA_09 = 0x52, 00114 EXT_SENS_DATA_10 = 0x53, 00115 EXT_SENS_DATA_11 = 0x54, 00116 EXT_SENS_DATA_12 = 0x55, 00117 EXT_SENS_DATA_13 = 0x56, 00118 EXT_SENS_DATA_14 = 0x57, 00119 EXT_SENS_DATA_15 = 0x58, 00120 EXT_SENS_DATA_16 = 0x59, 00121 EXT_SENS_DATA_17 = 0x5A, 00122 EXT_SENS_DATA_18 = 0x5B, 00123 EXT_SENS_DATA_19 = 0x5C, 00124 EXT_SENS_DATA_20 = 0x5D, 00125 EXT_SENS_DATA_21 = 0x5E, 00126 EXT_SENS_DATA_22 = 0x5F, 00127 EXT_SENS_DATA_23 = 0x60, 00128 00129 I2C_SLV0_DO = 0x63, 00130 I2C_SLV1_DO = 0x64, 00131 I2C_SLV2_DO = 0x65, 00132 I2C_SLV3_DO = 0x66, 00133 00134 I2C_MST_DELAY_CTRL = 0x67, 00135 SIGNAL_PATH_RESET = 0x68, 00136 MOT_DETECT_CTRL = 0x69, 00137 USER_CTRL = 0x6A, 00138 PWR_MGMT_1 = 0x6B, 00139 PWR_MGMT_2 = 0x6C, 00140 00141 FIFO_COUNTH = 0x72, 00142 FIFO_COUNTL = 0x73, 00143 FIFO_R_W = 0x74, 00144 WHO_AM_I = 0x75, 00145 00146 XA_OFFSET_H = 0x77, 00147 XA_OFFSET_L = 0x78, 00148 YA_OFFSET_H = 0x7A, 00149 YA_OFFSET_L = 0x7B, 00150 ZA_OFFSET_H = 0x7D, 00151 ZA_OFFSET_L = 0x7E, 00152 } MPU9250REG; 00153 00154 typedef enum _AK8963REG{ 00155 // magnetometer 00156 WIA = 0x00, 00157 INFO = 0x01, 00158 ST1 = 0x02, 00159 00160 HXL = 0x03, 00161 HXH = 0x04, 00162 HYL = 0x05, 00163 HYH = 0x06, 00164 HZL = 0x07, 00165 HZH = 0x08, 00166 00167 ST2 = 0x09, 00168 CNTL1 = 0x0A, 00169 CNTL2 = 0x0B, 00170 ASTC = 0x0C, 00171 TS1 = 0x0D, 00172 TS2 = 0x0E, 00173 I2CDIS = 0x0F, 00174 00175 ASAX = 0x10, 00176 ASAY = 0x11, 00177 ASAZ = 0x12, 00178 } AK8963REG; 00179 00180 typedef enum _MPU9250BIT{ 00181 BIT_SLEEP = 0x40, 00182 BIT_H_RESET = 0x80, 00183 BITS_CLKSEL = 0x07, 00184 MPU_CLK_SEL_PLLGYROX = 0x01, 00185 MPU_CLK_SEL_PLLGYROZ = 0x03, 00186 MPU_EXT_SYNC_GYROX = 0x02, 00187 BITS_FS_250DPS = 0x00, 00188 BITS_FS_500DPS = 0x08, 00189 BITS_FS_1000DPS = 0x10, 00190 BITS_FS_2000DPS = 0x18, 00191 BITS_FS_2G = 0x00, 00192 BITS_FS_4G = 0x08, 00193 BITS_FS_8G = 0x10, 00194 BITS_FS_16G = 0x18, 00195 BITS_FS_MASK = 0x18, 00196 BITS_DLPF_CFG_256HZ_NOLPF2 = 0x00, 00197 BITS_DLPF_CFG_188HZ = 0x01, 00198 BITS_DLPF_CFG_98HZ = 0x02, 00199 BITS_DLPF_CFG_42HZ = 0x03, 00200 BITS_DLPF_CFG_20HZ = 0x04, 00201 BITS_DLPF_CFG_10HZ = 0x05, 00202 BITS_DLPF_CFG_5HZ = 0x06, 00203 BITS_DLPF_CFG_2100HZ_NOLPF = 0x07, 00204 BITS_DLPF_CFG_MASK = 0x07, 00205 BIT_INT_ANYRD_2CLEAR = 0x10, 00206 BIT_RAW_RDY_EN = 0x01, 00207 BIT_I2C_IF_DIS = 0x10 00208 } MPU9250BIT; 00209 00210 typedef enum _MPU9250IF{ 00211 MPU9250_SPI = 0x00, 00212 MPU9250_I2C = 0x10 00213 } MPU9250IF; 00214 00215 class MPU9250{ 00216 public: 00217 MPU9250( PinName cs, PinName mosi, PinName miso, PinName sck ); // constructor( SPI ) 00218 MPU9250( PinName sda, PinName scl, uint8_t addr = MPU9250_ADDR ); // constructor( I2C ) 00219 ~MPU9250(); // destructor 00220 00221 void begin( void ); 00222 void reset( void ); 00223 00224 uint8_t getWhoAmI( void ); 00225 00226 void setAccelRange( MPU9250BIT range ); 00227 void setGyroRange( MPU9250BIT range ); 00228 void setDLPF( MPU9250BIT range ); 00229 00230 void read6AxisRaw( 00231 int16_t* ax, int16_t* ay, int16_t* az, 00232 int16_t* gx, int16_t* gy, int16_t* gz ); 00233 void read9AxisRaw( 00234 int16_t* ax, int16_t* ay, int16_t* az, 00235 int16_t* gx, int16_t* gy, int16_t* gz, 00236 int16_t* mx, int16_t* my, int16_t* mz ); 00237 void readAccelRaw( int16_t* ax, int16_t* ay, int16_t* az ); 00238 void readGyroRaw( int16_t* gx, int16_t* gy, int16_t* gz ); 00239 void readMagRaw( int16_t* mx, int16_t* my, int16_t* mz ); 00240 int16_t readTempRaw( void ); 00241 00242 void read6Axis( 00243 float* ax, float* ay, float* az, 00244 float* gx, float* gy, float* gz ); 00245 void read9Axis( 00246 float* ax, float* ay, float* az, 00247 float* gx, float* gy, float* gz, 00248 float* mx, float* my, float* mz ); 00249 void readAccel( float* ax, float* ay, float* az ); 00250 void readGyro( float* gx, float* gy, float* gz ); 00251 void readMag( float* mx, float* my, float* mz ); 00252 float readTemp( void ); 00253 00254 private: 00255 DigitalOut* _cs; 00256 SPI* _spi; 00257 I2C* _i2c; 00258 uint8_t _i2c_addr; 00259 MPU9250IF _imu_if; 00260 00261 float _accscale; 00262 float _gyroscale; 00263 // float _gyroscalerad; 00264 00265 uint8_t _readRegister( MPU9250REG addr ); 00266 uint8_t _writeRegister( MPU9250REG addr, uint8_t data ); 00267 uint8_t _readBuffer( MPU9250REG addr, uint8_t len, uint8_t* buf ); 00268 uint8_t _writeBuffer( MPU9250REG addr, uint8_t len, uint8_t* buf ); 00269 }; 00270 00271 #endif
Generated on Fri Jul 15 2022 19:02:49 by
1.7.2