M5Unit-IMU 0.0.2 git rev:e5b00aa
Loading...
Searching...
No Matches
unit_mag3110_data.hpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2026 M5Stack Technology CO LTD
3 *
4 * SPDX-License-Identifier: MIT
5 */
10#ifndef M5_UNIT_IMU_UNIT_UNIT_MAG3110_DATA_HPP
11#define M5_UNIT_IMU_UNIT_UNIT_MAG3110_DATA_HPP
12
13#include <array>
14#include <cstdint>
15#include <cmath>
16
17namespace m5 {
18namespace unit {
19namespace mag3110 {
20
28enum class DataRate : uint8_t {
29 Rate80Hz,
30 Rate40Hz,
31 Rate20Hz,
32 Rate10Hz,
33 Rate5Hz,
34 Rate2_5Hz,
37};
38
47enum class OverSampling : uint8_t {
48 X16,
49 X32,
50 X64,
51 X128,
52};
53
55// Output rate in milli-Hz at OverSampling::X16, indexed by DataRate. Milli-Hz rather than Hz so the
56// oversampling division below stays exact enough at the slow end (0.63Hz / 128 is 4.9mHz)
57constexpr uint32_t OUTPUT_RATE_MHZ[8] = {80000, 40000, 20000, 10000, 5000, 2500, 1250, 630};
59
62constexpr uint32_t output_rate_mhz(const DataRate rate, const OverSampling os)
63{
64 return OUTPUT_RATE_MHZ[static_cast<uint8_t>(rate)] >> static_cast<uint8_t>(os);
65}
66
69constexpr uint32_t interval_ms(const DataRate rate, const OverSampling os)
70{
71 return (1000000U + output_rate_mhz(rate, os) - 1) / output_rate_mhz(rate, os);
72}
73
75constexpr uint8_t ctrl_reg1_active(const DataRate rate, const OverSampling os)
76{
77 return static_cast<uint8_t>((static_cast<uint8_t>(rate) << 5) | (static_cast<uint8_t>(os) << 3) | 0x01);
78}
79
81constexpr float RAW_UT_PER_LSB{0.10f};
83constexpr float OUTPUT_LSB_PER_UT{16.0f};
84
92struct Data {
93 std::array<uint8_t, 7> raw{};
94
96 inline bool drdy() const
97 {
98 return (raw[0] & 0x08) != 0;
99 }
101 inline int16_t x_raw() const
102 {
103 return static_cast<int16_t>((raw[1] << 8) | raw[2]);
104 }
106 inline int16_t y_raw() const
107 {
108 return static_cast<int16_t>((raw[3] << 8) | raw[4]);
109 }
111 inline int16_t z_raw() const
112 {
113 return static_cast<int16_t>((raw[5] << 8) | raw[6]);
114 }
115
117 inline int32_t adj_x() const
118 {
119 return rescale(x_raw());
120 }
122 inline int32_t adj_y() const
123 {
124 return rescale(y_raw());
125 }
127 inline int32_t adj_z() const
128 {
129 return rescale(z_raw());
130 }
131
132private:
133 static inline int32_t rescale(const int16_t raw_axis)
134 {
135 // Native 0.10µT/LSB -> library 16 LSB/µT: raw * 0.10 * 16
136 return static_cast<int32_t>(lroundf(raw_axis * RAW_UT_PER_LSB * OUTPUT_LSB_PER_UT));
137 }
138};
139
140} // namespace mag3110
141} // namespace unit
142} // namespace m5
143#endif
Top level namespace of M5Stack.
Definition ahrs_controller.cpp:26
Unit-related namespace.
One MAG3110 sample: a 7-byte burst from DR_STATUS (0x00)
Definition unit_mag3110_data.hpp:92
int16_t y_raw() const
Raw Y.
Definition unit_mag3110_data.hpp:106
int16_t z_raw() const
Raw Z.
Definition unit_mag3110_data.hpp:111
int32_t adj_z() const
Z rescaled to the library-wide 16 LSB/µT.
Definition unit_mag3110_data.hpp:127
int16_t x_raw() const
Raw X (big-endian, signed 16bit)
Definition unit_mag3110_data.hpp:101
int32_t adj_x() const
X rescaled to the library-wide 16 LSB/µT.
Definition unit_mag3110_data.hpp:117
int32_t adj_y() const
Y rescaled to the library-wide 16 LSB/µT.
Definition unit_mag3110_data.hpp:122
std::array< uint8_t, 7 > raw
DR_STATUS + X/Y/Z (big-endian)
Definition unit_mag3110_data.hpp:93
bool drdy() const
Data ready (DR_STATUS bit3 ZYXDR: new data on one or more axes)
Definition unit_mag3110_data.hpp:96
constexpr uint8_t ctrl_reg1_active(const DataRate rate, const OverSampling os)
REG_CTRL_REG1 value entering continuous ACTIVE measurement (FR and TM left at 0)
Definition unit_mag3110_data.hpp:75
constexpr uint32_t output_rate_mhz(const DataRate rate, const OverSampling os)
Effective output rate in milli-Hz.
Definition unit_mag3110_data.hpp:62
DataRate
Output data rate select (REG_CTRL_REG1 DR[7:5])
Definition unit_mag3110_data.hpp:28
@ Rate80Hz
80Hz at X16 (ADC 1280Hz, 900µA)
@ Rate40Hz
40Hz at X16 (ADC 640Hz, 550µA)
@ Rate0_63Hz
0.63Hz at X16 (ADC 80Hz, 8.6µA)
@ Rate1_25Hz
1.25Hz at X16 (ADC 80Hz, 17.2µA)
@ Rate2_5Hz
2.5Hz at X16 (ADC 80Hz, 34.4µA)
@ Rate5Hz
5Hz at X16 (ADC 80Hz, 68.8µA)
OverSampling
Over sampling ratio (REG_CTRL_REG1 OS[4:3])
Definition unit_mag3110_data.hpp:47