/// <summary> /// Returns the compensated magnetometer z axis data(micro-tesla) in float. /// More details, permalink: https://github.com/BoschSensortec/BMM150-Sensor-API/blob/a20641f216057f0c54de115fe81b57368e119c01/bmm150.c#L1682 /// </summary> /// <param name="z">axis raw value</param> /// <param name="rhall">temperature compensation value (RHALL) </param> /// <param name="trimData">trim registers values</param> /// <returns>compensated magnetometer z axis data(micro-tesla) in float</returns> public static double CompensateZ(double z, uint rhall, Bmm150TrimRegisterData trimData) { float retval = 0; float processCompX0; float processCompX1; float processCompZ2; float processCompZ3; float processCompZ4; float processCompZ5; int bmm150_overflow_adcval_zaxis_hall = -16384; // Overflow condition check if ((z != bmm150_overflow_adcval_zaxis_hall) && (trimData.DigZ2 != 0) && (trimData.DigZ1 != 0) && (trimData.DigXyz1 != 0) && (rhall != 0)) { // Processing compensation equations processCompX0 = ((float)z) - ((float)trimData.DigZ4); processCompX1 = ((float)rhall) - ((float)trimData.DigXyz1); processCompZ2 = (((float)trimData.DigZ3) * processCompX1); processCompZ3 = ((float)trimData.DigZ1) * ((float)rhall) / 32768.0f; processCompZ4 = ((float)trimData.DigZ2) + processCompZ3; processCompZ5 = (processCompX0 * 131072.0f) - processCompZ2; retval = (processCompZ5 / ((processCompZ4) * 4.0f)) / 16.0f; } else { // Overflow, set output to 0.0f retval = 0.0f; } return(retval); }
/// <summary> /// Returns the compensated magnetometer y axis data(micro-tesla) in float. /// More details, permalink: https://github.com/BoschSensortec/BMM150-Sensor-API/blob/a20641f216057f0c54de115fe81b57368e119c01/bmm150.c#L1648 /// </summary> /// <param name="y">axis raw value</param> /// <param name="rhall">temperature compensation value (RHALL) </param> /// <param name="trimData">trim registers values</param> /// <returns>compensated magnetometer y axis data(micro-tesla) in float</returns> public static double CompensateY(double y, uint rhall, Bmm150TrimRegisterData trimData) { float retval = 0; float processCompY0; float processCompY1; float processCompY2; float processCompY3; float processCompY4; int bmm150_overflow_adcval_xyaxes_flip = -4096; // Overflow condition check if ((y != bmm150_overflow_adcval_xyaxes_flip) && (rhall != 0) && (trimData.DigXyz1 != 0)) { // Processing compensation equations processCompY0 = ((float)trimData.DigXyz1) * 16384.0f / rhall; retval = processCompY0 - 16384.0f; processCompY1 = ((float)trimData.DigXy2) * (retval * retval / 268435456.0f); processCompY2 = processCompY1 + retval * ((float)trimData.DigXy1) / 16384.0f; processCompY3 = ((float)trimData.DigY2) + 160.0f; processCompY4 = (float)(y * (((processCompY2) + 256.0f) * processCompY3)); retval = ((processCompY4 / 8192.0f) + (((float)trimData.DigY1) * 8.0f)) / 16.0f; } else { // Overflow, set output to 0.0f retval = 0.0f; } return(retval); }
/// <summary> /// Constructor to use if Bmm150 is behind another element and need a special I2C protocol like /// when used with the MPU9250 /// </summary> /// <param name="i2cDevice">The I2C device</param> /// <param name="Bmm150Interface">The specific interface to communicate with the Bmm150</param> /// <param name="shouldDispose">True to dispose the I2C device when class is disposed</param> public Bmm150(I2cDevice i2cDevice, Bmm150I2cBase Bmm150Interface, bool shouldDispose = true) { _i2cDevice = i2cDevice ?? throw new ArgumentNullException(nameof(i2cDevice)); _bmm150Interface = Bmm150Interface; _shouldDispose = shouldDispose; Initialize(); // After initializing the device we read the _trimData = ReadTrimRegisters(); }