21 #include "SystemTickTimer.h"
22 #include "MainFunction.h"
23 #include "TinyMathFunction.h"
25 #include "EEPROM_24LC16BT_I.h"
29 extern volatile uint8_t I2CMasterBuffer[BUFSIZE];
30 extern volatile uint8_t I2CSlaveBuffer[BUFSIZE];
31 extern volatile uint32_t I2CReadLength, I2CWriteLength;
34 #define MPU9250_W 0xd0
35 #define MPU9250_R 0xd1
39 static volatile float omega_vec[3] = {0.0, 0.0, 0.0};
40 static volatile float acc_vec[3] = {0.0, 0.0, 0.0};
41 static volatile float mag_vec[3] = {0.0, 0.0, 0.0};
42 static volatile float temperature = 0.0;
44 static volatile int16_t omega_vec_int[3] = {0, 0, 0};
45 static volatile int16_t acc_vec_int[3] = {0, 0, 0};
46 static volatile int16_t mag_vec_int[3] = {0, 0, 0};
47 static volatile int16_t temperature_int = 0;
49 static volatile int16_t omega_vec_raw_int[3] = {0, 0, 0};
50 static volatile int16_t acc_vec_raw_int[3] = {0, 0, 0};
51 static volatile int16_t mag_vec_raw_int[3] = {0, 0, 0};
52 static volatile int16_t temperature_raw_int = 0;
54 static volatile uint8_t mpu9250ArrayData[14];
55 static volatile uint8_t ak8963ArrayData[6];
57 static volatile uint8_t Asa[3] = {128, 128, 128};
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};
77 I2CMasterBuffer[0] = MPU9250_W;
78 I2CMasterBuffer[1] = 0x6B;
79 I2CMasterBuffer[2] = 0x00;
86 I2CMasterBuffer[0] = MPU9250_W;
87 I2CMasterBuffer[1] = 0x37;
88 I2CMasterBuffer[2] = 0x02;
95 I2CMasterBuffer[0] = MPU9250_W;
96 I2CMasterBuffer[1] = 0x1A;
97 I2CMasterBuffer[2] = 0x02;
104 I2CMasterBuffer[0] = MPU9250_W;
105 I2CMasterBuffer[1] = 0x1B;
106 I2CMasterBuffer[2] = 0x18;
113 I2CMasterBuffer[0] = MPU9250_W;
114 I2CMasterBuffer[1] = 0x1C;
115 I2CMasterBuffer[2] = 0x18;
122 I2CMasterBuffer[0] = MPU9250_W;
123 I2CMasterBuffer[1] = 0x1D;
124 I2CMasterBuffer[2] = 0x02;
142 I2CMasterBuffer[0] = AK8963_W;
143 I2CMasterBuffer[1] = 0x0a;
144 I2CMasterBuffer[2] = 0x0f;
151 I2CMasterBuffer[0] = AK8963_W;
152 I2CMasterBuffer[1] = 0x10;
153 I2CMasterBuffer[2] = AK8963_R;
156 for(i = 0;i < 3;i ++)
158 Asa[i] = I2CSlaveBuffer[i];
164 I2CMasterBuffer[0] = AK8963_W;
165 I2CMasterBuffer[1] = 0x0a;
166 I2CMasterBuffer[2] = 0x00;
173 I2CMasterBuffer[0] = AK8963_W;
174 I2CMasterBuffer[1] = 0x0a;
175 I2CMasterBuffer[2] = 0x10;
198 volatile uint16_t acc_temp[3];
199 volatile uint8_t raw_array[14];
200 volatile float temperature_temp;
205 I2CMasterBuffer[0] = MPU9250_W;
206 I2CMasterBuffer[1] = 0x3B;
207 I2CMasterBuffer[2] = MPU9250_R;
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];
214 acc_temp[0] = (~acc_temp[0]) + 1;
215 acc_temp[1] = (~acc_temp[1]) + 1;
216 acc_temp[2] = (~acc_temp[2]) + 1;
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;
226 raw_array[6] = I2CSlaveBuffer[7];
227 raw_array[7] = I2CSlaveBuffer[6];
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];
236 for ( i = 0; i < BUFSIZE; i++ )
238 I2CSlaveBuffer[i] = 0x00;
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;
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);
255 #ifdef VER_1_0_COMPATIBLE_MPU9150_TEMP
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;
262 temperature_int = temperature_raw_int;
263 temperature = ((float)temperature_int)/333.87 + 21.0;
267 mpu9250ArrayData[2*i] = (0x00ff & acc_vec_int[i]);
268 mpu9250ArrayData[2*i+1] = (0xff00 & acc_vec_int[i])>>8;
270 mpu9250ArrayData[2*i+8] = (0x00ff & omega_vec_int[i]);
271 mpu9250ArrayData[2*i+1+8] = (0xff00 & omega_vec_int[i])>>8;
273 mpu9250ArrayData[6] = (0x00ff & temperature_int);
274 mpu9250ArrayData[7] = (0xff00 & temperature_int)>>8;
288 volatile int16_t mag_temp[3];
289 volatile uint8_t raw_array[6];
293 I2CMasterBuffer[0] = AK8963_W;
294 I2CMasterBuffer[1] = 0x03;
295 I2CMasterBuffer[2] = AK8963_R;
298 for ( i = 0; i < 3; i++ )
301 mag_temp[i] = (mag_temp[i]*(Asa[i]+128))/256;
304 raw_array[0] = 0x00ff & mag_temp[1];
305 raw_array[1] = (0xff00 & mag_temp[1])>>8;
307 raw_array[2] = 0x00ff & mag_temp[0];
308 raw_array[3] = (0xff00 & mag_temp[0])>>8;
310 mag_temp[2] = (~mag_temp[2]) + 1;
311 raw_array[4] = 0x00ff & mag_temp[2];
312 raw_array[5] = (0xff00 & mag_temp[2])>>8;
316 I2CMasterBuffer[0] = AK8963_W;
317 I2CMasterBuffer[1] = 0x0A;
318 I2CMasterBuffer[2] = 0x11;
321 for ( i = 0; i < BUFSIZE; i++ )
323 I2CSlaveBuffer[i] = 0x00;
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;
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;
343 ak8963ArrayData[2*i] = (0x00ff & mag_vec_int[i]);
344 ak8963ArrayData[2*i+1] = (0xff00 & mag_vec_int[i])>>8;
375 dest_array[i] = mpu9250ArrayData[i];
398 dest_array[i] = ak8963ArrayData[i];
415 myPrintfUSB(
"//////////////// \n");
419 I2CMasterBuffer[0] = AK8963_W;
420 I2CMasterBuffer[1] = 0x00;
421 I2CMasterBuffer[2] = AK8963_R;
424 myPrintfUSB(
"Who Am I AK8963 : %d \n", I2CSlaveBuffer[0]);
426 for ( i = 0; i < BUFSIZE; i++ )
428 I2CSlaveBuffer[i] = 0x00;
432 myPrintfUSB(
"//////////////// \n");
436 I2CMasterBuffer[0] = MPU9250_W;
437 I2CMasterBuffer[1] = 0x75;
438 I2CMasterBuffer[2] = MPU9250_R;
441 myPrintfUSB(
"Who Am I MPU9250 : %d \n", I2CSlaveBuffer[0]);
443 for ( i = 0; i < BUFSIZE; i++ )
445 I2CSlaveBuffer[i] = 0x00;
460 for(i=0;i<3;i++) vec[i] = omega_vec[i];
472 for(i=0;i<3;i++) vec[i] = mag_vec[i];
484 for(i=0;i<3;i++) vec[i] = acc_vec[i];
506 for(i=0;i<3;i++) offset_vec[i] = omega_offset_vec[i];
517 for(i=0;i<3;i++) offset_vec[i] = acc_offset_vec[i];
528 for(i=0;i<3;i++) offset_vec[i] = mag_offset_vec[i];
539 for(i=0;i<3;i++) omega_offset_vec[i] = offset_vec[i];
550 for(i=0;i<3;i++) acc_offset_vec[i] = offset_vec[i];
561 for(i=0;i<3;i++) mag_offset_vec[i] = offset_vec[i];
571 omega_offset_vec[0] = offset_x;
581 omega_offset_vec[1] = offset_y;
591 omega_offset_vec[2] = offset_z;
601 acc_offset_vec[0] = offset_x;
611 acc_offset_vec[1] = offset_y;
621 acc_offset_vec[2] = offset_z;
631 mag_offset_vec[0] = offset_x;
641 mag_offset_vec[1] = offset_y;
651 mag_offset_vec[2] = offset_z;
662 for(i=0;i<3;i++) vec[i] = Asa[i];
673 for(i=0;i<3;i++) vec[i] = omega_vec_int[i];
684 for(i=0;i<3;i++) vec[i] = acc_vec_int[i];
695 for(i=0;i<3;i++) vec[i] = mag_vec_int[i];
705 *temp = temperature_int;
716 for(i=0;i<3;i++) vec[i] = omega_vec_raw_int[i];
727 for(i=0;i<3;i++) vec[i] = omega_vec_raw_int[i];
738 for(i=0;i<3;i++) vec[i] = mag_vec_raw_int[i];
748 *temp = temperature_raw_int;
763 #define NUM_REF_OMEGA (400)
765 int32_t omega_x[NUM_REF_OMEGA];
766 int32_t omega_y[NUM_REF_OMEGA];
767 int32_t omega_z[NUM_REF_OMEGA];
769 float omega_x_sum = 0.0;
770 float omega_y_sum = 0.0;
771 float omega_z_sum = 0.0;
775 omega_offset_vec[i] = 0;
778 for(i=0;i<NUM_REF_OMEGA;i++)
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];
785 myPrintfUSB(
"%d| calibrating... %d, %d, %d\n",i,omega_x [i],omega_y[i],omega_z[i] );
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);
791 for(i=NUM_REF_OMEGA/4;i<(NUM_REF_OMEGA*3/4 +1) ;i++)
793 omega_x_sum += (float)(omega_x[i]);
794 omega_y_sum += (float)(omega_y[i]);
795 omega_z_sum += (float)(omega_z[i]);
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);
802 myPrintfUSB(
"==========\n gyro offset %d, %d, %d\n",omega_offset_vec[0],omega_offset_vec[1],omega_offset_vec[2] );
816 #define NUM_REF_ACCXY (400)
818 int32_t acc_x[NUM_REF_ACCXY];
819 int32_t acc_y[NUM_REF_ACCXY];
821 float acc_x_sum = 0.0;
822 float acc_y_sum = 0.0;
824 acc_offset_vec[0] = 0;
825 acc_offset_vec[1] = 0;
827 for(i=0;i<NUM_REF_ACCXY;i++)
830 acc_x[i] = acc_vec_raw_int[0];
831 acc_y[i] = acc_vec_raw_int[1];
833 myPrintfUSB(
"%d| calibrating... %d, %d\n",i,acc_x [i],acc_y[i]);
835 quickSort(acc_x,0 ,NUM_REF_ACCXY -1);
836 quickSort(acc_y,0 ,NUM_REF_ACCXY -1);
838 for(i=NUM_REF_ACCXY/4;i<(NUM_REF_ACCXY*3/4 +1) ;i++)
840 acc_x_sum += (float)(acc_x[i]);
841 acc_y_sum += (float)(acc_y[i]);
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);
846 myPrintfUSB(
"==========\n acc offsetXY %d, %d\n",acc_offset_vec[0],acc_offset_vec[1]);
860 #define NUM_REF_ACC (400)
862 int32_t acc_z[NUM_REF_ACC];
864 float acc_z_sum = 0.0;
866 acc_offset_vec[2] = 0;
868 for(i=0;i<NUM_REF_ACC;i++)
871 acc_z[i] = acc_vec_raw_int[2];
873 myPrintfUSB(
"%d| calibrating... %d \n",i,acc_z[i]);
875 quickSort(acc_z,0 ,NUM_REF_ACC -1);
877 for(i=NUM_REF_ACC/4;i<(NUM_REF_ACC*3/4 +1) ;i++)
879 acc_z_sum += (float)(acc_z[i]);
881 acc_offset_vec[2] = (int16_t)(acc_z_sum/(
float)NUM_REF_ACC *2.0);
883 myPrintfUSB(
"==========\n acc offsetZ %d\n",acc_offset_vec[2]);
897 #define NUM_REF_MAG (300)
899 int32_t mag_x[NUM_REF_MAG];
900 int32_t mag_y[NUM_REF_MAG];
901 int32_t mag_z[NUM_REF_MAG];
904 mag_offset_vec[i] = 0;
907 for(i=0;i<NUM_REF_MAG;i++)
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];
914 myPrintfUSB(
"%d| calibrating... %d,%d,%d \n",i ,mag_x[i], mag_y[i], mag_z[i]);
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);
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]);
929 myPrintfUSB(
"==========\n mag offset %d,%d,%d\n", mag_offset_vec[0],mag_offset_vec[1],mag_offset_vec[2]);
940 myPrintfUSB(
"########debug MPU9250#######\n");
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);
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);
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);
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]);
965 myPrintfUSB(
"------ASA data------\n");
966 myPrintfUSB(
"Asa : %d, %d, %d (x,y,z)\n",Asa[1],Asa[0],Asa[2]);
979 writeNbyteEEPROM(0,0,(uint8_t *)vec ,6);
991 writeNbyteEEPROM(0,6,(uint8_t *)vec,6);
1003 writeNbyteEEPROM(0,12,(uint8_t *)vec,6);
1012 readNbyteEEPROM(0,0,(uint8_t *)vec,6);
1021 readNbyteEEPROM(0,6,(uint8_t *)vec,6);
1030 readNbyteEEPROM(0,12,(uint8_t *)vec,6);
1057 con = L_byte + (H_byte<<8);
1062 return (int16_t)con;
void getRawAccInt(int16_t *vec)
void getRawTempInt(int16_t *temp)
void getAsa(int16_t *vec)
void setOmegaOffset_x(int16_t offset_x)
void getMagInt(int16_t *vec)
void setOmegaOffset_z(int16_t offset_z)
void setMagOffset_z(int16_t offset_z)
void setAccOffset_y(int16_t offset_y)
void initOffsetByEEPROM()
void writeEEPROMOffsetMagInt(int16_t *vec)
void getOmegaInt(int16_t *vec)
void calibOmegaOffset(int16_t *offset_vec)
void setAccOffset_x(int16_t offset_x)
void getTempInt(int16_t *temp)
void writeEEPROMOffsetOmegaInt(int16_t *vec)
void setAccOffset(int16_t *offset_vec)
void getDataFromMPU9250(uint8_t *dest_array)
void getRawMagInt(int16_t *vec)
void setOmegaOffset_y(int16_t offset_y)
void getMagOffset(int16_t *offset_vec)
void setOmegaOffset(int16_t *offset_vec)
void updateMPU9250Data(void)
void getAccOffset(int16_t *offset_vec)
void setMagOffset_y(int16_t offset_y)
void getOmegaOffset(int16_t *offset_vec)
void setAccOffset_z(int16_t offset_z)
void writeEEPROMOffsetAccInt(int16_t *vec)
void setMagOffset(int16_t *offset_vec)
void readEEPROMOffsetOmegaInt(int16_t *vec)
void getOmega(float *vec)
int16_t concatenate2Byte_int(uint8_t H_byte, uint8_t L_byte)
void getDataFromAK8963(uint8_t *dest_array)
void getACCInt(int16_t *vec)
void getTemp(float *temp)
void setSendDataEnable(uint8_t en)
void readEEPROMOffsetAccInt(int16_t *vec)
void setMagOffset_x(int16_t offset_x)
void readEEPROMOffsetMagInt(int16_t *vec)
void getRawOmegaInt(int16_t *vec)