Gyro_MPU3300
Dependencies: Gyro_MPU3300 mbed
Fork of MPU3300 by
Diff: main.cpp
- Revision:
- 0:7e0ed4a0d584
diff -r 000000000000 -r 7e0ed4a0d584 main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Fri Feb 13 17:17:15 2015 +0000 @@ -0,0 +1,175 @@ +#include<mbed.h> +#include "MPU3300.h" //header file which includes all the register addresses and + //Bit configuration of those registers +SPI spi (PTD6,PTD7,PTD5) ; // MOSI,MISO, CLOCK pins being used on //microcontroller(in order) +DigitalOut ssn (PTA13); //Slave Select pin +Serial pc(USBTX,USBRX); +InterruptIn dr(PTD2); //Interrupt pin +Ticker tr; //Ticker function to give values for limited amount of time +uint8_t trFlag; //ticker Flag +uint8_t drFlag; //data-ready interrupt flag +void trSub(); +void drSub(); +void init_gyro(); +void execute_gyro(); +int main(void) +{ + init_gyro(); //Initializing Gyroscope registers and setting them to our required configuration + execute_gyro(); //Executing gyroscope for measuring angular rates + return 0; +} +void drSub() //In this function we setting data-ready flag to 1 +{ + drFlag=1; +} +void trSub() //In this function we are setting ticker flag to 0 +{ + trFlag=0; +} +void init_gyro() +{ + uint8_t response; + ssn=1; //Deselecting the chip + spi.format(8,3); // Spi format is 8 bits, and clock mode 3 + spi.frequency(1000000); //frequency to be set as 1MHz + drFlag=0; //Intially defining data-ready flag to be 0 + dr.mode(PullDown); + dr.rise(&drSub); + __disable_irq(); + +/*Following the above mentioned algorithm for initializing the register and changing its configuration*/ + ssn=0; //Selecting chip(Mpu-3300) + spi.write(USER_CTRL|READFLAG); //sending USER_CTRL address with read bit + response=spi.write(DUMMYBIT); //sending dummy bit to get default values of the register + + ssn=1; //Deselecting the chip + wait(0.1); //waiting according the product specifications + + ssn=0; //again selecting the chip + spi.write(USER_CTRL); //sending USER_CTRL address without read bit + spi.write(response|BIT_I2C_IF_DIS); //disabling the I2C mode in the register + ssn=1; //deselecting the chip + wait(0.1); // waiting for 100ms before going for another register + + ssn=0; + spi.write(PWR_MGMT_1|READFLAG); //Power Management register-1 + response=spi.write(DUMMYBIT); + ssn=1; + wait(0.1); + + ssn=0; + spi.write(PWR_MGMT_1); + response=spi.write(response|BIT_CLKSEL_X); //Selecting the X axis gyroscope as clock as mentioned above + ssn=1; + wait(0.1); + + ssn=0; + spi.write(GYRO_CONFIG|READFLAG); //sending GYRO_CONFIG address with read bit + response=spi.write(DUMMYBIT); + ssn=1; + wait(0.1); + + ssn=0; + spi.write(GYRO_CONFIG); //sending GYRO_CONFIG address to write to register + spi.write(response&(~(BITS_FS_SEL_3|BITS_FS_SEL_4))); //selecting a full scale mode of +/=225 deg/sec + ssn=1; + wait(0.1); + + ssn=0; + spi.write(CONFIG|READFLAG); //sending CONFIG address with read bit + response=spi.write(DUMMYBIT); + ssn=1; + wait(0.1); + + ssn=0; + spi.write(CONFIG); //sending CONFIG address to write to register + spi.write(response|BITS_DLPF_CFG); //selecting a bandwidth of 42 hz and delay of 4.8ms + ssn=1; + wait(0.1); + + ssn=0; + spi.write(SMPLRT_DIV|READFLAG); //sending SMPLRT_DIV address with read bit + response=spi.write(DUMMYBIT); + ssn=1; + wait(0.1); + + ssn=0; + spi.write(SMPLRT_DIV); //sending SMPLRT_DIV address to write to register + spi.write(response&BITS_SMPLRT_DIV); //setting the sampling rate division to be 0 to make sample rate = gyroscopic output rate + ssn=1; + wait(0.1); + + ssn=0; + spi.write(INT_ENABLE|READFLAG); //sending address of INT_ENABLE with readflag + response=spi.write(DUMMYBIT); //sending dummy byte to get the default values of the + // regiser + ssn=1; + wait(0.1); + + ssn=0; + spi.write(INT_ENABLE); //sending INT_ENABLE address to write to register + spi.write(response|BIT_DATA_RDY_ENABLE); //Enbling data ready interrupt + ssn=1; + wait(0.1); + + __enable_irq(); +} + +void execute_gyro() +{ + uint8_t response; + uint8_t MSB,LSB; + int16_t bit_data; + float data[3],error[3]={0,0,0}; //declaring error array to add to the values when required + float senstivity = 145.6; //senstivity is 145.6 for full scale mode of +/-225 deg/sec + ssn=0; + spi.write(PWR_MGMT_1|READFLAG); //sending address of INT_ENABLE with readflag + response=spi.write(DUMMYBIT); // + ssn=1; + wait(0.1); + + ssn=0; + spi.write(PWR_MGMT_1); //sending PWR_MGMT_1 address to write to register + response=spi.write(response&(~(BIT_SLEEP))); //waking up the gyroscope from sleep + ssn=1; + wait(0.1); + + trFlag=1; + tr.attach(&trSub,1); //executes the function trSub afer 1sec + while(trFlag) + { + if(drFlag==1) + { + ssn=0; + spi.write(GYRO_XOUT_H|READFLAG); //sending address of PWR_MGMT_1 with readflag + for(int i=0;i<3;i++) + { + MSB = spi.write(DUMMYBIT); //reading the MSB values of x,y and z respectively + LSB = spi.write(DUMMYBIT); //reading the LSB values of x,y and z respectively + bit_data= ((int16_t)MSB<<8)|LSB; //concatenating to get 16 bit 2's complement of the required gyroscope values + data[i]=(float)bit_data; + data[i]=data[i]/senstivity; //dividing with senstivity to get the readings in deg/sec + data[i]+=error[i]; //adding with error to remove offset errors + } + ssn=1; + for (int i=0;i<3;i++) + { + printf("%f\t",data[i]); //printing the angular velocity values + } + printf("\n"); + break; + } + drFlag=0; + } + ssn=0; + spi.write(PWR_MGMT_1|READFLAG); //sending address of PWR_MGMT_1 with readflag + response=spi.write(DUMMYBIT); + ssn=1; + wait(0.1); + + ssn=0; + spi.write(PWR_MGMT_1); //sending PWR_MGMT_1 address to write to register + response=spi.write(response|BIT_SLEEP); //setting the gyroscope in sleep mode + ssn=1; + wait(0.1); +}