10#ifndef M5_UNIT_IMU_UNIT_UNIT_BMM350_DATA_HPP
11#define M5_UNIT_IMU_UNIT_UNIT_BMM350_DATA_HPP
53 return (rate == DataRate::Rate400Hz) ? Averaging::None
54 : (rate == DataRate::Rate200Hz)
55 ? (
static_cast<uint8_t
>(avg) >
static_cast<uint8_t
>(Averaging::X2) ? Averaging::X2 : avg)
56 : (rate == DataRate::Rate100Hz)
57 ? (
static_cast<uint8_t
>(avg) >
static_cast<uint8_t
>(Averaging::X4) ? Averaging::X4 : avg)
64 return (raw >= 0x800000u) ?
static_cast<int32_t
>(raw - 0x1000000u) :
static_cast<int32_t
>(raw);
122 for (
size_t i = 0; i < 3; ++i) {
123 m[i] *= 1.0f +
sens[i];
125 m[i] +=
tco[i] * (t_comp -
t0);
126 m[i] /= 1.0f +
tcs[i] * (t_comp -
t0);
129 const float cross_xy =
cross[0];
130 const float cross_yx =
cross[1];
131 const float cross_zx =
cross[2];
132 const float cross_zy =
cross[3];
133 const float denom = 1.0f - cross_yx * cross_xy;
135 const float x = (m[0] - cross_xy * m[1]) / denom;
136 const float y = (m[1] - cross_yx * m[0]) / denom;
137 const float z_delta = m[0] * (cross_yx * cross_zy - cross_zx) - m[1] * (cross_zy - cross_xy * cross_zx);
138 const float z = m[2] + z_delta / denom;
153 std::array<uint8_t, 12>
raw{};
181 return static_cast<int16_t
>(
temp_raw24() >> 8);
190 return compensated_mag()[0];
195 return compensated_mag()[1];
200 return compensated_mag()[2];
206 inline uint32_t assemble24(
const size_t idx)
const
208 return static_cast<uint32_t
>(
raw[idx]) | (
static_cast<uint32_t
>(
raw[idx + 1]) << 8) |
209 (
static_cast<uint32_t
>(
raw[idx + 2]) << 16);
212 inline float primary_temp()
const
214 return static_cast<float>(
temp_raw24()) * temp_res_raw24() + TEMP_OFFSET;
217 inline std::array<float, 3> compensated_mag()
const
219 std::array<float, 3> m{
static_cast<float>(
x_raw()) * lsb_to_ut_xy(),
220 static_cast<float>(
y_raw()) * lsb_to_ut_xy(),
221 static_cast<float>(
z_raw()) * lsb_to_ut_z()};
222 float raw_arr[3] = {m[0], m[1], m[2]};
Top level namespace of M5Stack.
Definition ahrs_controller.cpp:26
One measurement (12 bytes burst from REG_MAG_X_XLSB, register 0x31): 9 bytes magnetometer (X,...
Definition unit_bmm350_data.hpp:152
int32_t z_raw() const
Raw magnetometer Z.
Definition unit_bmm350_data.hpp:169
float z_ut() const
Compensated magnetometer Z (uT)
Definition unit_bmm350_data.hpp:198
int32_t x_raw() const
Raw magnetometer X.
Definition unit_bmm350_data.hpp:159
int16_t temp_adc() const
Raw temperature ADC normalized to 16bit (temp_raw24() >> 8)
Definition unit_bmm350_data.hpp:179
std::array< uint8_t, 12 > raw
[0..2] X, [3..5] Y, [6..8] Z, [9..11] temperature
Definition unit_bmm350_data.hpp:153
int32_t y_raw() const
Raw magnetometer Y.
Definition unit_bmm350_data.hpp:164
float x_ut() const
Compensated magnetometer X (uT)
Definition unit_bmm350_data.hpp:188
int32_t temp_raw24() const
Raw temperature ADC (24bit, sign-extended)
Definition unit_bmm350_data.hpp:174
otp_compensation_t comp
OTP compensation coefficients used by x_ut()/y_ut()/z_ut()
Definition unit_bmm350_data.hpp:154
float y_ut() const
Compensated magnetometer Y (uT)
Definition unit_bmm350_data.hpp:193
Per-chip OTP compensation coefficients (read out at boot from the sensor's one-time-programmable memo...
Definition unit_bmm350_data.hpp:102
float tcs[3]
Per-axis (x,y,z) temperature coefficient of sensitivity.
Definition unit_bmm350_data.hpp:109
float compensate_temp(const float t_raw) const
Applies the OTP temperature compensation to a primary-converted temperature (degC)
Definition unit_bmm350_data.hpp:113
float t_sens
Temperature sensitivity coefficient.
Definition unit_bmm350_data.hpp:103
float sens[3]
Per-axis (x,y,z) sensitivity coefficient.
Definition unit_bmm350_data.hpp:107
float tco[3]
Per-axis (x,y,z) temperature coefficient of offset.
Definition unit_bmm350_data.hpp:108
float cross[4]
Cross-axis coefficients: [0]=x_y [1]=y_x [2]=z_x [3]=z_y.
Definition unit_bmm350_data.hpp:110
float t_offs
Temperature offset coefficient.
Definition unit_bmm350_data.hpp:104
float offset[3]
Per-axis (x,y,z) offset.
Definition unit_bmm350_data.hpp:106
void compensate_mag(float(&m)[3], const float t_comp) const
Applies per-axis offset/sensitivity/tco/tcs and cross-axis compensation (in-place) to primary-convert...
Definition unit_bmm350_data.hpp:120
float t0
Reference temperature (degC)
Definition unit_bmm350_data.hpp:105
constexpr float lsb_to_ut_z()
uT per LSB of the raw 24bit magnetometer value, Z axis
Definition unit_bmm350_data.hpp:79
constexpr float TEMP_OFFSET
Fixed offset (degC) applied to the primary temperature conversion.
Definition unit_bmm350_data.hpp:89
Averaging
Averaging factor (REG_PMU_CMD_AGGR_SET register 0x04, bits[5:4])
Definition unit_bmm350_data.hpp:41
@ X2
2 samples averaged (Regular, power-on default)
@ X4
4 samples averaged (LowNoise)
@ X8
8 samples averaged (UltraLowNoise)
constexpr float lsb_to_ut_xy()
uT per LSB of the raw 24bit magnetometer value, X/Y axes
Definition unit_bmm350_data.hpp:74
DataRate
Output data rate (REG_PMU_CMD_AGGR_SET register 0x04, bits[3:0])
Definition unit_bmm350_data.hpp:25
constexpr float temp_res_raw24()
degC per LSB of the raw 24bit temperature ADC value
Definition unit_bmm350_data.hpp:84
constexpr Averaging clamp_averaging(const DataRate rate, const Averaging avg)
Clamps avg to the combination the sensor accepts for the given rate (400Hz allows None only,...
Definition unit_bmm350_data.hpp:51
constexpr int32_t fix_sign24(const uint32_t raw)
Sign-extends a 24bit unsigned register value to a signed 32bit value.
Definition unit_bmm350_data.hpp:62