32 lines
1.1 KiB
C++
32 lines
1.1 KiB
C++
#pragma once
|
|
#include "config.h"
|
|
#include "LSM6DS3.h"
|
|
|
|
extern LSM6DS3 imu;
|
|
|
|
// Sensor configuration used by the tracking pipeline.
|
|
// Gyro ±1000 dps (35 mdps/LSB): fine enough that quantisation sits below the
|
|
// sensor noise floor, while hand flicks never saturate. Accel ±4 g.
|
|
// Every sample is read from the hardware FIFO, so integration uses the sensor's
|
|
// own sample clock instead of loop timing, and nothing is lost when the loop stalls.
|
|
constexpr float IMU_ODR_HZ = 208.0f;
|
|
constexpr float IMU_DT = 1.0f / IMU_ODR_HZ;
|
|
constexpr float GYRO_DPS_PER_LSB = 0.035f;
|
|
constexpr float GYRO_RAD_PER_LSB = GYRO_DPS_PER_LSB * (PI / 180.0f);
|
|
constexpr float ACCEL_G_PER_LSB = 0.000122f;
|
|
|
|
struct ImuRaw { int16_t gx, gy, gz, ax, ay, az; };
|
|
|
|
extern uint32_t imuFifoOverruns;
|
|
extern uint32_t imuI2cErrors;
|
|
|
|
void imuWriteReg(uint8_t reg, uint8_t val);
|
|
uint8_t imuReadReg(uint8_t reg);
|
|
void imuConfigure();
|
|
void imuFifoReset();
|
|
int imuReadFifo(ImuRaw* out, int maxSamples);
|
|
float readIMUTemp();
|
|
void calibrateGyroBias();
|
|
float applyCurve(float v);
|
|
float applyAcceleration(float d);
|