64 static constexpr
Acc::AccRange_t ACC_RANGE =
Acc::AccRange::G3;
65 static constexpr
Gyro::GyroRange_t GYRO_RANGE =
Gyro::GyroRange::DPS2000;
70 static constexpr
float GYRO_RANGE_MAX_RAD_PER_S =
modm::toRadian(2000.0f);
72 static constexpr
float BMI088_TEMP_FACTOR = 0.125f;
73 static constexpr
float BMI088_TEMP_OFFSET = 23.0f;
79 static constexpr
float GYRO_RAD_PER_S_PER_GYRO_COUNT = GYRO_RANGE_MAX_RAD_PER_S / 32767.0f;
85 static constexpr
float ACC_G_PER_ACC_COUNT =
86 modm::pow(2, ACC_RANGE.value + 1) * 1.5f *
tap::algorithms::ACCELERATION_GRAVITY / 32768.0f;
91 mockable void initialize(
float sampleFrequency,
float mahonyKp,
float mahonyKi) override;
110 accOversampling = oversampling;
112 inline void setAccOutputRate(Acc::AccOutputRate outputRate) { accOutputRate = outputRate; }
118 imuHeater.setDesiredTemperature(temperatureC);
124 inline float getAccelerationSensitivity()
const override {
return ACC_G_PER_ACC_COUNT; }
126 static constexpr uint16_t RAW_TEMPERATURE_TO_APPLY_OFFSET = 1023;
128 static constexpr int16_t RAW_TEMPERATURE_OFFSET = -2048;
132 Acc::AccBandwidth accOversampling = Acc::AccBandwidth::NORMAL;
133 Acc::AccOutputRate accOutputRate = Acc::AccOutputRate::Hz800;
135 void initializeAcc();
137 Gyro::GyroBandwidth gyroOutputRate = Gyro::GyroBandwidth::ODR1000_BANDWIDTH116;
138 void initializeGyro();
140 void setAndCheckAccRegister(Acc::Register reg, Acc::Registers_t value);
142 void setAndCheckGyroRegister(Gyro::Register reg, Gyro::Registers_t value);
151 static inline float parseTemp(uint8_t tempMsb, uint8_t tempLsb)
154 (
static_cast<uint16_t
>(tempMsb) * 8) + (
static_cast<uint16_t
>(tempLsb) / 32);
156 int16_t shiftedTemp =
static_cast<int16_t
>(temp);
158 if (temp > RAW_TEMPERATURE_TO_APPLY_OFFSET)
160 shiftedTemp += RAW_TEMPERATURE_OFFSET;
163 return static_cast<float>(shiftedTemp) * BMI088_TEMP_FACTOR + BMI088_TEMP_OFFSET;