RT-USB-9AXIS-00
mpu9250.c
[詳解]
1 
14 //#define VER_1_0_COMPATIBLE_MPU9150_MAG
15 //#define VER_1_0_COMPATIBLE_MPU9150_TEMP
16 
17 #include "type.h"
18 #include "mpu9250.h"
19 #include "i2c.h"
20 #include "uart.h"
21 #include "SystemTickTimer.h"
22 #include "MainFunction.h"
23 #include "TinyMathFunction.h"
24 #include "debug.h"
25 #include "EEPROM_24LC16BT_I.h"
26 
27 
28 //i2cの操作に必要なもの達のextern宣言. 実体はi2c.cにある
29 extern volatile uint8_t I2CMasterBuffer[BUFSIZE];
30 extern volatile uint8_t I2CSlaveBuffer[BUFSIZE];
31 extern volatile uint32_t I2CReadLength, I2CWriteLength;
32 
33 //MPU9250のi2cのアドレス
34 #define MPU9250_W 0xd0
35 #define MPU9250_R 0xd1
36 #define AK8963_W 0x18
37 #define AK8963_R 0x19
38 
39 static volatile float omega_vec[3] = {0.0, 0.0, 0.0}; //角速度ベクトル (x,y,z)[rad]
40 static volatile float acc_vec[3] = {0.0, 0.0, 0.0}; //加速度ベクトル (x,y,z) [1G]
41 static volatile float mag_vec[3] = {0.0, 0.0, 0.0}; //地磁気ベクトル (x,y,z) [uT]
42 static volatile float temperature = 0.0; //MPU9250の温度[°C]
43 
44 static volatile int16_t omega_vec_int[3] = {0, 0, 0}; //16bit整数 角速度ベクトル (x,y,z)
45 static volatile int16_t acc_vec_int[3] = {0, 0, 0}; //16bit整数 加速度ベクトル (x,y,z)
46 static volatile int16_t mag_vec_int[3] = {0, 0, 0}; //16bit整数 地磁気ベクトル (x,y,z)
47 static volatile int16_t temperature_int = 0; //16bit整数 温度
48 
49 static volatile int16_t omega_vec_raw_int[3] = {0, 0, 0}; //16bit整数 角速度ベクトル生データ (x,y,z)
50 static volatile int16_t acc_vec_raw_int[3] = {0, 0, 0}; //16bit整数 加速度ベクトル生データ (x,y,z)
51 static volatile int16_t mag_vec_raw_int[3] = {0, 0, 0}; //16bit整数 地磁気ベクトル生データ (x,y,z)
52 static volatile int16_t temperature_raw_int = 0; //16bit整数値 温度生データ
53 
54 static volatile uint8_t mpu9250ArrayData[14];
55 static volatile uint8_t ak8963ArrayData[6];
56 
57 static volatile uint8_t Asa[3] = {128, 128, 128}; //AK8963の感度補正データ格納用(感度補正データは工場出荷時にICに書き込まれている)
58 static volatile int16_t omega_offset_vec[3] = {0,0,0}; //ジャイロのオフセット
59 static volatile int16_t acc_offset_vec[3] = {0,0,0}; //加速度のオフセット
60 static volatile int16_t mag_offset_vec[3] = {0,0,0}; //地磁気のオフセット
61 
62 int16_t concatenate2Byte_int(uint8_t H_byte, uint8_t L_byte);
63 
72 void initMPU9250 (void)
73 {
74 
75  I2CWriteLength = 3;
76  I2CReadLength = 0;
77  I2CMasterBuffer[0] = MPU9250_W;
78  I2CMasterBuffer[1] = 0x6B; //Address start MPU9250
79  I2CMasterBuffer[2] = 0x00;
80  I2CEngine();
81 
82  wait1msec(10);
83 
84  I2CWriteLength = 3;
85  I2CReadLength = 0;
86  I2CMasterBuffer[0] = MPU9250_W;
87  I2CMasterBuffer[1] = 0x37; //INT Pin / Bypass Enable Configuration
88  I2CMasterBuffer[2] = 0x02;
89  I2CEngine();
90 
91  wait1msec(10);
92 
93  I2CWriteLength = 3;
94  I2CReadLength = 0;
95  I2CMasterBuffer[0] = MPU9250_W;
96  I2CMasterBuffer[1] = 0x1A; //Address digital low pass filter
97  I2CMasterBuffer[2] = 0x02; //gyro low pass filter 92Hz
98  I2CEngine();
99 
100  wait1msec(10);
101 
102  I2CWriteLength = 3;
103  I2CReadLength = 0;
104  I2CMasterBuffer[0] = MPU9250_W;
105  I2CMasterBuffer[1] = 0x1B;
106  I2CMasterBuffer[2] = 0x18; //2000deg/s
107  I2CEngine();
108 
109  wait1msec(10);
110 
111  I2CWriteLength = 3;
112  I2CReadLength = 0;
113  I2CMasterBuffer[0] = MPU9250_W;
114  I2CMasterBuffer[1] = 0x1C;
115  I2CMasterBuffer[2] = 0x18; //16g
116  I2CEngine();
117 
118  wait1msec(10);
119 
120  I2CWriteLength = 3;
121  I2CReadLength = 0;
122  I2CMasterBuffer[0] = MPU9250_W;
123  I2CMasterBuffer[1] = 0x1D;
124  I2CMasterBuffer[2] = 0x02; //acc low pass filtter 92Hz
125  I2CEngine();
126 
127  wait1msec(10);
128 }
129 
136 void initAK8963 (void)
137 {
138  volatile uint32_t i;
139 
140  I2CWriteLength = 3;
141  I2CReadLength = 0;
142  I2CMasterBuffer[0] = AK8963_W;
143  I2CMasterBuffer[1] = 0x0a; //フューズROMアクセスモードに移行
144  I2CMasterBuffer[2] = 0x0f; //
145  I2CEngine();
146 
147  wait1msec(10);
148 
149  I2CWriteLength = 2;
150  I2CReadLength = 3;
151  I2CMasterBuffer[0] = AK8963_W;
152  I2CMasterBuffer[1] = 0x10; //Address 3byte (adjust MagXYZ)
153  I2CMasterBuffer[2] = AK8963_R;
154  I2CEngine();
155 
156  for(i = 0;i < 3;i ++)
157  {
158  Asa[i] = I2CSlaveBuffer[i];
159  }
160  wait1msec(10);
161 
162  I2CWriteLength = 3;
163  I2CReadLength = 0;
164  I2CMasterBuffer[0] = AK8963_W;
165  I2CMasterBuffer[1] = 0x0a;
166  I2CMasterBuffer[2] = 0x00; //パワーダウンモードに変更
167  I2CEngine();
168 
169  wait1msec(100);
170 
171  I2CWriteLength = 3;
172  I2CReadLength = 0;
173  I2CMasterBuffer[0] = AK8963_W;
174  I2CMasterBuffer[1] = 0x0a;
175  I2CMasterBuffer[2] = 0x10; //地磁気センサの分解能を16bitに変更
176  I2CEngine();
177 
178  wait1msec(10);
179 }
180 
195 void updateMPU9250Data (void)
196 {
197  volatile uint32_t i;
198  volatile uint16_t acc_temp[3]; //加速度の値計算の中間値
199  volatile uint8_t raw_array[14];
200  volatile float temperature_temp;
201 
202 
203  I2CWriteLength = 2;
204  I2CReadLength = 14;
205  I2CMasterBuffer[0] = MPU9250_W;
206  I2CMasterBuffer[1] = 0x3B; //Address 14byte (AccXYZ + GyroXYZ + temp)
207  I2CMasterBuffer[2] = MPU9250_R;
208  I2CEngine();
209 
210  acc_temp[0] = (I2CSlaveBuffer[0]<<8) + I2CSlaveBuffer[1];
211  acc_temp[1] = (I2CSlaveBuffer[2]<<8) + I2CSlaveBuffer[3];
212  acc_temp[2] = (I2CSlaveBuffer[4]<<8) + I2CSlaveBuffer[5];
213 
214  acc_temp[0] = (~acc_temp[0]) + 1;
215  acc_temp[1] = (~acc_temp[1]) + 1;
216  acc_temp[2] = (~acc_temp[2]) + 1;
217 
218  //Acc
219  raw_array[0] = 0x00ff & acc_temp[0];
220  raw_array[1] = (0xff00 & acc_temp[0])>>8;
221  raw_array[2] = 0x00ff & acc_temp[1];
222  raw_array[3] = (0xff00 & acc_temp[1])>>8;
223  raw_array[4] = 0x00ff & acc_temp[2];
224  raw_array[5] = (0xff00 & acc_temp[2])>>8;
225  //temparature
226  raw_array[6] = I2CSlaveBuffer[7];
227  raw_array[7] = I2CSlaveBuffer[6];
228  //gyro
229  raw_array[8] = I2CSlaveBuffer[9];
230  raw_array[9] = I2CSlaveBuffer[8];
231  raw_array[10] = I2CSlaveBuffer[11];
232  raw_array[11] = I2CSlaveBuffer[10];
233  raw_array[12] = I2CSlaveBuffer[13];
234  raw_array[13] = I2CSlaveBuffer[12];
235 
236  for ( i = 0; i < BUFSIZE; i++ ) //clear I2CSlaveBuffer
237  {
238  I2CSlaveBuffer[i] = 0x00;
239  }
240 
241  //センサ値を物理量に変換
242  for(i=0;i<3;i++)
243  {
244  //acc
245  acc_vec_raw_int[i] = concatenate2Byte_int(raw_array[2*i+1],raw_array[2*i]);
246  acc_vec_int[i] = acc_vec_raw_int[i] - acc_offset_vec[i];
247  acc_vec[i] = (((float)acc_vec_int[i]))/2048.0;
248  //gyro
249  omega_vec_raw_int[i] = concatenate2Byte_int(raw_array[2*i+1+8],raw_array[2*i+8]);
250  omega_vec_int[i] = omega_vec_raw_int[i] - omega_offset_vec[i];
251  omega_vec[i] = DEG2RAD(( ((float)omega_vec_int[i]))/16.4);
252  }
253 
254  //mpu9150と地磁気の出力の互換性を持たせる場合の記述
255  #ifdef VER_1_0_COMPATIBLE_MPU9150_TEMP
256  temperature_raw_int = concatenate2Byte_int( raw_array[7],raw_array[6]);
257  temperature_temp = 340.0*((float)(temperature_raw_int)/333.87-14.0);
258  temperature_int = (int16_t)(temperature_temp);
259  temperature = ((float)temperature_int)/340.0 + 35.0;
260  #else
261  temperature_raw_int = concatenate2Byte_int( raw_array[7],raw_array[6]);
262  temperature_int = temperature_raw_int;
263  temperature = ((float)temperature_int)/333.87 + 21.0;
264  #endif
265 
266  for(i=0;i<3;i++){
267  mpu9250ArrayData[2*i] = (0x00ff & acc_vec_int[i]);
268  mpu9250ArrayData[2*i+1] = (0xff00 & acc_vec_int[i])>>8;
269 
270  mpu9250ArrayData[2*i+8] = (0x00ff & omega_vec_int[i]);
271  mpu9250ArrayData[2*i+1+8] = (0xff00 & omega_vec_int[i])>>8;
272  }
273  mpu9250ArrayData[6] = (0x00ff & temperature_int);
274  mpu9250ArrayData[7] = (0xff00 & temperature_int)>>8;
275 }
276 
286 {
287  volatile uint32_t i;
288  volatile int16_t mag_temp[3];
289  volatile uint8_t raw_array[6];
290 
291  I2CWriteLength = 2;
292  I2CReadLength = 6;
293  I2CMasterBuffer[0] = AK8963_W;
294  I2CMasterBuffer[1] = 0x03; //Address 6byte (MagXYZ)
295  I2CMasterBuffer[2] = AK8963_R;
296  I2CEngine();
297 
298  for ( i = 0; i < 3; i++ )
299  {
300  mag_temp[i] = concatenate2Byte_int(I2CSlaveBuffer[2*i+1],I2CSlaveBuffer[2*i]);
301  mag_temp[i] = (mag_temp[i]*(Asa[i]+128))/256;
302  }
303 
304  raw_array[0] = 0x00ff & mag_temp[1];
305  raw_array[1] = (0xff00 & mag_temp[1])>>8;
306 
307  raw_array[2] = 0x00ff & mag_temp[0];
308  raw_array[3] = (0xff00 & mag_temp[0])>>8;
309 
310  mag_temp[2] = (~mag_temp[2]) + 1; //地磁気センサのZ軸の取り方を下向きから上向きに変更
311  raw_array[4] = 0x00ff & mag_temp[2];
312  raw_array[5] = (0xff00 & mag_temp[2])>>8;
313 
314  I2CWriteLength = 3;
315  I2CReadLength = 0;
316  I2CMasterBuffer[0] = AK8963_W;
317  I2CMasterBuffer[1] = 0x0A; //Address start MagXYZ ADC (need 7.2ms)
318  I2CMasterBuffer[2] = 0x11;
319  I2CEngine();
320 
321  for ( i = 0; i < BUFSIZE; i++ ) //clear I2CSlaveBuffer
322  {
323  I2CSlaveBuffer[i] = 0x00;
324  }
325 
326  //センサ値を地磁気ベクトルに変換
327  for( i=0;i<3;i++)
328  {
329  mag_vec_raw_int[i] = concatenate2Byte_int(raw_array[2*i+1],raw_array[2*i]);
330  //mpu9150と地磁気の出力の互換性を持たせる場合の記述
331  #ifdef VER_1_0_COMPATIBLE_MPU9150_MAG
332  mag_vec_int[i] = (mag_vec_int[i] - mag_offset_vec[i] )/2;
333  mag_vec[i] = ((float)mag_vec_int[i])*0.3;
334  //mpu9250での記述
335  #else
336  mag_vec_raw_int[i] = concatenate2Byte_int(raw_array[2*i+1],raw_array[2*i]);
337  mag_vec_int[i] = mag_vec_raw_int[i] - mag_offset_vec[i];
338  mag_vec[i] = ((float)mag_vec_int[i])*0.15;
339  #endif
340  }
341 
342  for(i=0;i<3;i++){
343  ak8963ArrayData[2*i] = (0x00ff & mag_vec_int[i]);
344  ak8963ArrayData[2*i+1] = (0xff00 & mag_vec_int[i])>>8;
345  }
346 }
347 
370 void getDataFromMPU9250(uint8_t *dest_array)
371 {
372  volatile uint32_t i;
373  for(i=0;i<14;i++)
374  {
375  dest_array[i] = mpu9250ArrayData[i];
376  }
377 }
378 
393 void getDataFromAK8963(uint8_t *dest_array)
394 {
395  volatile uint32_t i;
396  for(i=0;i<6;i++)
397  {
398  dest_array[i] = ak8963ArrayData[i];
399  }
400 }
401 
409 void whoAmI(void)
410 {
411  uint16_t i;
413  while(1)
414  {
415  myPrintfUSB("//////////////// \n");
416 
417  I2CWriteLength = 2;
418  I2CReadLength = 1;
419  I2CMasterBuffer[0] = AK8963_W;
420  I2CMasterBuffer[1] = 0x00; //Address 3byte (adjust MagXYZ)
421  I2CMasterBuffer[2] = AK8963_R;
422  I2CEngine();
423 
424  myPrintfUSB("Who Am I AK8963 : %d \n", I2CSlaveBuffer[0]);
425 
426  for ( i = 0; i < BUFSIZE; i++ ) //clear I2CSlaveBuffer
427  {
428  I2CSlaveBuffer[i] = 0x00;
429  }
430 
431  wait1msec(1000);
432  myPrintfUSB("//////////////// \n");
433 
434  I2CWriteLength = 2;
435  I2CReadLength = 1;
436  I2CMasterBuffer[0] = MPU9250_W;
437  I2CMasterBuffer[1] = 0x75; //Address 3byte (adjust MagXYZ)
438  I2CMasterBuffer[2] = MPU9250_R;
439  I2CEngine();
440 
441  myPrintfUSB("Who Am I MPU9250 : %d \n", I2CSlaveBuffer[0]);
442 
443  for ( i = 0; i < BUFSIZE; i++ ) //clear I2CSlaveBuffer
444  {
445  I2CSlaveBuffer[i] = 0x00;
446  }
447 
448  wait1msec(1000);
449  }
450 }
451 
457 void getOmega(float *vec)
458 {
459  uint8_t i;
460  for(i=0;i<3;i++) vec[i] = omega_vec[i];
461 };
462 
469 void getMag(float *vec)
470 {
471  uint8_t i;
472  for(i=0;i<3;i++) vec[i] = mag_vec[i];
473 };
474 
481 void getAcc(float *vec)
482 {
483  uint8_t i;
484  for(i=0;i<3;i++) vec[i] = acc_vec[i];
485 };
486 
493 void getTemp(float *temp)
494 {
495  *temp = temperature;
496 }
497 
503 void getOmegaOffset(int16_t *offset_vec)
504 {
505  uint8_t i;
506  for(i=0;i<3;i++) offset_vec[i] = omega_offset_vec[i];
507 }
508 
514 void getAccOffset(int16_t *offset_vec)
515 {
516  uint8_t i;
517  for(i=0;i<3;i++) offset_vec[i] = acc_offset_vec[i];
518 }
519 
525 void getMagOffset(int16_t *offset_vec)
526 {
527  uint8_t i;
528  for(i=0;i<3;i++) offset_vec[i] = mag_offset_vec[i];
529 }
530 
536 void setOmegaOffset(int16_t *offset_vec)
537 {
538  uint8_t i;
539  for(i=0;i<3;i++) omega_offset_vec[i] = offset_vec[i];
540 }
541 
547 void setAccOffset(int16_t *offset_vec)
548 {
549  uint8_t i;
550  for(i=0;i<3;i++) acc_offset_vec[i] = offset_vec[i];
551 }
552 
558 void setMagOffset(int16_t *offset_vec)
559 {
560  uint8_t i;
561  for(i=0;i<3;i++) mag_offset_vec[i] = offset_vec[i];
562 }
563 
569 void setOmegaOffset_x(int16_t offset_x)
570 {
571  omega_offset_vec[0] = offset_x;
572 }
573 
579 void setOmegaOffset_y(int16_t offset_y)
580 {
581  omega_offset_vec[1] = offset_y;
582 }
583 
589 void setOmegaOffset_z(int16_t offset_z)
590 {
591  omega_offset_vec[2] = offset_z;
592 }
593 
599 void setAccOffset_x(int16_t offset_x)
600 {
601  acc_offset_vec[0] = offset_x;
602 }
603 
609 void setAccOffset_y(int16_t offset_y)
610 {
611  acc_offset_vec[1] = offset_y;
612 }
613 
619 void setAccOffset_z(int16_t offset_z)
620 {
621  acc_offset_vec[2] = offset_z;
622 }
623 
629 void setMagOffset_x(int16_t offset_x)
630 {
631  mag_offset_vec[0] = offset_x;
632 }
633 
639 void setMagOffset_y(int16_t offset_y)
640 {
641  mag_offset_vec[1] = offset_y;
642 }
643 
649 void setMagOffset_z(int16_t offset_z)
650 {
651  mag_offset_vec[2] = offset_z;
652 }
653 
659 void getAsa(int16_t *vec)
660 {
661  uint8_t i;
662  for(i=0;i<3;i++) vec[i] = Asa[i];
663 }
664 
670 void getOmegaInt(int16_t *vec)
671 {
672  uint8_t i;
673  for(i=0;i<3;i++) vec[i] = omega_vec_int[i];
674 }
675 
681 void getACCInt(int16_t *vec)
682 {
683  uint8_t i;
684  for(i=0;i<3;i++) vec[i] = acc_vec_int[i];
685 }
686 
692 void getMagInt(int16_t *vec)
693 {
694  uint8_t i;
695  for(i=0;i<3;i++) vec[i] = mag_vec_int[i];
696 }
697 
703 void getTempInt(int16_t *temp)
704 {
705  *temp = temperature_int;
706 }
707 
713 void getRawOmegaInt(int16_t *vec)
714 {
715  uint8_t i;
716  for(i=0;i<3;i++) vec[i] = omega_vec_raw_int[i];
717 }
718 
724 void getRawAccInt(int16_t *vec)
725 {
726  uint8_t i;
727  for(i=0;i<3;i++) vec[i] = omega_vec_raw_int[i];
728 }
729 
735 void getRawMagInt(int16_t *vec)
736 {
737  uint8_t i;
738  for(i=0;i<3;i++) vec[i] = mag_vec_raw_int[i];
739 }
740 
746 void getRawTempInt(int16_t *temp)
747 {
748  *temp = temperature_raw_int;
749 };
750 
751 
760 void calibOmegaOffset(int16_t *offset_vec)
761 {
762  uint32_t i = 0;
763  #define NUM_REF_OMEGA (400)
764 
765  int32_t omega_x[NUM_REF_OMEGA];
766  int32_t omega_y[NUM_REF_OMEGA];
767  int32_t omega_z[NUM_REF_OMEGA];
768 
769  float omega_x_sum = 0.0;
770  float omega_y_sum = 0.0;
771  float omega_z_sum = 0.0;
772 
773  for(i=0;i<3;i++)
774  {
775  omega_offset_vec[i] = 0;
776  }
777 
778  for(i=0;i<NUM_REF_OMEGA;i++)
779  {
781  omega_x[i] = omega_vec_raw_int[0];
782  omega_y[i] = omega_vec_raw_int[1];
783  omega_z[i] = omega_vec_raw_int[2];
784  wait1msec(10);
785  myPrintfUSB("%d| calibrating... %d, %d, %d\n",i,omega_x [i],omega_y[i],omega_z[i] );
786  }
787  quickSort(omega_x,0 ,NUM_REF_OMEGA -1);
788  quickSort(omega_y,0 ,NUM_REF_OMEGA -1);
789  quickSort(omega_z,0 ,NUM_REF_OMEGA -1);
790 
791  for(i=NUM_REF_OMEGA/4;i<(NUM_REF_OMEGA*3/4 +1) ;i++)
792  {
793  omega_x_sum += (float)(omega_x[i]);
794  omega_y_sum += (float)(omega_y[i]);
795  omega_z_sum += (float)(omega_z[i]);
796  }
797  omega_offset_vec[0] = (int16_t)(omega_x_sum/(float)NUM_REF_OMEGA *2.0);
798  omega_offset_vec[1] = (int16_t)(omega_y_sum/(float)NUM_REF_OMEGA *2.0);
799  omega_offset_vec[2] = (int16_t)(omega_z_sum/(float)NUM_REF_OMEGA *2.0);
800 
801  writeEEPROMOffsetOmegaInt(&omega_offset_vec[0]);
802  myPrintfUSB("==========\n gyro offset %d, %d, %d\n",omega_offset_vec[0],omega_offset_vec[1],omega_offset_vec[2] );
803 }
804 
814 {
815  uint32_t i = 0;
816  #define NUM_REF_ACCXY (400)
817 
818  int32_t acc_x[NUM_REF_ACCXY];
819  int32_t acc_y[NUM_REF_ACCXY];
820 
821  float acc_x_sum = 0.0;
822  float acc_y_sum = 0.0;
823 
824  acc_offset_vec[0] = 0;
825  acc_offset_vec[1] = 0;
826 
827  for(i=0;i<NUM_REF_ACCXY;i++)
828  {
830  acc_x[i] = acc_vec_raw_int[0];
831  acc_y[i] = acc_vec_raw_int[1];
832  wait1msec(10);
833  myPrintfUSB("%d| calibrating... %d, %d\n",i,acc_x [i],acc_y[i]);
834  }
835  quickSort(acc_x,0 ,NUM_REF_ACCXY -1);
836  quickSort(acc_y,0 ,NUM_REF_ACCXY -1);
837 
838  for(i=NUM_REF_ACCXY/4;i<(NUM_REF_ACCXY*3/4 +1) ;i++)
839  {
840  acc_x_sum += (float)(acc_x[i]);
841  acc_y_sum += (float)(acc_y[i]);
842  }
843  acc_offset_vec[0] = (int16_t)(acc_x_sum/(float)NUM_REF_ACCXY *2.0);
844  acc_offset_vec[1] = (int16_t)(acc_y_sum/(float)NUM_REF_ACCXY *2.0);
845  writeEEPROMOffsetAccInt(&acc_offset_vec[0]);
846  myPrintfUSB("==========\n acc offsetXY %d, %d\n",acc_offset_vec[0],acc_offset_vec[1]);
847 }
848 
858 {
859  uint32_t i = 0;
860  #define NUM_REF_ACC (400)
861 
862  int32_t acc_z[NUM_REF_ACC];
863 
864  float acc_z_sum = 0.0;
865 
866  acc_offset_vec[2] = 0;
867 
868  for(i=0;i<NUM_REF_ACC;i++)
869  {
871  acc_z[i] = acc_vec_raw_int[2];
872  wait1msec(10);
873  myPrintfUSB("%d| calibrating... %d \n",i,acc_z[i]);
874  }
875  quickSort(acc_z,0 ,NUM_REF_ACC -1);
876 
877  for(i=NUM_REF_ACC/4;i<(NUM_REF_ACC*3/4 +1) ;i++)
878  {
879  acc_z_sum += (float)(acc_z[i]);
880  }
881  acc_offset_vec[2] = (int16_t)(acc_z_sum/(float)NUM_REF_ACC *2.0);
882  writeEEPROMOffsetAccInt(&acc_offset_vec[0]);
883  myPrintfUSB("==========\n acc offsetZ %d\n",acc_offset_vec[2]);
884 }
885 
895 {
896  uint32_t i = 0;
897  #define NUM_REF_MAG (300)
898 
899  int32_t mag_x[NUM_REF_MAG];
900  int32_t mag_y[NUM_REF_MAG];
901  int32_t mag_z[NUM_REF_MAG];
902 
903  for(i=0;i<3;i++){
904  mag_offset_vec[i] = 0;
905  }
906 
907  for(i=0;i<NUM_REF_MAG;i++)
908  {
910  mag_x[i] = mag_vec_raw_int[0];
911  mag_y[i] = mag_vec_raw_int[1];
912  mag_z[i] = mag_vec_raw_int[2];
913  wait1msec(100);
914  myPrintfUSB("%d| calibrating... %d,%d,%d \n",i ,mag_x[i], mag_y[i], mag_z[i]);
915  }
916 
917  quickSort(mag_x,0 ,NUM_REF_MAG -1);
918  quickSort(mag_y,0 ,NUM_REF_MAG -1);
919  quickSort(mag_z,0 ,NUM_REF_MAG -1);
920 
921  mag_offset_vec[0] = (int16_t)((mag_x[0] + mag_x[NUM_REF_MAG-1])/2);
922  mag_offset_vec[1] = (int16_t)((mag_y[0] + mag_y[NUM_REF_MAG-1])/2);
923  mag_offset_vec[2] = (int16_t)((mag_z[0] + mag_z[NUM_REF_MAG-1])/2);
924  myPrintfUSB(" mag X min-max %d,%d\n", mag_x[0],mag_x[NUM_REF_MAG-1]);
925  myPrintfUSB(" mag Y min-max %d,%d\n", mag_y[0],mag_y[NUM_REF_MAG-1]);
926  myPrintfUSB(" mag Z min-max %d,%d\n", mag_z[0],mag_z[NUM_REF_MAG-1]);
927 
928  writeEEPROMOffsetMagInt(&mag_offset_vec[0]);
929  myPrintfUSB("==========\n mag offset %d,%d,%d\n", mag_offset_vec[0],mag_offset_vec[1],mag_offset_vec[2]);
930 }
931 
938 void debugMPU9250(void)
939 {
940  myPrintfUSB("########debug MPU9250#######\n");
941  wait1msec(5);
942  myPrintfUSB("------float data------\n");
943  myPrintfUSB("acc : %f, %f, %f (x,y,z)[1G] \n", acc_vec[0], acc_vec[1],acc_vec[2]);
944  myPrintfUSB("omega: %f, %f, %f (x,y,z) [rad] \n", omega_vec[0], omega_vec[1],omega_vec[2]);
945  myPrintfUSB("mag : %f, %f, %f (x,y,z) [uT] \n", mag_vec[0], mag_vec[1],mag_vec[2]);
946  myPrintfUSB("temp : %f [°C] \n", temperature);
947  wait1msec(5);
948  myPrintfUSB("------int data------\n");
949  myPrintfUSB("acc : %d, %d, %d (x,y,z) \n", acc_vec_int[0], acc_vec_int[1],acc_vec_int[2]);
950  myPrintfUSB("omega: %d, %d, %d (x,y,z) \n", omega_vec_int[0], omega_vec_int[1],omega_vec_int[2]);
951  myPrintfUSB("mag : %d, %d, %d (x,y,z) \n", mag_vec_int[0], mag_vec_int[1],mag_vec_int[2]);
952  myPrintfUSB("temp : %d \n", temperature_int);
953  wait1msec(5);
954  myPrintfUSB("------raw int data------\n");
955  myPrintfUSB("acc : %d, %d, %d (x,y,z) \n", acc_vec_raw_int[0], acc_vec_raw_int[1],acc_vec_raw_int[2]);
956  myPrintfUSB("omega: %d, %d, %d (x,y,z) \n", omega_vec_raw_int[0], omega_vec_raw_int[1],omega_vec_raw_int[2]);
957  myPrintfUSB("mag : %d, %d, %d (x,y,z) \n", mag_vec_raw_int[0], mag_vec_raw_int[1],mag_vec_raw_int[2]);
958  myPrintfUSB("temp : %d \n", temperature_raw_int);
959  wait1msec(5);
960  myPrintfUSB("------offset data------\n");
961  myPrintfUSB("acc : %d, %d, %d (x,y,z) \n", acc_offset_vec[0], acc_offset_vec[1],acc_offset_vec[2]);
962  myPrintfUSB("omega: %d, %d, %d (x,y,z) \n", omega_offset_vec[0], omega_offset_vec[1],omega_offset_vec[2]);
963  myPrintfUSB("mag : %d, %d, %d (x,y,z) \n", mag_offset_vec[0], mag_offset_vec[1],mag_offset_vec[2]);
964  wait1msec(5);
965  myPrintfUSB("------ASA data------\n");
966  myPrintfUSB("Asa : %d, %d, %d (x,y,z)\n",Asa[1],Asa[0],Asa[2]); //地磁気センサの出力」は軸を入れ替えているので注意
967  wait1msec(5);
968 }
969 
977 void writeEEPROMOffsetAccInt(int16_t *vec)
978 {
979  writeNbyteEEPROM(0,0,(uint8_t *)vec ,6);
980 };
981 
989 void writeEEPROMOffsetOmegaInt(int16_t *vec)
990 {
991  writeNbyteEEPROM(0,6,(uint8_t *)vec,6);
992 };
993 
1001 void writeEEPROMOffsetMagInt(int16_t *vec)
1002 {
1003  writeNbyteEEPROM(0,12,(uint8_t *)vec,6);
1004 };
1005 
1010 void readEEPROMOffsetAccInt(int16_t *vec)
1011 {
1012  readNbyteEEPROM(0,0,(uint8_t *)vec,6);
1013 };
1014 
1019 void readEEPROMOffsetOmegaInt(int16_t *vec)
1020 {
1021  readNbyteEEPROM(0,6,(uint8_t *)vec,6);
1022 };
1023 
1028 void readEEPROMOffsetMagInt(int16_t *vec)
1029 {
1030  readNbyteEEPROM(0,12,(uint8_t *)vec,6);
1031 }
1032 
1041 {
1042  readEEPROMOffsetAccInt(acc_offset_vec);
1043  readEEPROMOffsetOmegaInt(omega_offset_vec);
1044  readEEPROMOffsetMagInt(mag_offset_vec);
1045 }
1046 
1054 int16_t concatenate2Byte_int(uint8_t H_byte, uint8_t L_byte)
1055 {
1056  int32_t con;
1057  con = L_byte + (H_byte<<8);
1058  if (con > 32767)
1059  {
1060  con -= 65536;
1061  }
1062  return (int16_t)con;
1063 }
1064 
1065 
void getRawAccInt(int16_t *vec)
Definition: mpu9250.c:724
void getRawTempInt(int16_t *temp)
Definition: mpu9250.c:746
void getAsa(int16_t *vec)
Definition: mpu9250.c:659
void setOmegaOffset_x(int16_t offset_x)
Definition: mpu9250.c:569
void getMagInt(int16_t *vec)
Definition: mpu9250.c:692
void setOmegaOffset_z(int16_t offset_z)
Definition: mpu9250.c:589
void setMagOffset_z(int16_t offset_z)
Definition: mpu9250.c:649
void setAccOffset_y(int16_t offset_y)
Definition: mpu9250.c:609
void initOffsetByEEPROM()
Definition: mpu9250.c:1040
void debugMPU9250(void)
Definition: mpu9250.c:938
void initMPU9250(void)
Definition: mpu9250.c:72
void writeEEPROMOffsetMagInt(int16_t *vec)
Definition: mpu9250.c:1001
void calibAccXYOffset()
Definition: mpu9250.c:813
void getOmegaInt(int16_t *vec)
Definition: mpu9250.c:670
void calibOmegaOffset(int16_t *offset_vec)
Definition: mpu9250.c:760
void setAccOffset_x(int16_t offset_x)
Definition: mpu9250.c:599
void getTempInt(int16_t *temp)
Definition: mpu9250.c:703
void calibAccZOffset()
Definition: mpu9250.c:857
void writeEEPROMOffsetOmegaInt(int16_t *vec)
Definition: mpu9250.c:989
void setAccOffset(int16_t *offset_vec)
Definition: mpu9250.c:547
void getDataFromMPU9250(uint8_t *dest_array)
Definition: mpu9250.c:370
void getRawMagInt(int16_t *vec)
Definition: mpu9250.c:735
void setOmegaOffset_y(int16_t offset_y)
Definition: mpu9250.c:579
void initAK8963(void)
Definition: mpu9250.c:136
void getMagOffset(int16_t *offset_vec)
Definition: mpu9250.c:525
void setOmegaOffset(int16_t *offset_vec)
Definition: mpu9250.c:536
void updateMPU9250Data(void)
Definition: mpu9250.c:195
void calibMagOffset()
Definition: mpu9250.c:894
void getAccOffset(int16_t *offset_vec)
Definition: mpu9250.c:514
void setMagOffset_y(int16_t offset_y)
Definition: mpu9250.c:639
void getOmegaOffset(int16_t *offset_vec)
Definition: mpu9250.c:503
void setAccOffset_z(int16_t offset_z)
Definition: mpu9250.c:619
void writeEEPROMOffsetAccInt(int16_t *vec)
Definition: mpu9250.c:977
void setMagOffset(int16_t *offset_vec)
Definition: mpu9250.c:558
void getAcc(float *vec)
Definition: mpu9250.c:481
void readEEPROMOffsetOmegaInt(int16_t *vec)
Definition: mpu9250.c:1019
void getOmega(float *vec)
Definition: mpu9250.c:457
int16_t concatenate2Byte_int(uint8_t H_byte, uint8_t L_byte)
Definition: mpu9250.c:1054
void getMag(float *vec)
Definition: mpu9250.c:469
void getDataFromAK8963(uint8_t *dest_array)
Definition: mpu9250.c:393
void updateAK8963Data()
Definition: mpu9250.c:285
void whoAmI(void)
Definition: mpu9250.c:409
void getACCInt(int16_t *vec)
Definition: mpu9250.c:681
void getTemp(float *temp)
Definition: mpu9250.c:493
void setSendDataEnable(uint8_t en)
Definition: MainFunction.c:63
void readEEPROMOffsetAccInt(int16_t *vec)
Definition: mpu9250.c:1010
void setMagOffset_x(int16_t offset_x)
Definition: mpu9250.c:629
void readEEPROMOffsetMagInt(int16_t *vec)
Definition: mpu9250.c:1028
void getRawOmegaInt(int16_t *vec)
Definition: mpu9250.c:713