interface imu mpu9250

Dependents:   AHRS_fillter

Committer:
soulx
Date:
Wed Jan 20 14:50:12 2016 +0000
Revision:
0:b502ea2d6ebb
crate lib imu interface

Who changed what in which revision?

UserRevisionLine numberNew 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