integrated sensor stand alone code used for int. test 2

Dependencies:   mbed

Fork of mnm_blue by sakthi priya amirtharaj

Committer:
sakthipriya
Date:
Sat Feb 28 11:20:27 2015 +0000
Revision:
2:203e549166ca
Parent:
1:21fc0c5bafb2
m&m_standalone

Who changed what in which revision?

UserRevisionLine numberNew contents of line
cholletisaik777 0:b2d4134279d4 1 #include<mbed.h>
cholletisaik777 0:b2d4134279d4 2 #include "pni.h" //pni header file
cholletisaik777 0:b2d4134279d4 3 Serial pc(USBTX,USBRX); //for usb communication
sakthipriya 1:21fc0c5bafb2 4 I2C i2c (PTC9,PTC8); //PTC2-sda,PTC1-scl
cholletisaik777 0:b2d4134279d4 5 void INIT_PNI(void); //initialization of registers happens
cholletisaik777 0:b2d4134279d4 6 float *EXECUTE_PNI(); //data is obtained
cholletisaik777 0:b2d4134279d4 7 void T_OUT(); //timeout function to stop infinite loop
cholletisaik777 0:b2d4134279d4 8 Timeout to; //Timeout variable to
cholletisaik777 0:b2d4134279d4 9 int toFlag;
cholletisaik777 0:b2d4134279d4 10 void T_OUT()
cholletisaik777 0:b2d4134279d4 11 {
cholletisaik777 0:b2d4134279d4 12 toFlag=0; //as T_OUT function gets called the while loop gets terminated
cholletisaik777 0:b2d4134279d4 13 }
cholletisaik777 0:b2d4134279d4 14
cholletisaik777 0:b2d4134279d4 15 //DEFINING VARIABLES
cholletisaik777 0:b2d4134279d4 16 char cmd[2];
cholletisaik777 0:b2d4134279d4 17 char raw_gyro[6];
cholletisaik777 0:b2d4134279d4 18 char raw_mag[6];
cholletisaik777 0:b2d4134279d4 19 char store,status;
cholletisaik777 0:b2d4134279d4 20 int16_t bit_data;
cholletisaik777 0:b2d4134279d4 21 float gyro_data[3], mag_data[3],combined_values[6],*data;
cholletisaik777 0:b2d4134279d4 22 float senstivity_gyro =6.5536; //senstivity is obtained from 2^15/5000dps
cholletisaik777 0:b2d4134279d4 23 float senstivity_mag =32.768; //senstivity is obtained from 2^15/1000microtesla
cholletisaik777 0:b2d4134279d4 24 float gyro_error[3]= {0,0,0}, mag_error[3]= {0,0,0};
cholletisaik777 0:b2d4134279d4 25
cholletisaik777 0:b2d4134279d4 26 int main(void)
cholletisaik777 0:b2d4134279d4 27 {
cholletisaik777 0:b2d4134279d4 28
sakthipriya 2:203e549166ca 29 printf("\\program starting\n");
cholletisaik777 0:b2d4134279d4 30 INIT_PNI();
cholletisaik777 0:b2d4134279d4 31 data=EXECUTE_PNI(); //the angular velocity is stored in the first 3 values and magnetic field values in next 3
cholletisaik777 0:b2d4134279d4 32 pc.printf("gyro values\n"); //printing the angular velocity and magnetic field values
cholletisaik777 0:b2d4134279d4 33 for(int i=0; i<3; i++) {
cholletisaik777 0:b2d4134279d4 34 pc.printf("%f\t",data[i]);
cholletisaik777 0:b2d4134279d4 35 }
cholletisaik777 0:b2d4134279d4 36 pc.printf("mag values\n");
cholletisaik777 0:b2d4134279d4 37 for(int i=3; i<6; i++) {
cholletisaik777 0:b2d4134279d4 38 pc.printf("%f\t",data[i]);
cholletisaik777 0:b2d4134279d4 39 }
cholletisaik777 0:b2d4134279d4 40 }
cholletisaik777 0:b2d4134279d4 41
cholletisaik777 0:b2d4134279d4 42 void INIT_PNI()
cholletisaik777 0:b2d4134279d4 43 {
cholletisaik777 0:b2d4134279d4 44 cmd[0]=RESETREQ;
cholletisaik777 0:b2d4134279d4 45 cmd[1]=BIT_RESREQ;
cholletisaik777 0:b2d4134279d4 46 i2c.write(SLAVE_ADDR,cmd,2); //When 0x01 is written in reset request register Emulates a hard power down/power up
cholletisaik777 0:b2d4134279d4 47 wait_ms(2000); //waiting for loading configuration file stored in EEPROM
cholletisaik777 0:b2d4134279d4 48 cmd[0]=SENTRALSTATUS;
cholletisaik777 0:b2d4134279d4 49 i2c.write(SLAVE_ADDR,cmd,1);
cholletisaik777 0:b2d4134279d4 50 i2c.read(SLAVE_ADDR_READ,&store,1);
cholletisaik777 0:b2d4134279d4 51 wait_ms(100);
cholletisaik777 0:b2d4134279d4 52 //to check whether EEPROM is uploaded
cholletisaik777 0:b2d4134279d4 53 switch((int)store) {
cholletisaik777 0:b2d4134279d4 54 case(3): {
cholletisaik777 0:b2d4134279d4 55 break;
cholletisaik777 0:b2d4134279d4 56 }
cholletisaik777 0:b2d4134279d4 57 case(11): {
cholletisaik777 0:b2d4134279d4 58 break;
cholletisaik777 0:b2d4134279d4 59 }
cholletisaik777 0:b2d4134279d4 60 default: {
cholletisaik777 0:b2d4134279d4 61 cmd[0]=RESETREQ;
cholletisaik777 0:b2d4134279d4 62 cmd[1]=BIT_RESREQ;
cholletisaik777 0:b2d4134279d4 63 i2c.write(SLAVE_ADDR,cmd,2);
cholletisaik777 0:b2d4134279d4 64 wait_ms(2000);
cholletisaik777 0:b2d4134279d4 65 }
cholletisaik777 0:b2d4134279d4 66 }
cholletisaik777 0:b2d4134279d4 67 //pc.printf("Sentral Status is %x\n",(int)store);
cholletisaik777 0:b2d4134279d4 68 cmd[0]=HOST_CTRL; //0x01 is written in HOST CONTROL register to enable the sensors
cholletisaik777 0:b2d4134279d4 69 cmd[1]=BIT_RUN_ENB;
cholletisaik777 0:b2d4134279d4 70 i2c.write(SLAVE_ADDR,cmd,2);
cholletisaik777 0:b2d4134279d4 71 wait_ms(100);
cholletisaik777 0:b2d4134279d4 72 cmd[0]=MAGRATE; //Output data rate of 100Hz is used for magnetometer
cholletisaik777 0:b2d4134279d4 73 cmd[1]=BIT_MAGODR;
cholletisaik777 0:b2d4134279d4 74 i2c.write(SLAVE_ADDR,cmd,2);
cholletisaik777 0:b2d4134279d4 75 wait_ms(100);
cholletisaik777 0:b2d4134279d4 76 cmd[0]=GYRORATE; //Output data rate of 150Hz is used for gyroscope
cholletisaik777 0:b2d4134279d4 77 cmd[1]=BIT_GYROODR;
cholletisaik777 0:b2d4134279d4 78 i2c.write(SLAVE_ADDR,cmd,2);
cholletisaik777 0:b2d4134279d4 79 wait_ms(100);
cholletisaik777 0:b2d4134279d4 80 cmd[0]=ALGO_CTRL; //When 0x00 is written to ALGO CONTROL register we get scaled sensor values
cholletisaik777 0:b2d4134279d4 81 cmd[1]=0x00;
cholletisaik777 0:b2d4134279d4 82 i2c.write(SLAVE_ADDR,cmd,2);
cholletisaik777 0:b2d4134279d4 83 wait_ms(100);
cholletisaik777 0:b2d4134279d4 84 cmd[0]=ENB_EVT; //enabling the error,gyro values and magnetometer values
cholletisaik777 0:b2d4134279d4 85 cmd[1]=BIT_EVT_ENB;
cholletisaik777 0:b2d4134279d4 86 i2c.write(SLAVE_ADDR,cmd,2);
cholletisaik777 0:b2d4134279d4 87 wait_ms(100);
cholletisaik777 0:b2d4134279d4 88 }
cholletisaik777 0:b2d4134279d4 89
cholletisaik777 0:b2d4134279d4 90 float *EXECUTE_PNI()
cholletisaik777 0:b2d4134279d4 91 {
cholletisaik777 0:b2d4134279d4 92 toFlag=1; //toFlag is set to 1 so that it enters while loop
cholletisaik777 0:b2d4134279d4 93 to.attach(&T_OUT,2); //after 2 seconds the while loop gets terminated
cholletisaik777 0:b2d4134279d4 94 while(toFlag) {
cholletisaik777 0:b2d4134279d4 95 cmd[0]=EVT_STATUS;
cholletisaik777 0:b2d4134279d4 96 i2c.write(SLAVE_ADDR,cmd,1);
cholletisaik777 0:b2d4134279d4 97 i2c.read(SLAVE_ADDR_READ,&status,1);
cholletisaik777 0:b2d4134279d4 98 wait_ms(100);
sakthipriya 1:21fc0c5bafb2 99 pc.printf("\nEvent Status is %x\n",(int)status);
cholletisaik777 0:b2d4134279d4 100 //if the 6th and 4th bit are 1 then it implies that gyro and magnetometer values are ready to take
cholletisaik777 0:b2d4134279d4 101 if(((int)status&40)==40) {
cholletisaik777 0:b2d4134279d4 102 cmd[0]=GYRO_XOUT_H; //0x22 gyro LSB of x
cholletisaik777 0:b2d4134279d4 103 i2c.write(SLAVE_ADDR,cmd,1);
cholletisaik777 0:b2d4134279d4 104 i2c.read(SLAVE_ADDR_READ,raw_gyro,6);
cholletisaik777 0:b2d4134279d4 105 cmd[0]=MAG_XOUT_H; //LSB of x
cholletisaik777 0:b2d4134279d4 106 i2c.write(SLAVE_ADDR,cmd,1);
cholletisaik777 0:b2d4134279d4 107 i2c.read(SLAVE_ADDR_READ,raw_mag,6);
cholletisaik777 0:b2d4134279d4 108 //pc.printf("\nGyro Values:\n");
cholletisaik777 0:b2d4134279d4 109 for(int i=0; i<3; i++) {
cholletisaik777 0:b2d4134279d4 110 //concatenating gyro LSB and MSB to get 16 bit signed data values
cholletisaik777 0:b2d4134279d4 111 bit_data= ((int16_t)raw_gyro[2*i+1]<<8)|(int16_t)raw_gyro[2*i];
cholletisaik777 0:b2d4134279d4 112 gyro_data[i]=(float)bit_data;
cholletisaik777 0:b2d4134279d4 113 gyro_data[i]=gyro_data[i]/senstivity_gyro;
cholletisaik777 0:b2d4134279d4 114 gyro_data[i]+=gyro_error[i];
cholletisaik777 0:b2d4134279d4 115 //pc.printf("%f\t",gyro_data[i]);
cholletisaik777 0:b2d4134279d4 116 }
cholletisaik777 0:b2d4134279d4 117 //pc.printf("\nMag Values:\n");
cholletisaik777 0:b2d4134279d4 118 for(int i=0; i<3; i++) {
cholletisaik777 0:b2d4134279d4 119 //concatenating mag LSB and MSB to get 16 bit signed data values
cholletisaik777 0:b2d4134279d4 120 bit_data= ((int16_t)raw_mag[2*i+1]<<8)|(int16_t)raw_mag[2*i];
cholletisaik777 0:b2d4134279d4 121 mag_data[i]=(float)bit_data;
cholletisaik777 0:b2d4134279d4 122 mag_data[i]=mag_data[i]/senstivity_mag;
cholletisaik777 0:b2d4134279d4 123 mag_data[i]+=mag_error[i];
cholletisaik777 0:b2d4134279d4 124 //pc.printf("%f\t",mag_data[i]);
cholletisaik777 0:b2d4134279d4 125 }
cholletisaik777 0:b2d4134279d4 126 for(int i=0; i<3; i++) {
cholletisaik777 0:b2d4134279d4 127 combined_values[i]=gyro_data[i];
cholletisaik777 0:b2d4134279d4 128 combined_values[i+3]=mag_data[i];
cholletisaik777 0:b2d4134279d4 129 }
cholletisaik777 0:b2d4134279d4 130 return(combined_values); //returning poiter combined values
cholletisaik777 0:b2d4134279d4 131 }
cholletisaik777 0:b2d4134279d4 132 //checking for the error
cholletisaik777 0:b2d4134279d4 133 else if (((int)status&2)==2) {
cholletisaik777 0:b2d4134279d4 134 INIT_PNI(); //when there is any error then Again inilization is done to remove error
cholletisaik777 0:b2d4134279d4 135 }
cholletisaik777 0:b2d4134279d4 136 }
cholletisaik777 0:b2d4134279d4 137 }