Filter for 9250

Dependencies:   mbed

Fork of MPU9250 by Ilia Manenok

Committer:
farhanalam
Date:
Sun Jul 09 14:20:09 2017 +0000
Revision:
5:c7d9f3353b7c
Parent:
4:337af8bbd44e
mpu9250 test

Who changed what in which revision?

UserRevisionLine numberNew contents of line
imanyonok 0:ccea261dce7a 1 /* MPU9250 Basic Example Code
imanyonok 0:ccea261dce7a 2 by: Kris Winer
imanyonok 0:ccea261dce7a 3 date: April 1, 2014
farhanalam 2:6b427a493d9b 4 license: Beerware - Use this code however you'd like. If you
imanyonok 0:ccea261dce7a 5 find it useful you can buy me a beer some time.
farhanalam 2:6b427a493d9b 6
farhanalam 2:6b427a493d9b 7 Demonstrate basic MPU-9250 functionality including parameterizing the register addresses, initializing the sensor,
farhanalam 2:6b427a493d9b 8 getting properly scaled accelerometer, gyroscope, and magnetometer data out. Added display functions to
farhanalam 2:6b427a493d9b 9 allow display to on breadboard monitor. Addition of 9 DoF sensor fusion using open source Madgwick and
imanyonok 0:ccea261dce7a 10 Mahony filter algorithms. Sketch runs on the 3.3 V 8 MHz Pro Mini and the Teensy 3.1.
farhanalam 2:6b427a493d9b 11
imanyonok 0:ccea261dce7a 12 SDA and SCL should have external pull-up resistors (to 3.3V).
imanyonok 0:ccea261dce7a 13 10k resistors are on the EMSENSR-9250 breakout board.
farhanalam 2:6b427a493d9b 14
imanyonok 0:ccea261dce7a 15 Hardware setup:
imanyonok 0:ccea261dce7a 16 MPU9250 Breakout --------- Arduino
imanyonok 0:ccea261dce7a 17 VDD ---------------------- 3.3V
imanyonok 0:ccea261dce7a 18 VDDI --------------------- 3.3V
imanyonok 0:ccea261dce7a 19 SDA ----------------------- A4
imanyonok 0:ccea261dce7a 20 SCL ----------------------- A5
imanyonok 0:ccea261dce7a 21 GND ---------------------- GND
farhanalam 2:6b427a493d9b 22
farhanalam 2:6b427a493d9b 23 Note: The MPU9250 is an I2C sensor and uses the Arduino Wire library.
imanyonok 0:ccea261dce7a 24 Because the sensor is not 5V tolerant, we are using a 3.3 V 8 MHz Pro Mini or a 3.3 V Teensy 3.1.
imanyonok 0:ccea261dce7a 25 We have disabled the internal pull-ups used by the Wire library in the Wire.h/twi.c utility file.
imanyonok 0:ccea261dce7a 26 We are also using the 400 kHz fast I2C mode by setting the TWI_FREQ to 400000L /twi.h utility file.
imanyonok 0:ccea261dce7a 27 */
farhanalam 2:6b427a493d9b 28 //yellow SCL on PB6
farhanalam 2:6b427a493d9b 29 //Green SDA on PB7
farhanalam 2:6b427a493d9b 30 //brown 3,3V
farhanalam 2:6b427a493d9b 31 //black GND
imanyonok 0:ccea261dce7a 32 #include "MPU9250.h"
farhanalam 2:6b427a493d9b 33 #include "FLASH.h"
farhanalam 4:337af8bbd44e 34 #include "user.h"
farhanalam 4:337af8bbd44e 35
farhanalam 4:337af8bbd44e 36 MPU9250 mpu9250;
farhanalam 4:337af8bbd44e 37
farhanalam 4:337af8bbd44e 38 void Read_MPU9250()
farhanalam 4:337af8bbd44e 39 {
farhanalam 5:c7d9f3353b7c 40 myled= !myled;
farhanalam 4:337af8bbd44e 41 // If intPin goes high, all data registers have new data
farhanalam 4:337af8bbd44e 42 if(mpu9250.readByte(MPU9250_ADDRESS, INT_STATUS) & 0x01) { // On interrupt, check if data ready interrupt
farhanalam 3:c138317c9753 43
farhanalam 4:337af8bbd44e 44 mpu9250.readAccelData(accelCount); // Read the x/y/z adc values
farhanalam 4:337af8bbd44e 45 // Now we'll calculate the accleration value into actual g's
farhanalam 4:337af8bbd44e 46
farhanalam 4:337af8bbd44e 47 ax = (float)accelCount[0]*aRes - accelBias[0]; // get actual g value, this depends on scale being set
farhanalam 5:c7d9f3353b7c 48 // printf("ax=%f\n\r",ax);
farhanalam 5:c7d9f3353b7c 49 // printf ("accelcount=%x\n\r",accelCount[0]);
farhanalam 5:c7d9f3353b7c 50 // printf ("accelcount int=%i\n\r",accelCount[0]);
farhanalam 5:c7d9f3353b7c 51 //printf ("acc X_H=%x\n\r",reg8_bit[X_H]);
farhanalam 5:c7d9f3353b7c 52 // printf ("acc decimel X_L=%d\n\r",reg8_bit[X_L]);
farhanalam 5:c7d9f3353b7c 53 // printf ("acc X_L=%x\n\r",reg8_bit[X_L]);
farhanalam 4:337af8bbd44e 54 /* ay = (float)accelCount[1]*aRes - accelBias[1];
farhanalam 4:337af8bbd44e 55 az = (float)accelCount[2]*aRes - accelBias[2];
farhanalam 4:337af8bbd44e 56 */
farhanalam 4:337af8bbd44e 57 mpu9250.readGyroData(gyroCount); // Read the x/y/z adc values
farhanalam 4:337af8bbd44e 58 // Calculate the gyro value into actual degrees per second
farhanalam 4:337af8bbd44e 59 /*
farhanalam 4:337af8bbd44e 60 gx = (float)gyroCount[0]*gRes - gyroBias[0]; // get actual gyro value, this depends on scale being set
farhanalam 4:337af8bbd44e 61 gy = (float)gyroCount[1]*gRes - gyroBias[1];
farhanalam 4:337af8bbd44e 62 gz = (float)gyroCount[2]*gRes - gyroBias[2];
farhanalam 4:337af8bbd44e 63 */
farhanalam 4:337af8bbd44e 64 mpu9250.readMagData(magCount); // Read the x/y/z adc values
farhanalam 4:337af8bbd44e 65 // Calculate the magnetometer values in milliGauss
farhanalam 4:337af8bbd44e 66 // Include factory calibration per data sheet and user environmental corrections
farhanalam 4:337af8bbd44e 67 /*
farhanalam 4:337af8bbd44e 68 mx = (float)magCount[0]*mRes*magCalibration[0] - magbias[0]; // get actual magnetometer value, this depends on scale being set
farhanalam 4:337af8bbd44e 69 my = (float)magCount[1]*mRes*magCalibration[1] - magbias[1];
farhanalam 4:337af8bbd44e 70 mz = (float)magCount[2]*mRes*magCalibration[2] - magbias[2];
farhanalam 4:337af8bbd44e 71 */
farhanalam 4:337af8bbd44e 72 myled= !myled;
farhanalam 4:337af8bbd44e 73 }
farhanalam 4:337af8bbd44e 74
farhanalam 4:337af8bbd44e 75 }
farhanalam 4:337af8bbd44e 76
farhanalam 4:337af8bbd44e 77
farhanalam 4:337af8bbd44e 78
farhanalam 4:337af8bbd44e 79
farhanalam 4:337af8bbd44e 80
imanyonok 0:ccea261dce7a 81
imanyonok 0:ccea261dce7a 82 float sum = 0;
imanyonok 0:ccea261dce7a 83 uint32_t sumCount = 0;
imanyonok 0:ccea261dce7a 84
farhanalam 2:6b427a493d9b 85
farhanalam 4:337af8bbd44e 86 Ticker every_10ms;
farhanalam 2:6b427a493d9b 87 Timer t;
imanyonok 0:ccea261dce7a 88
farhanalam 2:6b427a493d9b 89 Serial pc(USBTX, USBRX); // tx, rx
imanyonok 0:ccea261dce7a 90
farhanalam 2:6b427a493d9b 91
imanyonok 0:ccea261dce7a 92 int main()
imanyonok 0:ccea261dce7a 93 {
farhanalam 2:6b427a493d9b 94 pc.baud(9600);
farhanalam 2:6b427a493d9b 95 SER_FLASH.frequency(1000000);
farhanalam 2:6b427a493d9b 96 FLASH_CS=1;
farhanalam 2:6b427a493d9b 97
farhanalam 2:6b427a493d9b 98 SER_FLASH_ERASE();
farhanalam 2:6b427a493d9b 99 wait(3);
farhanalam 2:6b427a493d9b 100 // while(1)
farhanalam 2:6b427a493d9b 101 //{
farhanalam 2:6b427a493d9b 102 wait(.5);
farhanalam 2:6b427a493d9b 103
farhanalam 2:6b427a493d9b 104 //}
farhanalam 2:6b427a493d9b 105 //Set up I2C
farhanalam 2:6b427a493d9b 106 i2c.frequency(1000000); // use fast (400 kHz) I2C
farhanalam 2:6b427a493d9b 107
farhanalam 3:c138317c9753 108 //pc.printf("CPU SystemCoreClock is %d Hz\r\n", SystemCoreClock);
farhanalam 2:6b427a493d9b 109
farhanalam 2:6b427a493d9b 110 t.start();
farhanalam 2:6b427a493d9b 111
farhanalam 4:337af8bbd44e 112 pc.printf("start...\n\r");
farhanalam 2:6b427a493d9b 113
farhanalam 2:6b427a493d9b 114 // Read the WHO_AM_I register, this is a good test of communication
farhanalam 2:6b427a493d9b 115 uint8_t whoami = mpu9250.readByte(MPU9250_ADDRESS, WHO_AM_I_MPU9250); // Read WHO_AM_I register for MPU-9250
farhanalam 2:6b427a493d9b 116 pc.printf("I AM 0x%x\n\r", whoami);
farhanalam 2:6b427a493d9b 117 pc.printf("I SHOULD BE 0x71\n\r");
farhanalam 2:6b427a493d9b 118
farhanalam 2:6b427a493d9b 119 if (whoami == 0x71) { // WHO_AM_I should always be 0x68
farhanalam 3:c138317c9753 120 pc.printf("MPU9250 is online...\n\r");
farhanalam 2:6b427a493d9b 121 wait(1);
farhanalam 2:6b427a493d9b 122
farhanalam 2:6b427a493d9b 123
farhanalam 2:6b427a493d9b 124 mpu9250.resetMPU9250(); // Reset registers to default in preparation for device calibration
farhanalam 2:6b427a493d9b 125 mpu9250.calibrateMPU9250(gyroBias, accelBias); // Calibrate gyro and accelerometers, load biases in bias registers
farhanalam 3:c138317c9753 126 /*
farhanalam 2:6b427a493d9b 127 pc.printf("x gyro bias = %f\n\r", gyroBias[0]);
farhanalam 2:6b427a493d9b 128 pc.printf("y gyro bias = %f\n\r", gyroBias[1]);
farhanalam 2:6b427a493d9b 129 pc.printf("z gyro bias = %f\n\r", gyroBias[2]);
farhanalam 2:6b427a493d9b 130 pc.printf("x accel bias = %f\n\r", accelBias[0]);
farhanalam 2:6b427a493d9b 131 pc.printf("y accel bias = %f\n\r", accelBias[1]);
farhanalam 3:c138317c9753 132 pc.printf("z accel bias = %f\n\r", accelBias[2]);*/
farhanalam 2:6b427a493d9b 133 wait(2);
farhanalam 2:6b427a493d9b 134 mpu9250.initMPU9250();
farhanalam 3:c138317c9753 135 // pc.printf("MPU9250 initialized for active data mode....\n\r"); // Initialize device for active mode read of acclerometer, gyroscope, and temperature
farhanalam 2:6b427a493d9b 136 mpu9250.initAK8963(magCalibration);
farhanalam 3:c138317c9753 137 // pc.printf("AK8963 initialized for active data mode....\n\r"); // Initialize device for active mode read of magnetometer
farhanalam 3:c138317c9753 138 //pc.printf("Accelerometer full-scale range = %f g\n\r", 2.0f*(float)(1<<Ascale));
farhanalam 3:c138317c9753 139 //pc.printf("Gyroscope full-scale range = %f deg/s\n\r", 250.0f*(float)(1<<Gscale));
farhanalam 3:c138317c9753 140 // if(Mscale == 0) pc.printf("Magnetometer resolution = 14 bits\n\r");
farhanalam 3:c138317c9753 141 //if(Mscale == 1) pc.printf("Magnetometer resolution = 16 bits\n\r");
farhanalam 3:c138317c9753 142 //if(Mmode == 2) pc.printf("Magnetometer ODR = 8 Hz\n\r");
farhanalam 3:c138317c9753 143 //if(Mmode == 6) pc.printf("Magnetometer ODR = 100 Hz\n\r");
farhanalam 5:c7d9f3353b7c 144 // MPU9250SelfTest();
farhanalam 2:6b427a493d9b 145 wait(2);
farhanalam 2:6b427a493d9b 146 } else {
farhanalam 2:6b427a493d9b 147 pc.printf("Could not connect to MPU9250: \n\r");
farhanalam 2:6b427a493d9b 148 pc.printf("%#x \n", whoami);
farhanalam 2:6b427a493d9b 149
farhanalam 2:6b427a493d9b 150
farhanalam 2:6b427a493d9b 151
farhanalam 2:6b427a493d9b 152 while(1) ; // Loop forever if communication doesn't happen
imanyonok 0:ccea261dce7a 153 }
imanyonok 0:ccea261dce7a 154
farhanalam 4:337af8bbd44e 155 mpu9250.getAres(); // Get accelerometer sensitivity
farhanalam 3:c138317c9753 156 //mpu9250.getGres(); // Get gyro sensitivity
farhanalam 3:c138317c9753 157 //mpu9250.getMres(); // Get magnetometer sensitivity
farhanalam 3:c138317c9753 158 //pc.printf("Accelerometer sensitivity is %f LSB/g \n\r", 1.0f/aRes);
farhanalam 3:c138317c9753 159 //pc.printf("Gyroscope sensitivity is %f LSB/deg/s \n\r", 1.0f/gRes);
farhanalam 3:c138317c9753 160 //pc.printf("Magnetometer sensitivity is %f LSB/G \n\r", 1.0f/mRes);
imanyonok 0:ccea261dce7a 161 magbias[0] = +470.; // User environmental x-axis correction in milliGauss, should be automatically calculated
imanyonok 0:ccea261dce7a 162 magbias[1] = +120.; // User environmental x-axis correction in milliGauss
imanyonok 0:ccea261dce7a 163 magbias[2] = +125.; // User environmental x-axis correction in milliGauss
farhanalam 5:c7d9f3353b7c 164 wait(2);
farhanalam 5:c7d9f3353b7c 165 every_10ms.attach(&Read_MPU9250, 10);//0.001
imanyonok 0:ccea261dce7a 166
farhanalam 2:6b427a493d9b 167 while(1) {
farhanalam 4:337af8bbd44e 168
farhanalam 5:c7d9f3353b7c 169 // Read_MPU9250();
farhanalam 4:337af8bbd44e 170
farhanalam 2:6b427a493d9b 171
farhanalam 2:6b427a493d9b 172
farhanalam 2:6b427a493d9b 173 /*******************************memory write and read***************************************/
farhanalam 2:6b427a493d9b 174 write_EN_Flash();
farhanalam 2:6b427a493d9b 175 FLASH_CS=0;
farhanalam 2:6b427a493d9b 176 SER_FLASH.write(write_EN);
farhanalam 2:6b427a493d9b 177 FLASH_CS=1;
farhanalam 2:6b427a493d9b 178
farhanalam 2:6b427a493d9b 179 FLASH_CS=0;
farhanalam 2:6b427a493d9b 180 SER_FLASH.write(page_prog);
farhanalam 2:6b427a493d9b 181 SER_FLASH.write(0x00); //page adress
farhanalam 2:6b427a493d9b 182 SER_FLASH.write(0x00);//page adress
farhanalam 2:6b427a493d9b 183 SER_FLASH.write(0x00);//page adress
farhanalam 2:6b427a493d9b 184 //LED_Green=0;
farhanalam 2:6b427a493d9b 185 for (int i=0; i<=255; i++) {
farhanalam 2:6b427a493d9b 186 Sensor_data[i]=255-i;
farhanalam 2:6b427a493d9b 187 //pc.printf("array filling %i=%i\n\r", i,Sensor_data[i]);
farhanalam 2:6b427a493d9b 188 }
farhanalam 2:6b427a493d9b 189 int b= SER_FLASH.write(&Sensor_data[0],255,&SPI_rec[0],0);
farhanalam 2:6b427a493d9b 190 FLASH_CS=1;
farhanalam 2:6b427a493d9b 191 pc.printf("number of bytes=%i\n\r", b);
farhanalam 2:6b427a493d9b 192
imanyonok 0:ccea261dce7a 193
farhanalam 2:6b427a493d9b 194 FLASH_CS=0;
farhanalam 2:6b427a493d9b 195 SER_FLASH.write(Read_Data);
farhanalam 2:6b427a493d9b 196 SER_FLASH.write(0x00); //page adress
farhanalam 2:6b427a493d9b 197 SER_FLASH.write(0x00);//page adress
farhanalam 2:6b427a493d9b 198 SER_FLASH.write(0x00);//page adress
farhanalam 2:6b427a493d9b 199
farhanalam 2:6b427a493d9b 200
farhanalam 2:6b427a493d9b 201
farhanalam 2:6b427a493d9b 202 for(int i=0; i<=255; i++) {
farhanalam 2:6b427a493d9b 203 Sensor_data[i]= SER_FLASH.write(0x00);
farhanalam 4:337af8bbd44e 204 //pc.printf("location %i=%i\n\r",i, Sensor_data[i]);
farhanalam 2:6b427a493d9b 205 }
farhanalam 2:6b427a493d9b 206 FLASH_CS=1;
farhanalam 2:6b427a493d9b 207
farhanalam 2:6b427a493d9b 208 /***********************************************************************************************************/
farhanalam 4:337af8bbd44e 209 // while(1);
farhanalam 2:6b427a493d9b 210
farhanalam 4:337af8bbd44e 211 wait(1);
farhanalam 3:c138317c9753 212 // }
farhanalam 2:6b427a493d9b 213 }
farhanalam 2:6b427a493d9b 214
imanyonok 0:ccea261dce7a 215 }
farhanalam 4:337af8bbd44e 216
farhanalam 4:337af8bbd44e 217
farhanalam 4:337af8bbd44e 218