Files
air-mouse/source/imu.h
T

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);