103 lines
3.1 KiB
C++
103 lines
3.1 KiB
C++
/*!
|
|
* @file Adafruit_ICM20948.h
|
|
*
|
|
* I2C Driver for the Adafruit ICM20948 9-DoF Accelerometer, Gyro, and
|
|
*Magnetometer library
|
|
*
|
|
* This is a library for the Adafruit ICM20948 breakout:
|
|
* https://www.adafruit.com/products/4554
|
|
*
|
|
* Adafruit invests time and resources providing this open source code,
|
|
* please support Adafruit and open-source hardware by purchasing products from
|
|
* Adafruit!
|
|
*
|
|
*
|
|
* BSD license (see license.txt)
|
|
*/
|
|
|
|
#ifndef _ADAFRUIT_ICM20948_H
|
|
#define _ADAFRUIT_ICM20948_H
|
|
|
|
#include "Adafruit_ICM20X.h"
|
|
|
|
#define ICM20948_I2CADDR_DEFAULT 0x69 ///< ICM20948 default i2c address
|
|
#define ICM20948_MAG_ID 0x09 ///< The chip ID for the magnetometer
|
|
|
|
#define ICM20948_UT_PER_LSB 0.15 ///< mag data LSB value (fixed)
|
|
|
|
#define AK09916_WIA2 0x01 ///< Magnetometer
|
|
#define AK09916_ST1 0x10 ///< Magnetometer
|
|
#define AK09916_HXL 0x11 ///< Magnetometer
|
|
#define AK09916_HXH 0x12 ///< Magnetometer
|
|
#define AK09916_HYL 0x13 ///< Magnetometer
|
|
#define AK09916_HYH 0x14 ///< Magnetometer
|
|
#define AK09916_HZL 0x15 ///< Magnetometer
|
|
#define AK09916_HZH 0x16 ///< Magnetometer
|
|
#define AK09916_ST2 0x18 ///< Magnetometer
|
|
#define AK09916_CNTL2 0x31 ///< Magnetometer
|
|
#define AK09916_CNTL3 0x32 ///< Magnetometer
|
|
|
|
/** The accelerometer data range */
|
|
typedef enum {
|
|
ICM20948_ACCEL_RANGE_2_G,
|
|
ICM20948_ACCEL_RANGE_4_G,
|
|
ICM20948_ACCEL_RANGE_8_G,
|
|
ICM20948_ACCEL_RANGE_16_G,
|
|
} icm20948_accel_range_t;
|
|
|
|
/** The gyro data range */
|
|
typedef enum {
|
|
ICM20948_GYRO_RANGE_250_DPS,
|
|
ICM20948_GYRO_RANGE_500_DPS,
|
|
ICM20948_GYRO_RANGE_1000_DPS,
|
|
ICM20948_GYRO_RANGE_2000_DPS,
|
|
} icm20948_gyro_range_t;
|
|
|
|
/**
|
|
* @brief Data rates/modes for the embedded AsahiKASEI AK09916 3-axis
|
|
* magnetometer
|
|
*
|
|
*/
|
|
typedef enum {
|
|
AK09916_MAG_DATARATE_SHUTDOWN = 0x0, ///< Stops measurement updates
|
|
AK09916_MAG_DATARATE_SINGLE =
|
|
0x1, ///< Takes a single measurement then switches to
|
|
///< AK09916_MAG_DATARATE_SHUTDOWN
|
|
AK09916_MAG_DATARATE_10_HZ = 0x2, ///< updates at 10Hz
|
|
AK09916_MAG_DATARATE_20_HZ = 0x4, ///< updates at 20Hz
|
|
AK09916_MAG_DATARATE_50_HZ = 0x6, ///< updates at 50Hz
|
|
AK09916_MAG_DATARATE_100_HZ = 0x8, ///< updates at 100Hz
|
|
} ak09916_data_rate_t;
|
|
|
|
/*!
|
|
* @brief Class that stores state and functions for interacting with
|
|
* the ST ICM2948 9-DoF Accelerometer, gyro, and magnetometer
|
|
*/
|
|
class Adafruit_ICM20948 : public Adafruit_ICM20X {
|
|
public:
|
|
Adafruit_ICM20948();
|
|
~Adafruit_ICM20948(){};
|
|
bool begin_I2C(uint8_t i2c_addr = ICM20948_I2CADDR_DEFAULT,
|
|
TwoWire *wire = &Wire, int32_t sensor_id = 0);
|
|
|
|
icm20948_accel_range_t getAccelRange(void);
|
|
void setAccelRange(icm20948_accel_range_t new_accel_range);
|
|
|
|
icm20948_gyro_range_t getGyroRange(void);
|
|
void setGyroRange(icm20948_gyro_range_t new_gyro_range);
|
|
|
|
ak09916_data_rate_t getMagDataRate(void);
|
|
bool setMagDataRate(ak09916_data_rate_t rate);
|
|
|
|
private:
|
|
uint8_t readMagRegister(uint8_t reg_addr);
|
|
bool writeMagRegister(uint8_t reg_addr, uint8_t value);
|
|
|
|
uint8_t getMagId(void);
|
|
bool auxI2CBusSetupFailed(void);
|
|
|
|
bool setupMag(void);
|
|
void scaleValues(void);
|
|
};
|
|
|
|
#endif |