and this is what I did basically for gyro and magnetometer calibration:
in void setup ():
for (i=0;i<100;i++)
{
gyroX = IMU_getData (MPU9250_ADDRESS, GYRO_XOUT_H, GYRO_XOUT_L);
gyroY = IMU_getData (MPU9250_ADDRESS, GYRO_YOUT_H, GYRO_YOUT_L);
gyroZ = IMU_getData (MPU9250_ADDRESS, GYRO_ZOUT_H, GYRO_ZOUT_L);
magX = IMU_getData (MAG_ADDRESS, MAG_XOUT_H, MAG_XOUT_L);
magY = IMU_getData (MAG_ADDRESS, MAG_YOUT_H, MAG_YOUT_L);
magZ = IMU_getData (MAG_ADDRESS, MAG_ZOUT_H, MAG_ZOUT_L);
gyroXbias += gyroX ;
gyroYbias += gygyroY ;
gyroZbias += gyroZ ;
magXbias += magX ;
magYbias += magY ;
magZbias += magZ ;
delay (10);
}
gyroXbias = gyroXbias / 100 ;
gyroYbias = gyroYbias / 100 ;
gyroZbias = gyroZbias / 100 ;
magXbias = magXbias / 100 ;
magYbias = magYbias / 100 ;
magZbias = magZbias / 100 ;
in void loop():
AccelXdata = IMU_getData (MPU9250_ADDRESS, ACCEL_XOUT_H, ACCEL_XOUT_L);
AccelYdata = IMU_getData (MPU9250_ADDRESS, ACCEL_YOUT_H, ACCEL_YOUT_L);
AccelZdata = IMU_getData (MPU9250_ADDRESS, ACCEL_ZOUT_H, ACCEL_ZOUT_L);
GyroXdata = IMU_getData (MPU9250_ADDRESS, GYRO_XOUT_H, GYRO_XOUT_L);
GyroYdata = IMU_getData (MPU9250_ADDRESS, GYRO_YOUT_H, GYRO_YOUT_L);
GyroZdata = IMU_getData (MPU9250_ADDRESS, GYRO_ZOUT_H, GYRO_ZOUT_L);
MagXdata = IMU_getData (MAG_ADDRESS, MAG_XOUT_H, MAG_XOUT_L);
MagYdata = IMU_getData (MAG_ADDRESS, MAG_YOUT_H, MAG_YOUT_L);
MagZdata = IMU_getData (MAG_ADDRESS, MAG_ZOUT_H,
Status2_reg = I2CreadByte (MAG_ADDRESS, 0x09); // Read Data Status Register
AccelXdata = AccelXdata / accel_sensitivity ;
AccelYdata = AccelYdata / accel_sensitivity ;
AccelZdata = AccelZdata / accel_sensitivity ;
GyroXdata = ( GyroXdata - gyroXbias ) / gyro_sensitivity ;
GyroYdata = ( GyroYdata - gyroYbias ) / gyro_sensitivity ;
GyroZdata = ( GyroZdata - gyroZbias ) / gyro_sensitivity ;
MagXdata = ( MagXdata - magXbias ) *XY_mag_adj ;
MagYdata = ( MagYdata - magYbias ) *XY_mag_adj ;
MagZdata = ( MagZdata - magZbias ) *Z_mag_adj ;
MadgwickQuaternionUpdate (AccelXdata , AccelYdata , AccelZdata , GyroXdata , GyroYdata , GyroZdata , MagXdata , MagYdata , MagZdata );
I get ASAX, ASAY and ASAZ from magnetometer registers (using Fuse ROM Mode)
ASAX = ASAY = 171
ASAZ = 161
according to MPU-9250-Register-Map :
XY_mag_adj = ( ( ASAX - 128 ) * 0.5 / 128 ) + 1
Z_mag_adj = ( ( ASAZ - 128 ) * 0.5 / 128 ) + 1