21:34
Dependencies: HCSR04_2 MPU6050_2 mbed SDFileSystem3
Fork of Autoflight2018_8 by
MPU9250/MPU9250.h
- Committer:
- HARUKIDELTA
- Date:
- 2018-09-13
- Revision:
- 5:9efd35c9bb2e
- Parent:
- 0:17f575135219
File content as of revision 5:9efd35c9bb2e:
#ifndef MPU9250_H #define MPU9250_H #include "mbed.h" #include "math.h" #include "MPU9250_register.h" #define AK8963_ADDRESS 0x0C<<1 // Using the MSENSR-9250 breakout board, ADO is set to 0 // Seven-bit device address is 110100 for ADO = 0 and 110101 for ADO = 1 //mbed uses the eight-bit device address, so shift seven-bit addresses left by one! #define ADO 0 #if ADO #define MPU9250_ADDRESS 0x69<<1 // Device address when ADO = 1 #else #define MPU9250_ADDRESS 0x68<<1 // Device address when ADO = 0 #endif #define Kp 2.0f * 5.0f // these are the free parameters in the Mahony filter and fusion scheme, Kp for proportional feedback, Ki for integral #define Ki 0.0f #define IAM_MPU9250 0x71 #define IAM_AK8963 0x48 #define DECLINATION -7.45f //Declination at Tokyo is -7.45 degree 2017/06/14 const float PI = 3.14159265358979323846f; const float LPGAIN_MAG = 0.0; enum Ascale { AFS_2G = 0, AFS_4G, AFS_8G, AFS_16G }; enum Gscale { GFS_250DPS = 0, GFS_500DPS, GFS_1000DPS, GFS_2000DPS }; enum Mscale { MFS_14BITS = 0, // 0.6 mG per LSB MFS_16BITS // 0.15 mG per LSB }; class MPU9250 { public: //MPU9250(); MPU9250(PinName sda, PinName scl, RawSerial* serial_p); ~MPU9250(); bool Initialize(void); bool sensingAcGyMg(void); void calculatePostureAngle(float degree[3]); float calculateYawByMg(void); void MPU9250SelfTest(float * destination); void pickupAccel(float accel[3]); void pickupGyro(float gyro[3]); void pickupMag(float mag[3]); float pickupTemp(void); void displayAccel(void); void displayGyro(void); void displayMag(void); void displayAngle(void); void displayQuaternion(void); void displayTemperature(void); void setMagBias(float bias_x, float bias_y, float bias_z); private: //add I2C *i2c_p; I2C &i2c; RawSerial* pc_p; Timer timer; uint8_t Ascale; // AFS_2G, AFS_4G, AFS_8G, AFS_16G uint8_t Gscale; // GFS_250DPS, GFS_500DPS, GFS_1000DPS, GFS_2000DPS uint8_t Mscale; // MFS_14BITS or MFS_16BITS, 14-bit or 16-bit magnetometer resolution uint8_t Mmode; // Either 8 Hz 0x02) or 100 Hz (0x06) magnetometer data ODR float aRes, gRes, mRes; // scale resolutions per LSB for the sensors int16_t accelCount[3]; // Stores the 16-bit signed accelerometer sensor output int16_t gyroCount[3]; // Stores the 16-bit signed gyro sensor output int16_t magCount[3]; // Stores the 16-bit signed magnetometer sensor output float magCalibration[3], magbias[3]; // Factory mag calibration and mag bias float gyroBias[3], accelBias[3]; // Bias corrections for gyro and accelerometer float ax, ay, az, gx, gy, gz, mx, my, mz; // variables to hold latest sensor data values int16_t tempCount; // Stores the real internal chip temperature in degrees Celsius float temperature; float SelfTest[6]; // parameters for 6 DoF sensor fusion calculations float GyroMeasError; // gyroscope measurement error in rads/s (start at 60 deg/s), then reduce after ~10 s to 3 float beta; // compute beta float GyroMeasDrift; // gyroscope measurement drift in rad/s/s (start at 0.0 deg/s/s) float zeta ; // compute zeta, the other free parameter in the Madgwick scheme usually set to a small or zero value float pitch, yaw, roll; float deltat; // integration interval for both filter schemes int lastUpdate, firstUpdate, Now; // used to calculate integration interval // used to calculate integration interval float q[4]; // vector to hold quaternion float eInt[3]; // vector to hold integral error for Mahony method float lpmag[3]; void writeByte(uint8_t address, uint8_t subAddress, uint8_t data); char readByte(uint8_t address, uint8_t subAddress); void readBytes(uint8_t address, uint8_t subAddress, uint8_t count, uint8_t * dest); void initializeValue(void); void initMPU9250(void); void initAK8963(float * destination); void resetMPU9250(void); void calibrateMPU9250(float * dest1, float * dest2); void getMres(void); void getGres(void); void getAres(void); void readAccelData(int16_t * destination); void readGyroData(int16_t * destination); void readMagData(int16_t * destination); int16_t readTempData(void); uint8_t Whoami_MPU9250(void); uint8_t Whoami_AK8963(void); void sensingAccel(void); void sensingGyro(void); void sensingMag(void); void sensingTemp(void); void MadgwickQuaternionUpdate(float ax, float ay, float az, float gx, float gy, float gz, float mx, float my, float mz); void MahonyQuaternionUpdate(float ax, float ay, float az, float gx, float gy, float gz, float mx, float my, float mz); void translateQuaternionToDeg(float quaternion[4]); void calibrateDegree(void); void transformCoordinateFromCompassToMPU(); protected: }; #endif