23 #define MPU6050_W 0xd0
24 #define MPU6050_R 0xd1
28 static volatile uint8_t Asa[] = {0, 0, 0};
30 static volatile float omega_vec[] = {0.0, 0.0, 0.0};
31 static volatile float acc_vec[] = {0.0, 0.0, 0.0};
32 static volatile float mag_vec[] = {0.0, 0.0, 0.0};
33 static volatile float temperature = 0.0;
35 static volatile float omega_LPF_vec[] = {0.0, 0.0, 0.0};
36 static volatile float acc_LPF_vec[] = {0.0, 0.0, 0.0};
37 static volatile float mag_LPF_vec[] = {0.0, 0.0, 0.0};
39 static volatile float omega_str_LPF_vec[] = {0.0, 0.0, 0.0};
40 static volatile float acc_str_LPF_vec[] = {0.0, 0.0, 0.0};
41 static volatile float mag_str_LPF_vec[] = {0.0, 0.0, 0.0};
43 static volatile float omega_ref_vec[] = {0.0,0.0,0.0};
117 for(i = 0;i < 3;i ++)
166 acc_temp[0] = (~acc_temp[0]) + 1;
167 acc_temp[1] = (~acc_temp[1]) + 1;
168 acc_temp[2] = (~acc_temp[2]) + 1;
171 dest_array[0] = 0x00ff & acc_temp[0];
172 dest_array[1] = (0xff00 & acc_temp[0])>>8;
173 dest_array[2] = 0x00ff & acc_temp[1];
174 dest_array[3] = (0xff00 & acc_temp[1])>>8;
175 dest_array[4] = 0x00ff & acc_temp[2];
176 dest_array[5] = (0xff00 & acc_temp[2])>>8;
188 for ( i = 0; i <
BUFSIZE; i++ )
195 acc[0] = dest_array[0] + (dest_array[1]<<8);
196 if(acc[0] >= 32767) acc[0] -= 65536;
197 acc_vec[0] = ((float)acc[0])/2048.0;
199 acc[1] = dest_array[2] + (dest_array[3]<<8);
200 if(acc[1] >= 32767) acc[1] -= 65536;
201 acc_vec[1] = ((float)acc[1])/2048.0;
203 acc[2] = dest_array[4] + (dest_array[5]<<8);
204 if(acc[2] >= 32767) acc[2] -= 65536;
205 acc_vec[2] = ((float)acc[2])/2048.0;
207 omega[0] = dest_array[8] + (dest_array[9]<<8);
208 if(omega[0] >= 32767) omega[0] -= 65536;
209 omega_vec[0] =
DEG2RAD( ((omega[0]) - (
int32_t)(omega_ref_vec[0] + 0.5 ) )/16.4 );
211 omega[1] = dest_array[10] + (dest_array[11]<<8);
212 if(omega[1] >= 32767) omega[1] -= 65536;
213 omega_vec[1] =
DEG2RAD( ((omega[1]) - (
int32_t)(omega_ref_vec[1] + 0.5 ) )/16.4 );
215 omega[2] = dest_array[12] + (dest_array[13]<<8);
216 if(omega[2] >= 32767) omega[2] -= 65536;
217 omega_vec[2] =
DEG2RAD( ((omega[2]) - (
int32_t)(omega_ref_vec[2] + 0.5 ) )/16.4 );
219 temp_ = dest_array[6] + (dest_array[7]<<8);
220 if(temp_ >= 32767) temp_ -= 65536;
221 temperature = (float)temp_/340.0 + 35.0;
229 omega_LPF_vec[0] =
gain_LPF * omega_LPF_vec[0] + (1.0-
gain_LPF) * omega_vec[0];
230 omega_LPF_vec[1] =
gain_LPF * omega_LPF_vec[1] + (1.0-
gain_LPF) * omega_vec[1];
231 omega_LPF_vec[2] =
gain_LPF * omega_LPF_vec[2] + (1.0-
gain_LPF) * omega_vec[2];
275 for ( i = 0; i < 3; i++ )
281 dest_array[0] = (
uint8_t)Mag[1];
282 dest_array[1] = (
uint8_t)(Mag[1]>>8);
284 dest_array[2] = (
uint8_t)Mag[0];
285 dest_array[3] = (
uint8_t)(Mag[0]>>8);
287 Mag[2] = (~Mag[2]) + 1;
288 dest_array[4] = (
uint8_t)Mag[2];
289 dest_array[5] = (
uint8_t)(Mag[2]>>8);
298 for ( i = 0; i <
BUFSIZE; i++ )
306 mag[i] = dest_array[i] + (dest_array[i+1]<<8);
307 if(mag[i] >= 32767) mag[i] -= 65535;
308 mag_vec[i] = (float)mag[i]*0.3;
322 for(i=0;i<3;i++) vec[i] = omega_vec[i];
334 for(i=0;i<3;i++) vec[i] = mag_vec[i];
346 for(i=0;i<3;i++) vec[i] = acc_vec[i];
370 #define NUM_REF (100)
376 float omega_x_sum = 0.0;
377 float omega_y_sum = 0.0;
378 float omega_z_sum = 0.0;
382 omega_ref_vec[i] = 0.0;
388 omega_x[i] = data_array[8] + (data_array[9]<<8);
389 if(omega_x[i] >= 32767) omega_x[i] -= 65536;
391 omega_y[i] = data_array[10] + (data_array[11]<<8);
392 if(omega_y[i] >= 32767) omega_y[i] -= 65536;
394 omega_z[i] = data_array[12] + (data_array[13]<<8);
395 if(omega_z[i] >= 32767) omega_z[i] -= 65536;
402 for(i=NUM_REF/4;i<(NUM_REF*3/4 +1) ;i++)
404 omega_x_sum += (float)(omega_x[i]);
405 omega_y_sum += (float)(omega_y[i]);
406 omega_z_sum += (float)(omega_z[i]);
408 omega_ref_vec[0] = omega_x_sum/(float)NUM_REF *2.0;
409 omega_ref_vec[1] = omega_y_sum/(float)NUM_REF *2.0;
410 omega_ref_vec[2] = omega_z_sum/(float)NUM_REF *2.0;
423 for(i=0;i<3;i++) vec[i] = omega_LPF_vec[i];
435 for(i=0;i<3;i++) vec[i] = mag_LPF_vec[i];
448 for(i=0;i<3;i++) vec[i] = acc_LPF_vec[i];
460 for(i=0;i<3;i++) vec[i] = omega_LPF_vec[i];
472 for(i=0;i<3;i++) vec[i] = mag_LPF_vec[i];
484 for(i=0;i<3;i++) vec[i] = acc_LPF_vec[i];
496 for(i=0;i<3;i++) vec[i] = omega_ref_vec[i];
507 omega_ref_vec[0] = ref_x;
518 omega_ref_vec[1] = ref_y;
529 omega_ref_vec[2] = ref_z;
541 myPrintfUART(
"acc : %f, %f, %f (x,y,z)[rad] \n",acc_vec[0], acc_vec[1],acc_vec[2]);
542 myPrintfUART(
"omega: %f, %f, %f (x,y,z) [1G] \n",omega_vec[0], omega_vec[1],omega_vec[2]);
543 myPrintfUART(
"mag : %f, %f, %f (x,y,z) [uT] \n",mag_vec[0], mag_vec[1],mag_vec[2]);
volatile uint32_t I2CReadLength
void getMagStrLPF(float *vec)
void getDataFromMPU6050(uint8_t *dest_array)
int myPrintfUART(const char *fmt,...)
volatile uint8_t I2CSlaveBuffer[BUFSIZE]
void setOmegaRef_z(float ref_z)
void getAccLPF(float *vec)
void getAccStrLPF(float *vec)
void getMagLPF(float *vec)
void quickSort(int numbers[], int left, int right)
void getOmegaLPF(float *vec)
void setOmegaRef_y(float ref_y)
void wait1usec(uint32_t wait_count)
void getDataFromAK8975(uint8_t *dest_array)
volatile uint32_t I2CWriteLength
void getOmegaStrLPF(float *vec)
unsigned short int uint16_t
void getOmega(float *vec)
volatile uint8_t I2CMasterBuffer[BUFSIZE]
volatile float gain_str_LPF
void getTemp(float *temp)
void setOmegaRef_x(float ref_x)
float getOmegaRef(float *vec)