该库与 InvensenseMPU-6500、InvenSense MPU-9250 和 MPU-9255 惯性测量单元 (IMU) 进行通信。该库与 Arduino 和 CMake 构建系统兼容。
Invense MPU-6500是一款三轴陀螺仪和三轴加速度计。 InvenSense MPU-9250 是一款系统级封装 (SiP),结合了两个芯片:MPU-6500 三轴陀螺仪和三轴加速度计;和 AK8963 三轴磁力计。 MPU-6500 和 MPU-9250 支持 I2C(高达 400 kHz)和 SPI 通信,寄存器设置高达 1 MHz,数据读取高达 20 MHz。提供以下可选满量程传感器范围:
陀螺仪满量程范围 | 加速度计满量程范围 | 磁力计满量程(仅限 MPU-9250) |
---|---|---|
+/- 250 度/秒 | +/- 2克 | +/- 4800 UT |
+/- 500 度/秒 | +/- 4克 | |
+/- 1000 度/秒 | +/- 8克 | |
+/- 2000 度/秒 | +/- 16克 |
IMU 使用 16 位模数转换器对陀螺仪、加速度计和磁力计进行采样。它还具有可编程数字滤波器、精密时钟和嵌入式温度传感器。
使用 Arduino 库管理器安装此库或克隆到 Arduino/libraries 文件夹。
对于 MPU-6500,该库添加为:
# include " mpu6500.h "
对于 MPU-9250,该库添加为:
# include " mpu9250.h "
示例 Arduino 可执行文件位于: examples/arduino/ 。 Teensy 3.x、4.x 和 LC 设备用于在 Arduino 下进行测试,该库应与其他 Arduino 设备兼容。
CMake 用于构建此库,该库导出为名为invensense_imu 的库目标。
对于 MPU-6500,该库添加为:
# include " mpu6500.h "
对于 MPU-9250,该库添加为:
# include " mpu9250.h "
该库还可以使用创建构建目录的 CMake 惯用法进行独立编译,然后从该目录中发出:
cmake .. -DMCU=MK66FX1M0
make
这将构建名为i2c_example 、 spi_example 、 drdy_spi_example和wom_example的库和示例可执行文件(仅限 MPU-9250)。示例可执行源文件位于Examples/cmake 。请注意, cmake命令包含一个定义,指定正在为其编译代码的微控制器。这是正确配置代码、CPU 频率和编译/链接器选项所必需的。可用的 MCU 有:
众所周知,它们可与 Teensy 产品中使用的相同软件包一起使用。此外,众所周知,只要只是更改包,切换包的效果就很好。
示例目标分别创建可执行文件,用于使用 I2C 或 SPI 通信、使用数据就绪中断以及使用运动唤醒中断与传感器进行通信。每个目标还有一个_hex ,用于创建要上传到微控制器的十六进制文件,以及一个_upload ,用于使用 Teensy CLI 上传器刷新 Teensy。请注意,有关设置构建环境的说明可以在我们的构建工具存储库中找到。
该库位于名称空间bfs内。
此类提供了读取和写入这些传感器上的寄存器的方法。预计该功能至少适用于 MPU-6000、MPU-6050、MPU-6500、MPU-9150 和 MPU-9250;不过,它也可能适用于其他传感器。大多数用户可能更喜欢下面的传感器特定类别;然而,此类可以使人们解锁更多功能并用作他们自己的传感器驱动程序的起点。
InvensenseImu()默认构造函数,需要调用Config方法来设置 I2C 或 SPI 总线以及 I2C 地址或 SPI 片选引脚。
InvensenseImu(TwoWire *i2c, const uint8_t addr)创建一个 InvensenseImu 对象。该构造函数用于 I2C 通信接口。指向 I2C 总线对象的指针与传感器的 I2C 地址一起传递。
InvensenseImu(SPIClass *bus, uint8_t cs)创建一个 InvensenseImu 对象。该构造函数用于SPI通信接口。指向 SPI 总线对象的指针与传感器的片选引脚一起传递。任何支持数字 I/O 的引脚均可用作片选引脚。
void Config(TwoWire *bus, const uint8_t addr)使用默认构造函数并设置 I2C 总线和 I2C 地址时需要此参数。
void Config(SPIClass *spi, const uint8_t cs)使用默认构造函数并设置 SPI 总线和片选引脚时需要此参数。
void Begin()初始化与传感器的通信。通信总线不在该库内初始化,必须单独初始化;这增强了与同一总线上的其他传感器的兼容性。
bool WriteRegister(const uint8_t reg, const uint8_t data, const int32_t spi_clock)将寄存器数据写入给定寄存器地址和数据的传感器。如果使用 SPI 通信,则必须指定 SPI 时钟速度。
bool WriteRegister(const uint8_t reg, const uint8_t data)使用 I2C 通信时重载上述内容。
bool ReadRegisters(const uint8_t reg, const uint8_t count, const int32_t spi_clock, uint8_t * const data)根据给定的寄存器地址、要读取的寄存器数量、SPI 时钟和用于存储数据的指针,从传感器读取寄存器数据。
bool ReadRegisters(const uint8_t reg, const uint8_t count, uint8_t * const data)使用 I2C 通信时重载上述内容。
该类适用于 MPU-9250 和 MPU-9255 IMU。
Mpu9250()默认构造函数,需要调用Config方法来设置 I2C 或 SPI 总线以及 I2C 地址或 SPI 片选引脚。
Mpu9250(i2c_t3 *bus, I2cAddr addr)创建 Mpu9250 对象。该构造函数用于 I2C 通信接口。指向 I2C 总线对象的指针与传感器的 I2C 地址一起传递。如果 AD0 引脚接地,地址将为 I2C_ADDR_PRIM (0x68);如果 AD0 引脚拉高,地址将为 I2C_ADDR_SEC (0x69)。
Mpu9250 mpu9250 (&Wire, bfs::Mpu9250::I2C_ADDR_PRIM);
Mpu9250(SPIClass *bus, uint8_t cs)创建 Mpu9250 对象。该构造函数用于SPI通信接口。指向 SPI 总线对象的指针与传感器的片选引脚一起传递。任何支持数字 I/O 的引脚均可用作片选引脚。
Mpu9250 mpu9250 (&SPI, 2 );
void Config(TwoWire *bus, const I2cAddr addr)使用默认构造函数并设置 I2C 总线和 I2C 地址时需要此参数。如果 AD0 引脚接地,地址将为 I2C_ADDR_PRIM (0x68);如果 AD0 引脚拉高,地址将为 I2C_ADDR_SEC (0x69)。
void Config(SPIClass *spi, const uint8_t cs)使用默认构造函数并设置 SPI 总线和片选引脚时需要此参数。
bool Begin()初始化与传感器的通信并配置默认传感器范围、采样率和低通滤波器设置。默认加速度计范围为 +/- 16g,默认陀螺仪范围为 +/- 2,000 deg/s。默认采样率为 1000 Hz,低通滤波器设置为 184 Hz 截止频率。如果能够与传感器建立通信并且配置成功完成,则返回 True,否则返回 false。通信总线不在该库内初始化,必须单独初始化;这增强了与同一总线上的其他传感器的兼容性。
Wire.begin();
Wire.setClock( 400000 );
bool status = mpu9250.Begin();
if (!status) {
// ERROR
}
bool EnableDrdyInt()启用数据就绪中断。当 IMU 数据准备好时,MPU-9250 INT 引脚将触发 50 us 中断。该中断高电平有效。如果中断使能成功,该方法返回 true,否则返回 false。
bool status = mpu9250.EnableDrdyInt();
if (!status) {
// ERROR
}
bool DisableDrdyInt()禁用数据就绪中断。如果中断成功禁用,该方法返回 true,否则返回 false。
bool status = mpu9250.DisableDrdyInt();
if (!status) {
// ERROR
}
bool ConfigAccelRange(const AccelRange range)设置加速度计满量程范围。选项有:
范围 | 枚举值 |
---|---|
+/- 2克 | ACCEL_RANGE_2G |
+/- 4克 | ACCEL_RANGE_4G |
+/- 8克 | ACCEL_RANGE_8G |
+/- 16克 | ACCEL_RANGE_16G |
加速度计范围设置成功则返回True,否则返回False。默认范围为 +/-16g。
bool status = mpu9250.ConfigAccelRange(bfs::Mpu9250::ACCEL_RANGE_4G);
if (!status) {
// ERROR
}
AccelRange accel_range()返回当前加速度计范围。
AccelRange range = mpu9250.accel_range();
bool ConfigGyroRange(const GyroRange range)设置陀螺仪满量程范围。选项有:
范围 | 枚举值 |
---|---|
+/- 250 度/秒 | GYRO_RANGE_250DPS |
+/- 500 度/秒 | GYRO_RANGE_500DPS |
+/- 1000 度/秒 | GYRO_RANGE_1000DPS |
+/- 2000 度/秒 | GYRO_RANGE_2000DPS |
设置陀螺仪范围成功则返回true,否则返回false。默认范围为 +/-2000 度/秒。
bool status = mpu9250.ConfigGyroRange(bfs::Mpu9250::GYRO_RANGE_1000DPS);
if (!status) {
// ERROR
}
GyroRange gyro_range()返回当前陀螺仪范围。
GyroRange range = mpu9250.gyro_range();
bool ConfigSrd(const uint8_t srd)设置传感器采样率分频器。 MPU-9250 以 Hz 为单位对加速度计和陀螺仪进行采样,定义如下:
srd设置为 0 表示 MPU-9250 以 1000 Hz 的频率对加速度计和陀螺仪进行采样。 srd设置为 4 会将采样频率设置为 200 Hz。 IMU 数据就绪中断与采样率分频器定义的速率相关。磁力计以 100 Hz 采样,采样率分频器值对应于 100 Hz 或更高。否则,磁力计将以 8 Hz 采样。
成功设置采样率分频器则返回 True,否则返回 false。默认采样率分频器值为 0,即采样率为 1000 Hz。
/* Set sample rate divider for 50 Hz */
bool status = mpu9250.sample_rate_divider( 19 );
if (!status) {
// ERROR
}
uint8_t srd()返回当前采样率分频器值。
uint8_t srd = mpu9250.srd();
bool ConfigDlpfBandwidth(const DlpfBandwidth dlpf)设置加速度计、陀螺仪和温度传感器的数字低通滤波器的截止频率。可用带宽有:
DLPF 带宽 | 枚举值 |
---|---|
184赫兹 | DLPF_BANDWIDTH_184HZ |
92赫兹 | DLPF_BANDWIDTH_92HZ |
41赫兹 | DLPF_BANDWIDTH_41HZ |
20赫兹 | DLPF_BANDWIDTH_20HZ |
10赫兹 | DLPF_BANDWIDTH_10HZ |
5赫兹 | DLPF_BANDWIDTH_5HZ |
数字低通滤波器设置成功则返回 True,否则返回 false。默认带宽为 184 Hz。
bool status = mpu9250.ConfigDlpfBandwidth(bfs::Mpu9250::DLPF_BANDWIDTH_20HZ);
if (!status) {
// ERROR
}
DlpfBandwidth dlpf_bandwidth()返回当前数字低通滤波器带宽设置。
DlpfBandwidth dlpf = mpu9250.dlpf_bandwidth();
bool EnableWom(int16_t Threshold_mg, const WomRate wom_rate)启用运动唤醒中断。它将 MPU-9250 置于低功耗状态,并按照WomRate确定的时间间隔唤醒。如果加速度计检测到运动超过阈值, threshold_mg ,它会从 MPU-9250 中断引脚生成一个 50us 脉冲。支持以下列举的 WOM 率:
口碑采样率 | 枚举值 |
---|---|
0.24赫兹 | WOM_RATE_0_24HZ |
0.49赫兹 | WOM_RATE_0_49HZ |
0.98赫兹 | WOM_RATE_0_98HZ |
1.95赫兹 | WOM_RATE_1_95HZ |
3.91赫兹 | WOM_RATE_3_91HZ |
7.81赫兹 | WOM_RATE_7_81HZ |
15.63赫兹 | WOM_RATE_15_63HZ |
31.25赫兹 | WOM_RATE_31_25HZ |
62.50赫兹 | WOM_RATE_62_50HZ |
125赫兹 | WOM_RATE_125HZ |
250赫兹 | WOM_RATE_250HZ |
500赫兹 | WOM_RATE_500HZ |
运动阈值指定为 4 到 1020 mg 之间的值,该值在内部映射到单个字节 1-255 值。如果成功启用运动唤醒,此函数将返回 true,否则返回 false。请参阅wom_i2c示例。以下是使用 40 mg 阈值和 31.25 Hz ODR 启用运动唤醒的示例。
imu.EnableWom( 40 , bfs::Mpu9250::WOM_RATE_31_25HZ);
void Reset()重置 MPU-9250。
bool Read()从 MPU-9250 读取数据并将数据存储在 Mpu9250 对象中。如果数据读取成功则返回 true,否则返回 false。
/* Read the IMU data */
if (mpu9250.Read()) {
}
bool new_imu_data()如果从加速度计和陀螺仪返回新数据,则返回 true。
if (mpu9250.Read()) {
bool new_data = mpu9250. new_imu_data ();
}
bool new_mag_data()如果从磁力计返回新数据,则返回 true。对于 100 Hz 及更高的 MPU-9250 采样率,磁力计以 100 Hz 采样。对于低于 100 Hz 的 MPU-9250 采样率,磁力计以 8 Hz 采样,因此接收新的 IMU 数据而不是新的磁力计数据的情况并不少见。
if (mpu9250.Read()) {
bool new_mag = mpu9250. new_mag_data ();
}
float accel_x_mps2()返回 Mpu9250 对象的 x 加速度计数据,单位为 m/s/s。对于 y 轴和 z 轴数据也存在类似的方法。
/* Read the IMU data */
if (mpu9250.Read()) {
float ax = mpu9250. accel_x_mps2 ();
float ay = mpu9250. accel_y_mps2 ();
float az = mpu9250. accel_z_mps2 ();
}
float gyro_x_radps()返回 Mpu9250 对象的 x 陀螺仪数据,单位为 rad/s。对于 y 轴和 z 轴数据也存在类似的方法。
/* Read the IMU data */
if (mpu9250.Read()) {
float gx = mpu9250. gyro_x_radps ();
float gy = mpu9250. gyro_y_radps ();
float gz = mpu9250. gyro_z_radps ();
}
float mag_x_ut()返回来自 Mpu9250 对象的 x 磁力计数据(以 uT 为单位)。对于 y 轴和 z 轴数据也存在类似的方法。
/* Read the IMU data */
if (mpu9250.Read()) {
float hx = mpu9250. mag_x_ut ();
float hy = mpu9250. mag_y_ut ();
float hz = mpu9250. mag_z_ut ();
}
float die_temp_c()返回传感器的芯片温度,单位为 C。
/* Read the IMU data */
if (mpu9250.Read()) {
float temp = mpu9250. die_temp_c ();
}
该类与 MPU-6500 传感器配合使用。
Mpu6500()默认构造函数,需要调用Config方法来设置 I2C 或 SPI 总线以及 I2C 地址或 SPI 片选引脚。
Mpu6500(i2c_t3 *bus, I2cAddr addr)创建 Mpu6500 对象。该构造函数用于 I2C 通信接口。指向 I2C 总线对象的指针与传感器的 I2C 地址一起传递。如果 AD0 引脚接地,地址将为 I2C_ADDR_PRIM (0x68);如果 AD0 引脚拉高,地址将为 I2C_ADDR_SEC (0x69)。
Mpu6500 mpu6500 (&Wire, bfs::Mpu6500::I2C_ADDR_PRIM);
Mpu6500(SPIClass *bus, uint8_t cs)创建 Mpu6500 对象。该构造函数用于SPI通信接口。指向 SPI 总线对象的指针与传感器的片选引脚一起传递。任何支持数字 I/O 的引脚均可用作片选引脚。
Mpu6500 mpu6500 (&SPI, 2 );
void Config(TwoWire *bus, const I2cAddr addr)使用默认构造函数并设置 I2C 总线和 I2C 地址时需要此参数。如果 AD0 引脚接地,地址将为 I2C_ADDR_PRIM (0x68);如果 AD0 引脚拉高,地址将为 I2C_ADDR_SEC (0x69)。
void Config(SPIClass *spi, const uint8_t cs)使用默认构造函数并设置 SPI 总线和片选引脚时需要此参数。
bool Begin()初始化与传感器的通信并配置默认传感器范围、采样率和低通滤波器设置。默认加速度计范围为 +/- 16g,默认陀螺仪范围为 +/- 2,000 deg/s。默认采样率为 1000 Hz,低通滤波器设置为 184 Hz 截止频率。如果能够与传感器建立通信并且配置成功完成,则返回 True,否则返回 false。通信总线不在该库内初始化,必须单独初始化;这增强了与同一总线上的其他传感器的兼容性。
Wire.begin();
Wire.setClock( 400000 );
bool status = mpu6500.Begin();
if (!status) {
// ERROR
}
bool EnableDrdyInt()启用数据就绪中断。当 IMU 数据准备好时,MPU-9250 INT 引脚将触发 50 us 中断。该中断高电平有效。如果中断使能成功,该方法返回 true,否则返回 false。
bool status = mpu6500.EnableDrdyInt();
if (!status) {
// ERROR
}
bool DisableDrdyInt()禁用数据就绪中断。如果中断成功禁用,该方法返回 true,否则返回 false。
bool status = mpu6500.DisableDrdyInt();
if (!status) {
// ERROR
}
bool ConfigAccelRange(const AccelRange range)设置加速度计满量程范围。选项有:
范围 | 枚举值 |
---|---|
+/- 2克 | ACCEL_RANGE_2G |
+/- 4克 | ACCEL_RANGE_4G |
+/- 8克 | ACCEL_RANGE_8G |
+/- 16克 | ACCEL_RANGE_16G |
加速度计范围设置成功则返回True,否则返回False。默认范围为 +/-16g。
bool status = mpu6500.ConfigAccelRange(bfs::Mpu6500::ACCEL_RANGE_4G);
if (!status) {
// ERROR
}
AccelRange accel_range()返回当前加速度计范围。
AccelRange range = mpu6500.accel_range();
bool ConfigGyroRange(const GyroRange range)设置陀螺仪满量程范围。选项有:
范围 | 枚举值 |
---|---|
+/- 250 度/秒 | GYRO_RANGE_250DPS |
+/- 500 度/秒 | GYRO_RANGE_500DPS |
+/- 1000 度/秒 | GYRO_RANGE_1000DPS |
+/- 2000 度/秒 | GYRO_RANGE_2000DPS |
设置陀螺仪范围成功则返回true,否则返回false。默认范围为 +/-2000 度/秒。
bool status = mpu6500.ConfigGyroRange(bfs::Mpu6500::GYRO_RANGE_1000DPS);
if (!status) {
// ERROR
}
GyroRange gyro_range()返回当前陀螺仪范围。
GyroRange range = mpu6500.gyro_range();
bool ConfigSrd(const uint8_t srd)设置传感器采样率分频器。 MPU-9250 以 Hz 为单位对加速度计和陀螺仪进行采样,定义如下:
srd设置为 0 表示 MPU-9250 以 1000 Hz 的频率对加速度计和陀螺仪进行采样。 srd设置为 4 会将采样频率设置为 200 Hz。 IMU 数据就绪中断与采样率分频器定义的速率相关。磁力计以 100 Hz 采样,采样率分频器值对应于 100 Hz 或更高。否则,磁力计将以 8 Hz 采样。
成功设置采样率分频器则返回 True,否则返回 false。默认采样率分频器值为 0,即采样率为 1000 Hz。
/* Set sample rate divider for 50 Hz */
bool status = mpu6500.sample_rate_divider( 19 );
if (!status) {
// ERROR
}
uint8_t srd()返回当前采样率分频器值。
uint8_t srd = mpu6500.srd();
bool ConfigDlpfBandwidth(const DlpfBandwidth dlpf)设置加速度计、陀螺仪和温度传感器的数字低通滤波器的截止频率。可用带宽有:
DLPF 带宽 | 枚举值 |
---|---|
184赫兹 | DLPF_BANDWIDTH_184HZ |
92赫兹 | DLPF_BANDWIDTH_92HZ |
41赫兹 | DLPF_BANDWIDTH_41HZ |
20赫兹 | DLPF_BANDWIDTH_20HZ |
10赫兹 | DLPF_BANDWIDTH_10HZ |
5赫兹 | DLPF_BANDWIDTH_5HZ |
数字低通滤波器设置成功则返回 True,否则返回 false。默认带宽为 184 Hz。
bool status = mpu6500.ConfigDlpfBandwidth(bfs::Mpu6500::DLPF_BANDWIDTH_20HZ);
if (!status) {
// ERROR
}
DlpfBandwidth dlpf_bandwidth()返回当前数字低通滤波器带宽设置。
DlpfBandwidth dlpf = mpu6500.dlpf_bandwidth();
bool Read()从 MPU-6500 读取数据并将数据存储在 Mpu6500 对象中。如果数据读取成功则返回 true,否则返回 false。
/* Read the IMU data */
if (mpu6500.Read()) {
}
bool new_imu_data()如果从加速度计和陀螺仪返回新数据,则返回 true。
if (mpu6500.Read()) {
bool new_data = mpu6500. new_imu_data ();
}
float accel_x_mps2()返回 Mpu6500 对象的 x 加速度计数据,单位为 m/s/s。对于 y 轴和 z 轴数据也存在类似的方法。
/* Read the IMU data */
if (mpu6500.Read()) {
float ax = mpu6500. accel_x_mps2 ();
float ay = mpu6500. accel_y_mps2 ();
float az = mpu6500. accel_z_mps2 ();
}
float gyro_x_radps()返回 Mpu6500 对象的 x 陀螺仪数据,单位为 rad/s。对于 y 轴和 z 轴数据也存在类似的方法。
/* Read the IMU data */
if (mpu6500.Read()) {
float gx = mpu6500. gyro_x_radps ();
float gy = mpu6500. gyro_y_radps ();
float gz = mpu6500. gyro_z_radps ();
}
float die_temp_c()返回传感器的芯片温度,单位为 C。
/* Read the IMU data */
if (mpu6500.Read()) {
float temp = mpu6500. die_temp_c ();
}
该库在返回之前将所有数据转换为公共轴系统。该轴系统如下所示。它是 Z 轴正向下的右手坐标系,在飞机动力学中很常见。
警告!该轴系统是相对于 MPU-6500 和 MPU-9250 传感器显示的。传感器可以相对于分线板旋转。