M5Unit-IMU 0.0.2 git rev:e5b00aa
Loading...
Searching...
No Matches
unit_bmm150.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_BMM150_HPP
11#define M5_UNIT_IMU_UNIT_UNIT_BMM150_HPP
12
13#include <M5UnitComponent.hpp>
14#include <m5_utility/container/circular_buffer.hpp>
15#include <memory>
16#include "unit_bmm150_data.hpp"
18
19namespace m5 {
20namespace unit {
21
28class UnitBMM150 : public Component,
29 public PeriodicMeasurementAdapter<UnitBMM150, bmm150::Data>,
31 M5_UNIT_COMPONENT_HPP_BUILDER(UnitBMM150, 0x10);
32
33public:
40 struct config_t {
42 bool start_periodic{true};
44 bmm150::Preset preset{bmm150::Preset::Regular};
46 bmm150::DataRate rate{bmm150::DataRate::Rate30Hz};
47 };
48
51 explicit UnitBMM150(const uint8_t addr = DEFAULT_ADDRESS);
53 virtual ~UnitBMM150()
54 {
55 }
56
58 virtual bool begin() override;
61 virtual void update(const bool force = false) override;
62
68 {
69 return _cfg;
70 }
73 void config(const config_t& cfg)
74 {
75 _cfg = cfg;
76 }
78
86 bool writePreset(const bmm150::Preset preset);
98 bool writeRepetition(const uint8_t rep_xy, const uint8_t rep_z);
103 bool readRepetition(uint8_t& rep_xy, uint8_t& rep_z);
108 bool writeDataRate(const bmm150::DataRate rate);
112 bool readDataRate(bmm150::DataRate& rate);
114
123 bool softReset();
125
128
134 bool startPeriodicMeasurement(const bmm150::DataRate rate, const bmm150::Preset preset);
142
145
153 bool sleep() override;
162 bool wakeup() override;
164
169 virtual m5::imu::Capability imuSpec() const override
170 {
171 return m5::imu::Capability::Mag;
172 }
179 virtual void imuConvertParam(m5::imu::imu_convert_param_t& out) const override;
181
182protected:
183 bool start_periodic_measurement(const bmm150::DataRate rate, const bmm150::Preset preset);
184 bool start_periodic_measurement();
185 bool stop_periodic_measurement();
186 bool read_measurement(bmm150::Data& d);
187 // Rate/repetition writers without the "does it fit" check. Needed because the public setters
188 // validate against whatever is on the device right now, which makes a valid target pair fail
189 // when applied one at a time: going from 30Hz/Regular to 10Hz/HighAccuracy has to pass through
190 // one combination that does not fit whichever half is written first. start_periodic_measurement()
191 // validates the pair up front instead and then writes both unchecked.
192 bool write_repetition_unchecked(const uint8_t rep_xy, const uint8_t rep_z);
193 bool write_data_rate_unchecked(const bmm150::DataRate rate);
194 bool write_register8_verified(const uint8_t reg, const uint8_t val);
195 bool read_trim(bmm150::trim_t& trim);
196
197 M5_UNIT_COMPONENT_PERIODIC_MEASUREMENT_ADAPTER_HPP_BUILDER(UnitBMM150, bmm150::Data);
198
199private:
200 config_t _cfg{};
201 bmm150::trim_t _trim{};
202 uint32_t _pushed{}, _consumed{}; // readImuRaw pop counters (do not disturb latest()/oldest())
203 std::unique_ptr<m5::container::CircularBuffer<bmm150::Data>> _data{};
204};
205
206namespace bmm150 {
209constexpr uint32_t DEFAULT_STORED_SIZE{4};
210
211namespace command {
213// Register addresses (I2C addr 0x10/0x11/0x12/0x13 by CSB/SDO pins)
214constexpr uint8_t REG_CHIP_ID{0x40};
215constexpr uint8_t REG_DATA_X_LSB{0x42}; // 8 bytes: X/Y/Z/RHALL burst (bit0 of [6] = DRDY)
216constexpr uint8_t REG_INT_STATUS{0x4A};
217constexpr uint8_t REG_POWER_CONTROL{0x4B}; // bit7+bit1 = SoftReset / bit0 = PowerControl
218constexpr uint8_t REG_OP_MODE{0x4C}; // bit5:3 = DataRate / bit2:1 = Opmode
219constexpr uint8_t REG_REP_XY{0x51};
220constexpr uint8_t REG_REP_Z{0x52};
221constexpr uint8_t REG_TRIM_START{0x5D}; // 21 bytes: 0x5D..0x71 (see read_trim())
223} // namespace command
224} // namespace bmm150
225
226} // namespace unit
227} // namespace m5
228#endif
Thin contract between measurement units and consumers (e.g. AHRS)
Definition imu_data_source.hpp:27
3-axis magnetometer unit. No standalone GROVE unit exists for this chip; it is found built into some ...
Definition unit_bmm150.hpp:30
config_t config() const
Gets the configuration.
Definition unit_bmm150.hpp:67
virtual m5::imu::Capability readImuRaw(m5::imu::imu_raw_data_t &out) override
Read the latest raw IMU data.
Definition unit_bmm150.cpp:343
void config(const config_t &cfg)
Set the configuration.
Definition unit_bmm150.hpp:73
bool readRepetition(uint8_t &rep_xy, uint8_t &rep_z)
Read the repetition registers from the device (REG_REP_XY/REG_REP_Z)
Definition unit_bmm150.cpp:235
bool writeDataRate(const bmm150::DataRate rate)
Write the output data rate.
Definition unit_bmm150.cpp:240
bool sleep() override
Put the chip into suspend mode (REG_POWER_CONTROL power bit cleared)
Definition unit_bmm150.cpp:181
bool softReset()
Soft reset (REG_POWER_CONTROL soft-reset bits, keeping the power control bit on), leaving the chip in...
Definition unit_bmm150.cpp:98
bool readDataRate(bmm150::DataRate &rate)
Read the output data rate from the device (REG_OP_MODE bits[5:3])
Definition unit_bmm150.cpp:277
bool writeRepetition(const uint8_t rep_xy, const uint8_t rep_z)
Write the repetition (oversampling) registers directly.
Definition unit_bmm150.cpp:214
bool wakeup() override
Bring the chip out of suspend.
Definition unit_bmm150.cpp:195
virtual m5::imu::Capability imuSpec() const override
Capability of this unit.
Definition unit_bmm150.hpp:169
virtual void imuConvertParam(m5::imu::imu_convert_param_t &out) const override
Gets the conversion parameters for raw IMU data.
Definition unit_bmm150.cpp:367
virtual ~UnitBMM150()
Destructor.
Definition unit_bmm150.hpp:53
bool startPeriodicMeasurement()
Start periodic measurement in the current settings.
Definition unit_bmm150.cpp:171
bool writePreset(const bmm150::Preset preset)
Write the accuracy/power preset (REG_REP_XY/REG_REP_Z)
Definition unit_bmm150.cpp:205
UnitBMM150(const uint8_t addr=DEFAULT_ADDRESS)
Construct with the I2C address the chip will answer on.
Definition unit_bmm150.cpp:47
virtual bool begin() override
Begin the unit.
Definition unit_bmm150.cpp:56
virtual void update(const bool force=false) override
Update the unit.
Definition unit_bmm150.cpp:112
bool stopPeriodicMeasurement()
Stop periodic measurement.
Definition unit_bmm150.cpp:176
Public interface for IMU data providers.
Capability
Capability of the IMU data source (bitwise combinable)
Definition imu_types.hpp:22
Top level namespace of M5Stack.
Definition ahrs_controller.cpp:26
Unit-related namespace.
Raw to physical unit conversion coefficients.
Definition imu_types.hpp:69
Unified raw data (chip-native axes, no remap applied)
Definition imu_types.hpp:57
Settings for begin()
Definition unit_bmm150.hpp:40
bmm150::DataRate rate
Output data rate.
Definition unit_bmm150.hpp:46
bmm150::Preset preset
Accuracy/power preset (controls REG_REP_XY/REG_REP_Z)
Definition unit_bmm150.hpp:44
bool start_periodic
Start periodic measurement on begin()?
Definition unit_bmm150.hpp:42
One measurement (8 bytes burst from REG_DATA_X_LSB, register 0x42)
Definition unit_bmm150_data.hpp:143
Factory trim (calibration) values read from registers 0x5D-0x71, consumed by the compensation formula...
Definition unit_bmm150_data.hpp:125
BMM150 setting enums and measurement data (framework independent)
DataRate
Output data rate (REG_OP_MODE register bits 5:3, value order is NOT monotonic in Hz)
Definition unit_bmm150_data.hpp:25
Preset
Preset accuracy/power modes, controlling the REG_REP_XY/REG_REP_Z repetition counts (see preset_rep_x...
Definition unit_bmm150_data.hpp:41