Gyro_MPU3300

Dependencies:   Gyro_MPU3300 mbed

Dependents:   Gyro_MPU3300

Fork of MPU3300 by GOPA KUMAR K C

Committer:
gkumar
Date:
Fri Feb 13 17:20:53 2015 +0000
Revision:
2:137b1af87cd0
Parent:
0:7e0ed4a0d584
Gyro_MPU3300

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gkumar 0:7e0ed4a0d584 1 #include<mbed.h>
gkumar 0:7e0ed4a0d584 2 #include "MPU3300.h" //header file which includes all the register addresses and
gkumar 0:7e0ed4a0d584 3 //Bit configuration of those registers
gkumar 0:7e0ed4a0d584 4 SPI spi (PTD6,PTD7,PTD5) ; // MOSI,MISO, CLOCK pins being used on //microcontroller(in order)
gkumar 0:7e0ed4a0d584 5 DigitalOut ssn (PTA13); //Slave Select pin
gkumar 0:7e0ed4a0d584 6 Serial pc(USBTX,USBRX);
gkumar 0:7e0ed4a0d584 7 InterruptIn dr(PTD2); //Interrupt pin
gkumar 0:7e0ed4a0d584 8 Ticker tr; //Ticker function to give values for limited amount of time
gkumar 0:7e0ed4a0d584 9 uint8_t trFlag; //ticker Flag
gkumar 0:7e0ed4a0d584 10 uint8_t drFlag; //data-ready interrupt flag
gkumar 0:7e0ed4a0d584 11 void trSub();
gkumar 0:7e0ed4a0d584 12 void drSub();
gkumar 0:7e0ed4a0d584 13 void init_gyro();
gkumar 0:7e0ed4a0d584 14 void execute_gyro();
gkumar 0:7e0ed4a0d584 15 int main(void)
gkumar 0:7e0ed4a0d584 16 {
gkumar 0:7e0ed4a0d584 17 init_gyro(); //Initializing Gyroscope registers and setting them to our required configuration
gkumar 0:7e0ed4a0d584 18 execute_gyro(); //Executing gyroscope for measuring angular rates
gkumar 0:7e0ed4a0d584 19 return 0;
gkumar 0:7e0ed4a0d584 20 }
gkumar 0:7e0ed4a0d584 21 void drSub() //In this function we setting data-ready flag to 1
gkumar 0:7e0ed4a0d584 22 {
gkumar 0:7e0ed4a0d584 23 drFlag=1;
gkumar 0:7e0ed4a0d584 24 }
gkumar 0:7e0ed4a0d584 25 void trSub() //In this function we are setting ticker flag to 0
gkumar 0:7e0ed4a0d584 26 {
gkumar 0:7e0ed4a0d584 27 trFlag=0;
gkumar 0:7e0ed4a0d584 28 }
gkumar 0:7e0ed4a0d584 29 void init_gyro()
gkumar 0:7e0ed4a0d584 30 {
gkumar 0:7e0ed4a0d584 31 uint8_t response;
gkumar 0:7e0ed4a0d584 32 ssn=1; //Deselecting the chip
gkumar 0:7e0ed4a0d584 33 spi.format(8,3); // Spi format is 8 bits, and clock mode 3
gkumar 0:7e0ed4a0d584 34 spi.frequency(1000000); //frequency to be set as 1MHz
gkumar 0:7e0ed4a0d584 35 drFlag=0; //Intially defining data-ready flag to be 0
gkumar 0:7e0ed4a0d584 36 dr.mode(PullDown);
gkumar 0:7e0ed4a0d584 37 dr.rise(&drSub);
gkumar 0:7e0ed4a0d584 38 __disable_irq();
gkumar 0:7e0ed4a0d584 39
gkumar 0:7e0ed4a0d584 40 /*Following the above mentioned algorithm for initializing the register and changing its configuration*/
gkumar 0:7e0ed4a0d584 41 ssn=0; //Selecting chip(Mpu-3300)
gkumar 0:7e0ed4a0d584 42 spi.write(USER_CTRL|READFLAG); //sending USER_CTRL address with read bit
gkumar 0:7e0ed4a0d584 43 response=spi.write(DUMMYBIT); //sending dummy bit to get default values of the register
gkumar 0:7e0ed4a0d584 44
gkumar 0:7e0ed4a0d584 45 ssn=1; //Deselecting the chip
gkumar 0:7e0ed4a0d584 46 wait(0.1); //waiting according the product specifications
gkumar 0:7e0ed4a0d584 47
gkumar 0:7e0ed4a0d584 48 ssn=0; //again selecting the chip
gkumar 0:7e0ed4a0d584 49 spi.write(USER_CTRL); //sending USER_CTRL address without read bit
gkumar 0:7e0ed4a0d584 50 spi.write(response|BIT_I2C_IF_DIS); //disabling the I2C mode in the register
gkumar 0:7e0ed4a0d584 51 ssn=1; //deselecting the chip
gkumar 0:7e0ed4a0d584 52 wait(0.1); // waiting for 100ms before going for another register
gkumar 0:7e0ed4a0d584 53
gkumar 0:7e0ed4a0d584 54 ssn=0;
gkumar 0:7e0ed4a0d584 55 spi.write(PWR_MGMT_1|READFLAG); //Power Management register-1
gkumar 0:7e0ed4a0d584 56 response=spi.write(DUMMYBIT);
gkumar 0:7e0ed4a0d584 57 ssn=1;
gkumar 0:7e0ed4a0d584 58 wait(0.1);
gkumar 0:7e0ed4a0d584 59
gkumar 0:7e0ed4a0d584 60 ssn=0;
gkumar 0:7e0ed4a0d584 61 spi.write(PWR_MGMT_1);
gkumar 0:7e0ed4a0d584 62 response=spi.write(response|BIT_CLKSEL_X); //Selecting the X axis gyroscope as clock as mentioned above
gkumar 0:7e0ed4a0d584 63 ssn=1;
gkumar 0:7e0ed4a0d584 64 wait(0.1);
gkumar 0:7e0ed4a0d584 65
gkumar 0:7e0ed4a0d584 66 ssn=0;
gkumar 0:7e0ed4a0d584 67 spi.write(GYRO_CONFIG|READFLAG); //sending GYRO_CONFIG address with read bit
gkumar 0:7e0ed4a0d584 68 response=spi.write(DUMMYBIT);
gkumar 0:7e0ed4a0d584 69 ssn=1;
gkumar 0:7e0ed4a0d584 70 wait(0.1);
gkumar 0:7e0ed4a0d584 71
gkumar 0:7e0ed4a0d584 72 ssn=0;
gkumar 0:7e0ed4a0d584 73 spi.write(GYRO_CONFIG); //sending GYRO_CONFIG address to write to register
gkumar 0:7e0ed4a0d584 74 spi.write(response&(~(BITS_FS_SEL_3|BITS_FS_SEL_4))); //selecting a full scale mode of +/=225 deg/sec
gkumar 0:7e0ed4a0d584 75 ssn=1;
gkumar 0:7e0ed4a0d584 76 wait(0.1);
gkumar 0:7e0ed4a0d584 77
gkumar 0:7e0ed4a0d584 78 ssn=0;
gkumar 0:7e0ed4a0d584 79 spi.write(CONFIG|READFLAG); //sending CONFIG address with read bit
gkumar 0:7e0ed4a0d584 80 response=spi.write(DUMMYBIT);
gkumar 0:7e0ed4a0d584 81 ssn=1;
gkumar 0:7e0ed4a0d584 82 wait(0.1);
gkumar 0:7e0ed4a0d584 83
gkumar 0:7e0ed4a0d584 84 ssn=0;
gkumar 0:7e0ed4a0d584 85 spi.write(CONFIG); //sending CONFIG address to write to register
gkumar 0:7e0ed4a0d584 86 spi.write(response|BITS_DLPF_CFG); //selecting a bandwidth of 42 hz and delay of 4.8ms
gkumar 0:7e0ed4a0d584 87 ssn=1;
gkumar 0:7e0ed4a0d584 88 wait(0.1);
gkumar 0:7e0ed4a0d584 89
gkumar 0:7e0ed4a0d584 90 ssn=0;
gkumar 0:7e0ed4a0d584 91 spi.write(SMPLRT_DIV|READFLAG); //sending SMPLRT_DIV address with read bit
gkumar 0:7e0ed4a0d584 92 response=spi.write(DUMMYBIT);
gkumar 0:7e0ed4a0d584 93 ssn=1;
gkumar 0:7e0ed4a0d584 94 wait(0.1);
gkumar 0:7e0ed4a0d584 95
gkumar 0:7e0ed4a0d584 96 ssn=0;
gkumar 0:7e0ed4a0d584 97 spi.write(SMPLRT_DIV); //sending SMPLRT_DIV address to write to register
gkumar 0:7e0ed4a0d584 98 spi.write(response&BITS_SMPLRT_DIV); //setting the sampling rate division to be 0 to make sample rate = gyroscopic output rate
gkumar 0:7e0ed4a0d584 99 ssn=1;
gkumar 0:7e0ed4a0d584 100 wait(0.1);
gkumar 0:7e0ed4a0d584 101
gkumar 0:7e0ed4a0d584 102 ssn=0;
gkumar 0:7e0ed4a0d584 103 spi.write(INT_ENABLE|READFLAG); //sending address of INT_ENABLE with readflag
gkumar 0:7e0ed4a0d584 104 response=spi.write(DUMMYBIT); //sending dummy byte to get the default values of the
gkumar 0:7e0ed4a0d584 105 // regiser
gkumar 0:7e0ed4a0d584 106 ssn=1;
gkumar 0:7e0ed4a0d584 107 wait(0.1);
gkumar 0:7e0ed4a0d584 108
gkumar 0:7e0ed4a0d584 109 ssn=0;
gkumar 0:7e0ed4a0d584 110 spi.write(INT_ENABLE); //sending INT_ENABLE address to write to register
gkumar 0:7e0ed4a0d584 111 spi.write(response|BIT_DATA_RDY_ENABLE); //Enbling data ready interrupt
gkumar 0:7e0ed4a0d584 112 ssn=1;
gkumar 0:7e0ed4a0d584 113 wait(0.1);
gkumar 0:7e0ed4a0d584 114
gkumar 0:7e0ed4a0d584 115 __enable_irq();
gkumar 0:7e0ed4a0d584 116 }
gkumar 0:7e0ed4a0d584 117
gkumar 0:7e0ed4a0d584 118 void execute_gyro()
gkumar 0:7e0ed4a0d584 119 {
gkumar 0:7e0ed4a0d584 120 uint8_t response;
gkumar 0:7e0ed4a0d584 121 uint8_t MSB,LSB;
gkumar 0:7e0ed4a0d584 122 int16_t bit_data;
gkumar 0:7e0ed4a0d584 123 float data[3],error[3]={0,0,0}; //declaring error array to add to the values when required
gkumar 0:7e0ed4a0d584 124 float senstivity = 145.6; //senstivity is 145.6 for full scale mode of +/-225 deg/sec
gkumar 0:7e0ed4a0d584 125 ssn=0;
gkumar 0:7e0ed4a0d584 126 spi.write(PWR_MGMT_1|READFLAG); //sending address of INT_ENABLE with readflag
gkumar 0:7e0ed4a0d584 127 response=spi.write(DUMMYBIT); //
gkumar 0:7e0ed4a0d584 128 ssn=1;
gkumar 0:7e0ed4a0d584 129 wait(0.1);
gkumar 0:7e0ed4a0d584 130
gkumar 0:7e0ed4a0d584 131 ssn=0;
gkumar 0:7e0ed4a0d584 132 spi.write(PWR_MGMT_1); //sending PWR_MGMT_1 address to write to register
gkumar 0:7e0ed4a0d584 133 response=spi.write(response&(~(BIT_SLEEP))); //waking up the gyroscope from sleep
gkumar 0:7e0ed4a0d584 134 ssn=1;
gkumar 0:7e0ed4a0d584 135 wait(0.1);
gkumar 0:7e0ed4a0d584 136
gkumar 0:7e0ed4a0d584 137 trFlag=1;
gkumar 0:7e0ed4a0d584 138 tr.attach(&trSub,1); //executes the function trSub afer 1sec
gkumar 0:7e0ed4a0d584 139 while(trFlag)
gkumar 0:7e0ed4a0d584 140 {
gkumar 0:7e0ed4a0d584 141 if(drFlag==1)
gkumar 0:7e0ed4a0d584 142 {
gkumar 0:7e0ed4a0d584 143 ssn=0;
gkumar 0:7e0ed4a0d584 144 spi.write(GYRO_XOUT_H|READFLAG); //sending address of PWR_MGMT_1 with readflag
gkumar 0:7e0ed4a0d584 145 for(int i=0;i<3;i++)
gkumar 0:7e0ed4a0d584 146 {
gkumar 0:7e0ed4a0d584 147 MSB = spi.write(DUMMYBIT); //reading the MSB values of x,y and z respectively
gkumar 0:7e0ed4a0d584 148 LSB = spi.write(DUMMYBIT); //reading the LSB values of x,y and z respectively
gkumar 0:7e0ed4a0d584 149 bit_data= ((int16_t)MSB<<8)|LSB; //concatenating to get 16 bit 2's complement of the required gyroscope values
gkumar 0:7e0ed4a0d584 150 data[i]=(float)bit_data;
gkumar 0:7e0ed4a0d584 151 data[i]=data[i]/senstivity; //dividing with senstivity to get the readings in deg/sec
gkumar 0:7e0ed4a0d584 152 data[i]+=error[i]; //adding with error to remove offset errors
gkumar 0:7e0ed4a0d584 153 }
gkumar 0:7e0ed4a0d584 154 ssn=1;
gkumar 0:7e0ed4a0d584 155 for (int i=0;i<3;i++)
gkumar 0:7e0ed4a0d584 156 {
gkumar 0:7e0ed4a0d584 157 printf("%f\t",data[i]); //printing the angular velocity values
gkumar 0:7e0ed4a0d584 158 }
gkumar 0:7e0ed4a0d584 159 printf("\n");
gkumar 0:7e0ed4a0d584 160 break;
gkumar 0:7e0ed4a0d584 161 }
gkumar 0:7e0ed4a0d584 162 drFlag=0;
gkumar 0:7e0ed4a0d584 163 }
gkumar 0:7e0ed4a0d584 164 ssn=0;
gkumar 0:7e0ed4a0d584 165 spi.write(PWR_MGMT_1|READFLAG); //sending address of PWR_MGMT_1 with readflag
gkumar 0:7e0ed4a0d584 166 response=spi.write(DUMMYBIT);
gkumar 0:7e0ed4a0d584 167 ssn=1;
gkumar 0:7e0ed4a0d584 168 wait(0.1);
gkumar 0:7e0ed4a0d584 169
gkumar 0:7e0ed4a0d584 170 ssn=0;
gkumar 0:7e0ed4a0d584 171 spi.write(PWR_MGMT_1); //sending PWR_MGMT_1 address to write to register
gkumar 0:7e0ed4a0d584 172 response=spi.write(response|BIT_SLEEP); //setting the gyroscope in sleep mode
gkumar 0:7e0ed4a0d584 173 ssn=1;
gkumar 0:7e0ed4a0d584 174 wait(0.1);
gkumar 0:7e0ed4a0d584 175 }