GOPA KUMAR K C
/
MPU3300
Gyro_MPU3300
main.cpp@0:7e0ed4a0d584, 2015-02-13 (annotated)
- Committer:
- gkumar
- Date:
- Fri Feb 13 17:17:15 2015 +0000
- Revision:
- 0:7e0ed4a0d584
Gyro_MPU3300
Who changed what in which revision?
User | Revision | Line number | New 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 | } |