From 29bde7c1eb39ae2daddc202b4aadd8752308374f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberto=20Garci=CC=81a=20Hierro?= Date: Mon, 25 Jun 2018 19:36:57 +0100 Subject: [PATCH] Fix orientation of the drivers for AK8963, AK8975 and MPU9250 MAGs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Due to the unsual axis definition of the AKxxxx MAGs (the +Y axis is 90ºCW from the +X axis when +Z points up), the driver needs to invert e.g. X and Z, then rotate rather than inverting all of X, Y and Z like it was doing. It seems this bug was introduced in 3d024c6f3 back in November, between 1.8 and 1.9 and some targets were written or updated in the meantime assuming the driver was correct and thus have incorrect mag alignments. I've tried to fix them all, but I don't have all these boards and while ones with the MP9250 are obvious (assumming the acc/gyro orientation is right, the mag orientation can be derived from it), some of them have AK8963 or AK8975 which might be oriented differently than the acc/gyro. Fixes #3438 Fixes #3434 --- src/main/drivers/compass/compass_ak8963.c | 2 +- src/main/drivers/compass/compass_ak8975.c | 2 +- src/main/drivers/compass/compass_mpu9250.c | 2 +- src/main/target/ALIENFLIGHTF3/target.h | 2 +- src/main/target/ALIENFLIGHTF4/target.h | 2 +- src/main/target/ALIENFLIGHTNGF7/target.h | 4 ++-- src/main/target/CLRACINGF4AIR/target.h | 2 ++ src/main/target/SPARKY/target.h | 2 +- src/main/target/SPARKY2/target.h | 2 +- src/main/target/SPRACINGF3EVO/target.h | 2 +- src/main/target/SPRACINGF3MINI/target.h | 2 +- 11 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/main/drivers/compass/compass_ak8963.c b/src/main/drivers/compass/compass_ak8963.c index dc4ce5f4d2..58d100d9f7 100755 --- a/src/main/drivers/compass/compass_ak8963.c +++ b/src/main/drivers/compass/compass_ak8963.c @@ -139,7 +139,7 @@ static bool ak8963Read(magDev_t * mag) } mag->magADCRaw[X] = -parseMag(buf + 0, magGain[X]); - mag->magADCRaw[Y] = -parseMag(buf + 2, magGain[Y]); + mag->magADCRaw[Y] = parseMag(buf + 2, magGain[Y]); mag->magADCRaw[Z] = -parseMag(buf + 4, magGain[Z]); return true; diff --git a/src/main/drivers/compass/compass_ak8975.c b/src/main/drivers/compass/compass_ak8975.c index e280da62a5..c30869c613 100644 --- a/src/main/drivers/compass/compass_ak8975.c +++ b/src/main/drivers/compass/compass_ak8975.c @@ -118,7 +118,7 @@ static bool ak8975Read(magDev_t * mag) } mag->magADCRaw[X] = -(int16_t)(buf[1] << 8 | buf[0]) * 4; - mag->magADCRaw[Y] = -(int16_t)(buf[3] << 8 | buf[2]) * 4; + mag->magADCRaw[Y] = (int16_t)(buf[3] << 8 | buf[2]) * 4; mag->magADCRaw[Z] = -(int16_t)(buf[5] << 8 | buf[4]) * 4; ack = busWrite(mag->busDev, AK8975_MAG_REG_CNTL, 0x01); // start reading again diff --git a/src/main/drivers/compass/compass_mpu9250.c b/src/main/drivers/compass/compass_mpu9250.c index db0a7f3213..1e7d6aa178 100755 --- a/src/main/drivers/compass/compass_mpu9250.c +++ b/src/main/drivers/compass/compass_mpu9250.c @@ -269,7 +269,7 @@ static bool mpu9250CompassRead(magDev_t * mag) } mag->magADCRaw[X] = -parseMag(buf + 0, magGain[X]); - mag->magADCRaw[Y] = -parseMag(buf + 2, magGain[Y]); + mag->magADCRaw[Y] = parseMag(buf + 2, magGain[Y]); mag->magADCRaw[Z] = -parseMag(buf + 4, magGain[Z]); memcpy(cachedMagData, &mag->magADCRaw, sizeof(cachedMagData)); diff --git a/src/main/target/ALIENFLIGHTF3/target.h b/src/main/target/ALIENFLIGHTF3/target.h index 3c0b44e907..17e74af93f 100644 --- a/src/main/target/ALIENFLIGHTF3/target.h +++ b/src/main/target/ALIENFLIGHTF3/target.h @@ -69,7 +69,7 @@ #define USE_MAG #define MAG_I2C_BUS BUS_I2C2 #define USE_MAG_MPU9250 -#define MAG_MPU9250_ALIGN CW180_DEG_FLIP +#define MAG_MPU9250_ALIGN CW0_DEG #define USE_MAG_AK8963 #define USE_MAG_AK8975 #define USE_MAG_HMC5883 diff --git a/src/main/target/ALIENFLIGHTF4/target.h b/src/main/target/ALIENFLIGHTF4/target.h index 6809178ea1..92afdbb512 100644 --- a/src/main/target/ALIENFLIGHTF4/target.h +++ b/src/main/target/ALIENFLIGHTF4/target.h @@ -68,7 +68,7 @@ #define USE_MAG_IST8308 #define USE_MAG_LIS3MDL -#define MAG_MPU9250_ALIGN CW180_DEG_FLIP +#define MAG_MPU9250_ALIGN CW0_DEG #define USE_BARO #define BARO_I2C_BUS BUS_I2C1 diff --git a/src/main/target/ALIENFLIGHTNGF7/target.h b/src/main/target/ALIENFLIGHTNGF7/target.h index ae39f54ebd..918b4971de 100644 --- a/src/main/target/ALIENFLIGHTNGF7/target.h +++ b/src/main/target/ALIENFLIGHTNGF7/target.h @@ -66,8 +66,8 @@ #define USE_MAG_IST8308 #define USE_MAG_LIS3MDL -#define MAG_AK9863_ALIGN CW180_DEG_FLIP -#define MAG_MPU9250_ALIGN CW180_DEG_FLIP +#define MAG_AK9863_ALIGN CW0_DEG +#define MAG_MPU9250_ALIGN CW0_DEG #define AK8963_CS_PIN PC15 #define AK8963_SPI_BUS BUS_SPI3 diff --git a/src/main/target/CLRACINGF4AIR/target.h b/src/main/target/CLRACINGF4AIR/target.h index 7d5e3bbe0b..f69eb59f9f 100644 --- a/src/main/target/CLRACINGF4AIR/target.h +++ b/src/main/target/CLRACINGF4AIR/target.h @@ -54,6 +54,8 @@ #define ACC_MPU9250_ALIGN CW0_DEG #define USE_MAG #define USE_MAG_MPU9250 +#define MAG_MPU9250_ALIGN CW90_DEG + // MPU6 interrupts #define USE_EXTI #define GYRO_INT_EXTI PC4 diff --git a/src/main/target/SPARKY/target.h b/src/main/target/SPARKY/target.h index 5f4f5e870a..b2a3facbb3 100644 --- a/src/main/target/SPARKY/target.h +++ b/src/main/target/SPARKY/target.h @@ -48,7 +48,7 @@ #define USE_MAG #define MAG_I2C_BUS BUS_I2C2 -#define MAG_AK8975_ALIGN CW180_DEG_FLIP +#define MAG_AK8975_ALIGN CW0_DEG #define USE_MAG_AK8975 #define USE_MAG_HMC5883 #define USE_MAG_QMC5883 diff --git a/src/main/target/SPARKY2/target.h b/src/main/target/SPARKY2/target.h index aac407ac62..0e257fd6da 100644 --- a/src/main/target/SPARKY2/target.h +++ b/src/main/target/SPARKY2/target.h @@ -47,7 +47,7 @@ #define USE_MAG #define USE_MAG_MPU9250 -#define MAG_MPU9250_ALIGN CW270_DEG +#define MAG_MPU9250_ALIGN CW0_DEG #define MAG_I2C_BUS BUS_I2C1 #define USE_MAG_HMC5883 diff --git a/src/main/target/SPRACINGF3EVO/target.h b/src/main/target/SPRACINGF3EVO/target.h index a17a685637..031d42aec8 100755 --- a/src/main/target/SPRACINGF3EVO/target.h +++ b/src/main/target/SPRACINGF3EVO/target.h @@ -54,7 +54,7 @@ #define USE_MAG #define MAG_I2C_BUS BUS_I2C1 -#define MAG_MPU9250_ALIGN CW90_DEG_FLIP +#define MAG_MPU9250_ALIGN CW270_DEG #define USE_MAG_MPU9250 #define USE_MAG_HMC5883 #define USE_MAG_QMC5883 diff --git a/src/main/target/SPRACINGF3MINI/target.h b/src/main/target/SPRACINGF3MINI/target.h index fa613bcdca..e6ac0b50b4 100644 --- a/src/main/target/SPRACINGF3MINI/target.h +++ b/src/main/target/SPRACINGF3MINI/target.h @@ -54,7 +54,7 @@ #define USE_MAG #define MAG_I2C_BUS BUS_I2C1 -#define MAG_AK8963_ALIGN CW270_DEG_FLIP +#define MAG_AK8963_ALIGN CW270_DEG #define USE_MAG_AK8963 #define USE_MAG_HMC5883 #define USE_MAG_QMC5883