interface imu mpu9250
MPU9250.h@0:b502ea2d6ebb, 2016-01-20 (annotated)
- Committer:
- soulx
- Date:
- Wed Jan 20 14:50:12 2016 +0000
- Revision:
- 0:b502ea2d6ebb
crate lib imu interface
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
soulx | 0:b502ea2d6ebb | 1 | #ifndef MPU9250_H |
soulx | 0:b502ea2d6ebb | 2 | #define MPU9250_H |
soulx | 0:b502ea2d6ebb | 3 | |
soulx | 0:b502ea2d6ebb | 4 | #include "mbed.h" |
soulx | 0:b502ea2d6ebb | 5 | #include "math.h" |
soulx | 0:b502ea2d6ebb | 6 | #include "register.h" |
soulx | 0:b502ea2d6ebb | 7 | |
soulx | 0:b502ea2d6ebb | 8 | |
soulx | 0:b502ea2d6ebb | 9 | static DigitalOut myled(LED1); |
soulx | 0:b502ea2d6ebb | 10 | |
soulx | 0:b502ea2d6ebb | 11 | |
soulx | 0:b502ea2d6ebb | 12 | class MPU9250 |
soulx | 0:b502ea2d6ebb | 13 | { |
soulx | 0:b502ea2d6ebb | 14 | |
soulx | 0:b502ea2d6ebb | 15 | protected: |
soulx | 0:b502ea2d6ebb | 16 | |
soulx | 0:b502ea2d6ebb | 17 | public: |
soulx | 0:b502ea2d6ebb | 18 | enum Ascale { |
soulx | 0:b502ea2d6ebb | 19 | AFS_2G = 0, |
soulx | 0:b502ea2d6ebb | 20 | AFS_4G, |
soulx | 0:b502ea2d6ebb | 21 | AFS_8G, |
soulx | 0:b502ea2d6ebb | 22 | AFS_16G |
soulx | 0:b502ea2d6ebb | 23 | }; |
soulx | 0:b502ea2d6ebb | 24 | |
soulx | 0:b502ea2d6ebb | 25 | enum Gscale { |
soulx | 0:b502ea2d6ebb | 26 | GFS_250DPS = 0, |
soulx | 0:b502ea2d6ebb | 27 | GFS_500DPS, |
soulx | 0:b502ea2d6ebb | 28 | GFS_1000DPS, |
soulx | 0:b502ea2d6ebb | 29 | GFS_2000DPS |
soulx | 0:b502ea2d6ebb | 30 | }; |
soulx | 0:b502ea2d6ebb | 31 | |
soulx | 0:b502ea2d6ebb | 32 | enum Mscale { |
soulx | 0:b502ea2d6ebb | 33 | MFS_14BITS = 0, // 0.6 mG per LSB |
soulx | 0:b502ea2d6ebb | 34 | MFS_16BITS // 0.15 mG per LSB |
soulx | 0:b502ea2d6ebb | 35 | }; |
soulx | 0:b502ea2d6ebb | 36 | |
soulx | 0:b502ea2d6ebb | 37 | MPU9250(PinName sda, PinName scl, PinName tx, PinName rx, int address); |
soulx | 0:b502ea2d6ebb | 38 | |
soulx | 0:b502ea2d6ebb | 39 | ~MPU9250() {} |
soulx | 0:b502ea2d6ebb | 40 | |
soulx | 0:b502ea2d6ebb | 41 | Serial pc; |
soulx | 0:b502ea2d6ebb | 42 | I2C i2c; |
soulx | 0:b502ea2d6ebb | 43 | void writeByte(uint8_t address, uint8_t subAddress, uint8_t data); |
soulx | 0:b502ea2d6ebb | 44 | char readByte(uint8_t address, uint8_t subAddress); |
soulx | 0:b502ea2d6ebb | 45 | void readBytes(uint8_t address, uint8_t subAddress, uint8_t count, uint8_t * dest) ; |
soulx | 0:b502ea2d6ebb | 46 | |
soulx | 0:b502ea2d6ebb | 47 | void initMPU9250(); |
soulx | 0:b502ea2d6ebb | 48 | void calibrateMPU9250(); |
soulx | 0:b502ea2d6ebb | 49 | |
soulx | 0:b502ea2d6ebb | 50 | void setMres(); |
soulx | 0:b502ea2d6ebb | 51 | void setGres(); |
soulx | 0:b502ea2d6ebb | 52 | void setAres(); |
soulx | 0:b502ea2d6ebb | 53 | |
soulx | 0:b502ea2d6ebb | 54 | void getMres(); |
soulx | 0:b502ea2d6ebb | 55 | void getGres(); |
soulx | 0:b502ea2d6ebb | 56 | void getAres(); |
soulx | 0:b502ea2d6ebb | 57 | |
soulx | 0:b502ea2d6ebb | 58 | void AccelXYZCal(); |
soulx | 0:b502ea2d6ebb | 59 | void GyroXYZCal(); |
soulx | 0:b502ea2d6ebb | 60 | void MagXYZCal(); |
soulx | 0:b502ea2d6ebb | 61 | |
soulx | 0:b502ea2d6ebb | 62 | void MagCal(); |
soulx | 0:b502ea2d6ebb | 63 | |
soulx | 0:b502ea2d6ebb | 64 | void readAccelData(); |
soulx | 0:b502ea2d6ebb | 65 | void readGyroData(); |
soulx | 0:b502ea2d6ebb | 66 | void readMagData(); |
soulx | 0:b502ea2d6ebb | 67 | void readTempData(); |
soulx | 0:b502ea2d6ebb | 68 | |
soulx | 0:b502ea2d6ebb | 69 | void resetMPU9250(); |
soulx | 0:b502ea2d6ebb | 70 | void initAK8963(); |
soulx | 0:b502ea2d6ebb | 71 | void MPU9250SelfTest(); |
soulx | 0:b502ea2d6ebb | 72 | |
soulx | 0:b502ea2d6ebb | 73 | void Start(); |
soulx | 0:b502ea2d6ebb | 74 | void ReadRawAccGyroMag(); |
soulx | 0:b502ea2d6ebb | 75 | |
soulx | 0:b502ea2d6ebb | 76 | float ax, ay, az, gx, gy, gz, mx, my, mz; // variables to hold latest sensor data values |
soulx | 0:b502ea2d6ebb | 77 | |
soulx | 0:b502ea2d6ebb | 78 | |
soulx | 0:b502ea2d6ebb | 79 | protected: |
soulx | 0:b502ea2d6ebb | 80 | float temperature; |
soulx | 0:b502ea2d6ebb | 81 | uint8_t whoami; |
soulx | 0:b502ea2d6ebb | 82 | |
soulx | 0:b502ea2d6ebb | 83 | private: |
soulx | 0:b502ea2d6ebb | 84 | uint8_t MPU9250_ADDRESS; |
soulx | 0:b502ea2d6ebb | 85 | |
soulx | 0:b502ea2d6ebb | 86 | int16_t accelCount[3]; // Stores the 16-bit signed accelerometer sensor output |
soulx | 0:b502ea2d6ebb | 87 | int16_t gyroCount[3]; // Stores the 16-bit signed gyro sensor output |
soulx | 0:b502ea2d6ebb | 88 | int16_t magCount[3]; // Stores the 16-bit signed magnetometer sensor output |
soulx | 0:b502ea2d6ebb | 89 | float magCalibration[3], magbias[3]; // Factory mag calibration and mag bias |
soulx | 0:b502ea2d6ebb | 90 | float gyroBias[3], accelBias[3]; // Bias corrections for gyro and accelerometer |
soulx | 0:b502ea2d6ebb | 91 | //int16_t tempCount; // Stores the real internal chip temperature in degrees Celsius |
soulx | 0:b502ea2d6ebb | 92 | float SelfTest[6]; |
soulx | 0:b502ea2d6ebb | 93 | |
soulx | 0:b502ea2d6ebb | 94 | |
soulx | 0:b502ea2d6ebb | 95 | |
soulx | 0:b502ea2d6ebb | 96 | //MagCal |
soulx | 0:b502ea2d6ebb | 97 | float xmax,xmin; |
soulx | 0:b502ea2d6ebb | 98 | float ymax,ymin; |
soulx | 0:b502ea2d6ebb | 99 | float zmax,zmin; |
soulx | 0:b502ea2d6ebb | 100 | bool change; |
soulx | 0:b502ea2d6ebb | 101 | |
soulx | 0:b502ea2d6ebb | 102 | uint8_t Ascale; // AFS_2G, AFS_4G, AFS_8G, AFS_16G |
soulx | 0:b502ea2d6ebb | 103 | uint8_t Gscale; // GFS_250DPS, GFS_500DPS, GFS_1000DPS, GFS_2000DPS |
soulx | 0:b502ea2d6ebb | 104 | uint8_t Mscale; // MFS_14BITS or MFS_16BITS, 14-bit or 16-bit magnetometer resolution |
soulx | 0:b502ea2d6ebb | 105 | uint8_t Mmode; // Either 8 Hz 0x02) or 100 Hz (0x06) magnetometer data ODR |
soulx | 0:b502ea2d6ebb | 106 | float aRes, gRes, mRes; // scale resolutions per LSB for the sensors |
soulx | 0:b502ea2d6ebb | 107 | |
soulx | 0:b502ea2d6ebb | 108 | }; |
soulx | 0:b502ea2d6ebb | 109 | #endif |