Offset calibration program for an SPI ADXL345. Tested with mbed LPC1768.

Dependencies:   ADXL345 mbed

Fork of Accelerometer_ADXL345 by Thomas Emil

This is a program for offset calibration of ADXL345, it will also compute a fine offset correction number which cannot be corrected on ADXL345 itself. The IMU will need to be re-oriented 6x2 times for the calibration first 6 times for the coarse calibration, during which offsets on the ADXL will be calibrated and the next 6 will compute the fine offsets...

Committer:
akashvibhute
Date:
Mon Nov 03 06:57:18 2014 +0000
Revision:
1:a1d998b362e9
Parent:
0:6b905abf1374
First commit, working program

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Tuxitheone 0:6b905abf1374 1 #include "mbed.h"
Tuxitheone 0:6b905abf1374 2 #include "ADXL345.h"
Tuxitheone 0:6b905abf1374 3
Tuxitheone 0:6b905abf1374 4 ADXL345 accelerometer(p5, p6, p7, p8); // (SDA, SDO, SCL, CS);
Tuxitheone 0:6b905abf1374 5 Serial pc(USBTX, USBRX); //For raw data
akashvibhute 1:a1d998b362e9 6
akashvibhute 1:a1d998b362e9 7 int readings[3] = {0, 0, 0};
akashvibhute 1:a1d998b362e9 8 float mag_lsb;
akashvibhute 1:a1d998b362e9 9
akashvibhute 1:a1d998b362e9 10 float x,y,z,mag_g;
akashvibhute 1:a1d998b362e9 11 float acc_readings[6][3];
akashvibhute 1:a1d998b362e9 12 float calc_offsets[3];
akashvibhute 1:a1d998b362e9 13 const float g=9.80665;
akashvibhute 1:a1d998b362e9 14 const float g_mm=g*1000;
akashvibhute 1:a1d998b362e9 15 const float acc_res_mg=3.9063; //acc resolution mg/LSB
Tuxitheone 0:6b905abf1374 16
akashvibhute 1:a1d998b362e9 17 int8_t offset2_8bit_int[3]={0,0,0};
akashvibhute 1:a1d998b362e9 18 char offset2_8bit_char[3];
akashvibhute 1:a1d998b362e9 19
akashvibhute 1:a1d998b362e9 20 float mg_offsets[3]={0.0,0.0,0.0}; //fine offsets in mg's which cannot be corrected by adxl
akashvibhute 1:a1d998b362e9 21
akashvibhute 1:a1d998b362e9 22 void acc_read();
akashvibhute 1:a1d998b362e9 23 void display_acc();
akashvibhute 1:a1d998b362e9 24 void acc_store_offsets();
akashvibhute 1:a1d998b362e9 25 int sign(float input);
akashvibhute 1:a1d998b362e9 26 void display_fine_acc();
Tuxitheone 0:6b905abf1374 27
Tuxitheone 0:6b905abf1374 28
Tuxitheone 0:6b905abf1374 29 int main()
Tuxitheone 0:6b905abf1374 30 {
akashvibhute 1:a1d998b362e9 31 pc.baud(921600); //set baud rate for USB serial to 921600bps
akashvibhute 1:a1d998b362e9 32
akashvibhute 1:a1d998b362e9 33 pc.printf("Starting ADXL345 test...\n");
akashvibhute 1:a1d998b362e9 34 pc.printf("Device ID is: 0x%02x\n", accelerometer.getDevId());
akashvibhute 1:a1d998b362e9 35
Tuxitheone 0:6b905abf1374 36
Tuxitheone 0:6b905abf1374 37 //Go into standby mode to configure the device.
Tuxitheone 0:6b905abf1374 38 accelerometer.setPowerControl(0x00);
Tuxitheone 0:6b905abf1374 39
Tuxitheone 0:6b905abf1374 40 //Full resolution, +/-4g, 3.9mg/LSB.
Tuxitheone 0:6b905abf1374 41 accelerometer.setDataFormatControl(0x0B);
Tuxitheone 0:6b905abf1374 42
Tuxitheone 0:6b905abf1374 43 //3.2kHz data rate.
Tuxitheone 0:6b905abf1374 44 accelerometer.setDataRate(ADXL345_3200HZ);
Tuxitheone 0:6b905abf1374 45
akashvibhute 1:a1d998b362e9 46 pc.printf("Axes offsets: ");
akashvibhute 1:a1d998b362e9 47 pc.printf("X: %d \t",accelerometer.getOffset(0x00));
akashvibhute 1:a1d998b362e9 48 pc.printf("Y: %d \t",accelerometer.getOffset(0x01));
akashvibhute 1:a1d998b362e9 49 pc.printf("Z: %d \n",accelerometer.getOffset(0x02));
akashvibhute 1:a1d998b362e9 50
Tuxitheone 0:6b905abf1374 51 //Measurement mode.
Tuxitheone 0:6b905abf1374 52 accelerometer.setPowerControl(0x08);
akashvibhute 1:a1d998b362e9 53
akashvibhute 1:a1d998b362e9 54 pc.printf("Current IMU reading: \n");
akashvibhute 1:a1d998b362e9 55 acc_read();
akashvibhute 1:a1d998b362e9 56 display_acc();
akashvibhute 1:a1d998b362e9 57
akashvibhute 1:a1d998b362e9 58 pc.printf("\nTo Calculate new offsets IMU needs to be re-oriented 12 times,\n Send 'R' when ready...\n\n");
akashvibhute 1:a1d998b362e9 59 while(pc.getc() != 'R') {}
akashvibhute 1:a1d998b362e9 60
akashvibhute 1:a1d998b362e9 61 pc.printf("Resetting current offsets... \n");
akashvibhute 1:a1d998b362e9 62 acc_store_offsets();
akashvibhute 1:a1d998b362e9 63
akashvibhute 1:a1d998b362e9 64 {
akashvibhute 1:a1d998b362e9 65 pc.printf("Okay, ready for first coarse reading set,\n Put IMU with +Z pointing up, then press 'R' when ready \n");
akashvibhute 1:a1d998b362e9 66 while(pc.getc() != 'R') {}
akashvibhute 1:a1d998b362e9 67 wait(0.1);
akashvibhute 1:a1d998b362e9 68 for(int n=0; n<10; n++)
akashvibhute 1:a1d998b362e9 69 {
akashvibhute 1:a1d998b362e9 70 wait(0.1);
akashvibhute 1:a1d998b362e9 71 acc_read();
akashvibhute 1:a1d998b362e9 72 acc_readings[4][0]+=x;
akashvibhute 1:a1d998b362e9 73 acc_readings[4][1]+=y;
akashvibhute 1:a1d998b362e9 74 acc_readings[4][2]+=z;
akashvibhute 1:a1d998b362e9 75 }
akashvibhute 1:a1d998b362e9 76 //display_acc();
akashvibhute 1:a1d998b362e9 77 pc.printf("\n");
akashvibhute 1:a1d998b362e9 78
akashvibhute 1:a1d998b362e9 79 pc.printf("Put IMU with -Z pointing up, then press 'R' when ready \n");
akashvibhute 1:a1d998b362e9 80 while(pc.getc() != 'R') {}
akashvibhute 1:a1d998b362e9 81 wait(0.1);
akashvibhute 1:a1d998b362e9 82 for(int n=0; n<10; n++)
akashvibhute 1:a1d998b362e9 83 {
akashvibhute 1:a1d998b362e9 84 wait(0.1);
akashvibhute 1:a1d998b362e9 85 acc_read();
akashvibhute 1:a1d998b362e9 86 acc_readings[5][0]+=x;
akashvibhute 1:a1d998b362e9 87 acc_readings[5][1]+=y;
akashvibhute 1:a1d998b362e9 88 acc_readings[5][2]+=z;
akashvibhute 1:a1d998b362e9 89 }
akashvibhute 1:a1d998b362e9 90 //display_acc();
akashvibhute 1:a1d998b362e9 91 pc.printf("\n");
akashvibhute 1:a1d998b362e9 92
akashvibhute 1:a1d998b362e9 93
akashvibhute 1:a1d998b362e9 94 pc.printf("Put IMU with +Y pointing up, then press 'R' when ready \n");
akashvibhute 1:a1d998b362e9 95 while(pc.getc() != 'R') {}
akashvibhute 1:a1d998b362e9 96 wait(0.1);
akashvibhute 1:a1d998b362e9 97 for(int n=0; n<10; n++)
akashvibhute 1:a1d998b362e9 98 {
akashvibhute 1:a1d998b362e9 99 wait(0.1);
akashvibhute 1:a1d998b362e9 100 acc_read();
akashvibhute 1:a1d998b362e9 101 acc_readings[2][0]+=x;
akashvibhute 1:a1d998b362e9 102 acc_readings[2][1]+=y;
akashvibhute 1:a1d998b362e9 103 acc_readings[2][2]+=z;
akashvibhute 1:a1d998b362e9 104 }
akashvibhute 1:a1d998b362e9 105 //display_acc();
akashvibhute 1:a1d998b362e9 106 pc.printf("\n");
akashvibhute 1:a1d998b362e9 107
akashvibhute 1:a1d998b362e9 108 pc.printf("Put IMU with -Y pointing up, then press 'R' when ready \n");
akashvibhute 1:a1d998b362e9 109 while(pc.getc() != 'R') {}
akashvibhute 1:a1d998b362e9 110 wait(0.1);
akashvibhute 1:a1d998b362e9 111 for(int n=0; n<10; n++)
akashvibhute 1:a1d998b362e9 112 {
akashvibhute 1:a1d998b362e9 113 wait(0.1);
akashvibhute 1:a1d998b362e9 114 acc_read();
akashvibhute 1:a1d998b362e9 115 acc_readings[3][0]+=x;
akashvibhute 1:a1d998b362e9 116 acc_readings[3][1]+=y;
akashvibhute 1:a1d998b362e9 117 acc_readings[3][2]+=z;
akashvibhute 1:a1d998b362e9 118 }
akashvibhute 1:a1d998b362e9 119 //display_acc();
akashvibhute 1:a1d998b362e9 120 pc.printf("\n");
akashvibhute 1:a1d998b362e9 121
akashvibhute 1:a1d998b362e9 122 pc.printf("Put IMU with +X pointing up, then press 'R' when ready \n");
akashvibhute 1:a1d998b362e9 123 while(pc.getc() != 'R') {}
akashvibhute 1:a1d998b362e9 124 wait(0.1);
akashvibhute 1:a1d998b362e9 125 for(int n=0; n<10; n++)
akashvibhute 1:a1d998b362e9 126 {
akashvibhute 1:a1d998b362e9 127 wait(0.1);
akashvibhute 1:a1d998b362e9 128 acc_read();
akashvibhute 1:a1d998b362e9 129 acc_readings[0][0]+=x;
akashvibhute 1:a1d998b362e9 130 acc_readings[0][1]+=y;
akashvibhute 1:a1d998b362e9 131 acc_readings[0][2]+=z;
akashvibhute 1:a1d998b362e9 132 }
akashvibhute 1:a1d998b362e9 133 //display_acc();
akashvibhute 1:a1d998b362e9 134 pc.printf("\n");
akashvibhute 1:a1d998b362e9 135
akashvibhute 1:a1d998b362e9 136 pc.printf("Put IMU with -X pointing up, then press 'R' when ready \n");
akashvibhute 1:a1d998b362e9 137 while(pc.getc() != 'R') {}
akashvibhute 1:a1d998b362e9 138 wait(0.1);
akashvibhute 1:a1d998b362e9 139 for(int n=0; n<10; n++)
akashvibhute 1:a1d998b362e9 140 {
akashvibhute 1:a1d998b362e9 141 wait(0.1);
akashvibhute 1:a1d998b362e9 142 acc_read();
akashvibhute 1:a1d998b362e9 143 acc_readings[1][0]+=x;
akashvibhute 1:a1d998b362e9 144 acc_readings[1][1]+=y;
akashvibhute 1:a1d998b362e9 145 acc_readings[1][2]+=z;
akashvibhute 1:a1d998b362e9 146 }
akashvibhute 1:a1d998b362e9 147 //display_acc();
akashvibhute 1:a1d998b362e9 148 pc.printf("\n");
akashvibhute 1:a1d998b362e9 149 }
akashvibhute 1:a1d998b362e9 150
akashvibhute 1:a1d998b362e9 151 calc_offsets[0] = (acc_readings[0][0] - acc_readings[1][0])/(10*2*acc_res_mg) - 256;
akashvibhute 1:a1d998b362e9 152 calc_offsets[1] = (acc_readings[2][1] - acc_readings[3][1])/(10*2*acc_res_mg) - 256;
akashvibhute 1:a1d998b362e9 153 calc_offsets[2] = (acc_readings[4][2] - acc_readings[5][2])/(10*2*acc_res_mg) - 256;
akashvibhute 1:a1d998b362e9 154
akashvibhute 1:a1d998b362e9 155 calc_offsets[0] = calc_offsets[0]/4; //convert to 8 bit scale 15.6 mg/LSB
akashvibhute 1:a1d998b362e9 156 calc_offsets[1] = calc_offsets[1]/4; //convert to 8 bit scale 15.6 mg/LSB
akashvibhute 1:a1d998b362e9 157 calc_offsets[2] = calc_offsets[2]/4; //convert to 8 bit scale 15.6 mg/LSB
akashvibhute 1:a1d998b362e9 158
akashvibhute 1:a1d998b362e9 159 pc.printf("Coarse calibration complete, offsets in 8bit scale (15.6mg/LSB) are: \t");
akashvibhute 1:a1d998b362e9 160 pc.printf("X: %.1f, Y: %.1f, Z: %.1f", calc_offsets[0], calc_offsets[1], calc_offsets[2]);
Tuxitheone 0:6b905abf1374 161
Tuxitheone 0:6b905abf1374 162
akashvibhute 1:a1d998b362e9 163 pc.printf("\n Apply offsets to ADXL345? Press Y to continue... \n");
akashvibhute 1:a1d998b362e9 164 while(pc.getc() != 'Y') {}
akashvibhute 1:a1d998b362e9 165 acc_store_offsets();
akashvibhute 1:a1d998b362e9 166 pc.printf("\n Done! ADXL 345 is now calibrated!!!\n\n New offsets are: \n");
akashvibhute 1:a1d998b362e9 167 pc.printf("X: %d \t",accelerometer.getOffset(0x00));
akashvibhute 1:a1d998b362e9 168 pc.printf("Y: %d \t",accelerometer.getOffset(0x01));
akashvibhute 1:a1d998b362e9 169 pc.printf("Z: %d \n",accelerometer.getOffset(0x02));
akashvibhute 1:a1d998b362e9 170 pc.printf("\n");
akashvibhute 1:a1d998b362e9 171 wait(1);
akashvibhute 1:a1d998b362e9 172
akashvibhute 1:a1d998b362e9 173
akashvibhute 1:a1d998b362e9 174 {
akashvibhute 1:a1d998b362e9 175 float mg_offsets_x[2]={0,0};
akashvibhute 1:a1d998b362e9 176 float mg_offsets_y[2]={0,0};
akashvibhute 1:a1d998b362e9 177 float mg_offsets_z[2]={0,0};
akashvibhute 1:a1d998b362e9 178
akashvibhute 1:a1d998b362e9 179 pc.printf("Ready for fine reading set,\n Put IMU with +Z pointing up, then press 'R' when ready \n");
akashvibhute 1:a1d998b362e9 180 while(pc.getc() != 'R') {}
akashvibhute 1:a1d998b362e9 181 wait(0.1);
akashvibhute 1:a1d998b362e9 182 for(int n=0; n<10; n++)
akashvibhute 1:a1d998b362e9 183 {
akashvibhute 1:a1d998b362e9 184 wait(0.1);
akashvibhute 1:a1d998b362e9 185 acc_read();
akashvibhute 1:a1d998b362e9 186 mg_offsets_z[0]+=z;
akashvibhute 1:a1d998b362e9 187 }
akashvibhute 1:a1d998b362e9 188 pc.printf("\n");
akashvibhute 1:a1d998b362e9 189
akashvibhute 1:a1d998b362e9 190 pc.printf("Put IMU with -Z pointing up, then press 'R' when ready \n");
akashvibhute 1:a1d998b362e9 191 while(pc.getc() != 'R') {}
akashvibhute 1:a1d998b362e9 192 wait(0.1);
akashvibhute 1:a1d998b362e9 193 for(int n=0; n<10; n++)
akashvibhute 1:a1d998b362e9 194 {
akashvibhute 1:a1d998b362e9 195 wait(0.1);
akashvibhute 1:a1d998b362e9 196 acc_read();
akashvibhute 1:a1d998b362e9 197 mg_offsets_z[1]+=z;
akashvibhute 1:a1d998b362e9 198 }
akashvibhute 1:a1d998b362e9 199 pc.printf("\n");
akashvibhute 1:a1d998b362e9 200
akashvibhute 1:a1d998b362e9 201 pc.printf("Put IMU with +Y pointing up, then press 'R' when ready \n");
akashvibhute 1:a1d998b362e9 202 while(pc.getc() != 'R') {}
akashvibhute 1:a1d998b362e9 203 wait(0.1);
akashvibhute 1:a1d998b362e9 204 for(int n=0; n<10; n++)
akashvibhute 1:a1d998b362e9 205 {
akashvibhute 1:a1d998b362e9 206 wait(0.1);
akashvibhute 1:a1d998b362e9 207 acc_read();
akashvibhute 1:a1d998b362e9 208 mg_offsets_y[0]+=y;
akashvibhute 1:a1d998b362e9 209 }
akashvibhute 1:a1d998b362e9 210 pc.printf("\n");
akashvibhute 1:a1d998b362e9 211
akashvibhute 1:a1d998b362e9 212 pc.printf("Put IMU with -Y pointing up, then press 'R' when ready \n");
akashvibhute 1:a1d998b362e9 213 while(pc.getc() != 'R') {}
akashvibhute 1:a1d998b362e9 214 wait(0.1);
akashvibhute 1:a1d998b362e9 215 for(int n=0; n<10; n++)
akashvibhute 1:a1d998b362e9 216 {
akashvibhute 1:a1d998b362e9 217 wait(0.1);
akashvibhute 1:a1d998b362e9 218 acc_read();
akashvibhute 1:a1d998b362e9 219 mg_offsets_y[1]+=y;
akashvibhute 1:a1d998b362e9 220 }
akashvibhute 1:a1d998b362e9 221 pc.printf("\n");
akashvibhute 1:a1d998b362e9 222
akashvibhute 1:a1d998b362e9 223 pc.printf("Put IMU with +X pointing up, then press 'R' when ready \n");
akashvibhute 1:a1d998b362e9 224 while(pc.getc() != 'R') {}
akashvibhute 1:a1d998b362e9 225 wait(0.1);
akashvibhute 1:a1d998b362e9 226 for(int n=0; n<10; n++)
akashvibhute 1:a1d998b362e9 227 {
akashvibhute 1:a1d998b362e9 228 wait(0.1);
akashvibhute 1:a1d998b362e9 229 acc_read();
akashvibhute 1:a1d998b362e9 230 mg_offsets_x[0]+=x;
akashvibhute 1:a1d998b362e9 231 }
akashvibhute 1:a1d998b362e9 232 pc.printf("\n");
akashvibhute 1:a1d998b362e9 233
akashvibhute 1:a1d998b362e9 234 pc.printf("Put IMU with -X pointing up, then press 'R' when ready \n");
akashvibhute 1:a1d998b362e9 235 while(pc.getc() != 'R') {}
akashvibhute 1:a1d998b362e9 236 wait(0.1);
akashvibhute 1:a1d998b362e9 237 for(int n=0; n<10; n++)
akashvibhute 1:a1d998b362e9 238 {
akashvibhute 1:a1d998b362e9 239 wait(0.1);
akashvibhute 1:a1d998b362e9 240 acc_read();
akashvibhute 1:a1d998b362e9 241 mg_offsets_x[1]+=x;
akashvibhute 1:a1d998b362e9 242 }
akashvibhute 1:a1d998b362e9 243 pc.printf("\n");
akashvibhute 1:a1d998b362e9 244
akashvibhute 1:a1d998b362e9 245 mg_offsets[0] = ((mg_offsets_x[0]/10 - 1000) + (1000 + mg_offsets_x[1]/10))/2;
akashvibhute 1:a1d998b362e9 246 mg_offsets[1] = ((mg_offsets_y[0]/10 - 1000) + (1000 + mg_offsets_y[1]/10))/2;
akashvibhute 1:a1d998b362e9 247 mg_offsets[2] = ((mg_offsets_z[0]/10 - 1000) + (1000 + mg_offsets_z[1]/10))/2;
akashvibhute 1:a1d998b362e9 248
akashvibhute 1:a1d998b362e9 249 pc.printf("Fine calibration complete, offsets in mg are: \t");
akashvibhute 1:a1d998b362e9 250 pc.printf("X: %f \t",mg_offsets[0]);
akashvibhute 1:a1d998b362e9 251 pc.printf("Y: %f \t",mg_offsets[1]);
akashvibhute 1:a1d998b362e9 252 pc.printf("Z: %f \n",mg_offsets[2]);
akashvibhute 1:a1d998b362e9 253 }
akashvibhute 1:a1d998b362e9 254
akashvibhute 1:a1d998b362e9 255 wait(5);
akashvibhute 1:a1d998b362e9 256
akashvibhute 1:a1d998b362e9 257 while(1)
akashvibhute 1:a1d998b362e9 258 {
akashvibhute 1:a1d998b362e9 259 wait(0.25);
akashvibhute 1:a1d998b362e9 260 pc.printf("\nCurrent IMU reading:\n");
akashvibhute 1:a1d998b362e9 261 acc_read();
akashvibhute 1:a1d998b362e9 262 display_fine_acc();
akashvibhute 1:a1d998b362e9 263 }
akashvibhute 1:a1d998b362e9 264 }
Tuxitheone 0:6b905abf1374 265
akashvibhute 1:a1d998b362e9 266 void acc_read()
akashvibhute 1:a1d998b362e9 267 {
akashvibhute 1:a1d998b362e9 268 accelerometer.getOutput(readings);
akashvibhute 1:a1d998b362e9 269
akashvibhute 1:a1d998b362e9 270 x=(int16_t)readings[0] * acc_res_mg;
akashvibhute 1:a1d998b362e9 271 y=(int16_t)readings[1] * acc_res_mg;
akashvibhute 1:a1d998b362e9 272 z=(int16_t)readings[2] * acc_res_mg;
akashvibhute 1:a1d998b362e9 273
akashvibhute 1:a1d998b362e9 274 mag_g = sqrt(pow(x,2)+pow(y,2)+pow(z,2));
akashvibhute 1:a1d998b362e9 275 mag_lsb = mag_g/acc_res_mg;
akashvibhute 1:a1d998b362e9 276 }
akashvibhute 1:a1d998b362e9 277
akashvibhute 1:a1d998b362e9 278 void display_acc()
akashvibhute 1:a1d998b362e9 279 {
akashvibhute 1:a1d998b362e9 280 pc.printf("Raw: %i, %i, %i : %.1f\n", (int16_t)readings[0], (int16_t)readings[1], (int16_t)readings[2], mag_lsb); //Raw data
akashvibhute 1:a1d998b362e9 281 pc.printf("mG's: %.3f, %.3f, %.3f : %.4f\n", x, y, z, mag_g); //In G's data
akashvibhute 1:a1d998b362e9 282 }
akashvibhute 1:a1d998b362e9 283
akashvibhute 1:a1d998b362e9 284 void display_fine_acc()
akashvibhute 1:a1d998b362e9 285 {
akashvibhute 1:a1d998b362e9 286 x -= mg_offsets[0];
akashvibhute 1:a1d998b362e9 287 y -= mg_offsets[1];
akashvibhute 1:a1d998b362e9 288 z -= mg_offsets[2];
akashvibhute 1:a1d998b362e9 289
akashvibhute 1:a1d998b362e9 290 readings[0] -= (int16_t) (mg_offsets[0]/acc_res_mg);
akashvibhute 1:a1d998b362e9 291 readings[1] -= (int16_t) (mg_offsets[1]/acc_res_mg);
akashvibhute 1:a1d998b362e9 292 readings[2] -= (int16_t) (mg_offsets[2]/acc_res_mg);
akashvibhute 1:a1d998b362e9 293
akashvibhute 1:a1d998b362e9 294 mag_g = sqrt(pow(x,2)+pow(y,2)+pow(z,2));
akashvibhute 1:a1d998b362e9 295 mag_lsb = mag_g/acc_res_mg;
akashvibhute 1:a1d998b362e9 296
akashvibhute 1:a1d998b362e9 297 pc.printf("Raw: %i, %i, %i : %.1f\n", (int16_t)readings[0], (int16_t)readings[1], (int16_t)readings[2], mag_lsb); //Raw data
akashvibhute 1:a1d998b362e9 298 pc.printf("mG's: %.3f, %.3f, %.3f : %.4f\n", x, y, z, mag_g); //In G's data
akashvibhute 1:a1d998b362e9 299 pc.printf("Fine offset in mG's: %.3f, %.3f, %.3f\n", mg_offsets[0], mg_offsets[1], mg_offsets[2]); //In G's data
akashvibhute 1:a1d998b362e9 300 }
Tuxitheone 0:6b905abf1374 301
akashvibhute 1:a1d998b362e9 302 void acc_store_offsets()
akashvibhute 1:a1d998b362e9 303 {
akashvibhute 1:a1d998b362e9 304 for(int v=0; v<=2; v++)
akashvibhute 1:a1d998b362e9 305 {
akashvibhute 1:a1d998b362e9 306 offset2_8bit_int[v] = (int8_t) calc_offsets[v];
akashvibhute 1:a1d998b362e9 307 if(abs(calc_offsets[v] - offset2_8bit_int[v]) >= 0.5)
akashvibhute 1:a1d998b362e9 308 offset2_8bit_int[v] += (int8_t) sign(calc_offsets[v]);
akashvibhute 1:a1d998b362e9 309
akashvibhute 1:a1d998b362e9 310 offset2_8bit_int[v] = ~offset2_8bit_int[v];
akashvibhute 1:a1d998b362e9 311 offset2_8bit_int[v] += 1;
akashvibhute 1:a1d998b362e9 312
akashvibhute 1:a1d998b362e9 313 offset2_8bit_char[v] = offset2_8bit_int[v];
Tuxitheone 0:6b905abf1374 314 }
akashvibhute 1:a1d998b362e9 315
akashvibhute 1:a1d998b362e9 316 //Go into standby mode to configure the device.
akashvibhute 1:a1d998b362e9 317 accelerometer.setPowerControl(0x00);
akashvibhute 1:a1d998b362e9 318
akashvibhute 1:a1d998b362e9 319 accelerometer.setOffset(0x00, offset2_8bit_char[0]);
akashvibhute 1:a1d998b362e9 320 wait(0.1); //wait a bit
akashvibhute 1:a1d998b362e9 321
akashvibhute 1:a1d998b362e9 322 accelerometer.setOffset(0x01, offset2_8bit_char[1]);
akashvibhute 1:a1d998b362e9 323 wait(0.1); //wait a bit
akashvibhute 1:a1d998b362e9 324
akashvibhute 1:a1d998b362e9 325 accelerometer.setOffset(0x02, offset2_8bit_char[2]);
akashvibhute 1:a1d998b362e9 326 wait(0.1); //wait a bit
akashvibhute 1:a1d998b362e9 327
akashvibhute 1:a1d998b362e9 328 //Measurement mode.
akashvibhute 1:a1d998b362e9 329 accelerometer.setPowerControl(0x08);
akashvibhute 1:a1d998b362e9 330 }
Tuxitheone 0:6b905abf1374 331
akashvibhute 1:a1d998b362e9 332 int sign(float input)
akashvibhute 1:a1d998b362e9 333 {
akashvibhute 1:a1d998b362e9 334 if (input<0)
akashvibhute 1:a1d998b362e9 335 return -1;
akashvibhute 1:a1d998b362e9 336 else if(input>0)
akashvibhute 1:a1d998b362e9 337 return 1;
akashvibhute 1:a1d998b362e9 338 else
akashvibhute 1:a1d998b362e9 339 return 0;
akashvibhute 1:a1d998b362e9 340 }