用于与 ICM42688 六轴惯性测量单元 (IMU) 通信的 Arduino 库。
InvenSense ICM42688 支持 I2C(高达 400 kHz)和 SPI 通信,寄存器设置高达 1 MHz,数据读取高达 24 MHz。提供以下可选满量程传感器范围:
陀螺仪满量程范围 | 加速度计满量程范围 |
---|---|
+/- 15.6(度/秒) | - |
+/- 31.2(度/秒) | - |
+/- 62.5(度/秒) | - |
+/- 125(度/秒) | - |
+/- 250(度/秒) | +/- 2(克) |
+/- 500(度/秒) | +/- 4(克) |
+/- 1000(度/秒) | +/- 8(克) |
+/- 2000(度/秒) | +/- 16(克) |
ICM42688 使用 16 位模数转换器对陀螺仪和加速度计进行采样。它还具有可编程数字滤波器、精密时钟、嵌入式温度传感器、可编程中断(包括运动唤醒)和 512 字节 FIFO 缓冲区。
该库支持与 ICM42688 的 I2C 和 SPI 通信。
只需克隆或下载该库到您的 Arduino/libraries 文件夹中即可。
该库支持与 ICM42688 的 I2C 和 SPI 通信。 ICM42688对象声明重载了 I2C 和 SPI 通信的不同声明。所有其他功能保持不变。此外,还包括一个派生类ICM42688FIFO ,除了基本ICM42688类中包含的所有功能之外,它还提供 FIFO 设置和数据收集功能。
ICM42688(TwoWire &bus, uint8_t address)应声明 ICM42688 对象,指定 I2C 总线和 ICM42688 I2C 地址。如果 AD0 引脚接地,则 ICM42688 I2C 地址将为 0x68;如果 AD0 引脚拉高,则 ICM42688 I2C 地址将为 0x69。例如,以下代码声明一个名为IMU的 ICM42688 对象,其中 ICM42688 传感器位于 I2C 总线 0 上,传感器地址为 0x68(AD0 接地)。
ICM42688 IMU (Wire, 0x68 );
ICM42688(TwoWire &bus, uint8_t address)应声明 ICM42688 对象,指定 I2C 总线和 ICM42688 I2C 地址。如果 AD0 引脚接地,则 ICM42688 I2C 地址将为 0x68;如果 AD0 引脚拉高,则 ICM42688 I2C 地址将为 0x69。例如,以下代码声明一个名为IMU的 ICM42688 对象,其中 ICM42688 传感器位于 I2C 总线 0 上,传感器地址为 0x68(AD0 接地)。您应该为 I2C 连接指定 SDA 和 SCL 引脚(Arduino 的默认值为 SDA=18、SCL=19,ESP32 的默认值为 SDA=21、SCL=22)
ICM42688 IMU (Wire, 0x68 , _sda_pin, _scl_pin);
ICM42688FIFO(SPIClass &bus, uint8_t csPin, uint32_t SPI_HS_CLK=8000000)应声明 ICM42688 对象,指定使用的 SPI 总线和片选引脚。多个 ICM42688 或其他 SPI 对象可以在同一 SPI 总线上使用,每个对象都有自己的片选引脚。片选引脚可以是任何可用的数字引脚。例如,以下代码声明了一个名为IMU的 ICM42688 对象,其中 ICM42688 传感器位于 SPI 总线 0 上,片选引脚为 10。
ICM42688 IMU (SPI, 10 );
请注意,默认高速 SPI 总线时钟设置为 8 MHz,但 ICM 42688-p 支持高达 24 MHz SPI 时钟。读取数据时使用更快的时钟可实现更快的 SPI 数据传输。
以下函数用于设置 ICM42688 传感器。这些应该在数据收集之前调用一次,通常是在 Arduino setup()
函数中完成。应始终使用begin()
函数。 (可选) setAccelFS
和setGyroFS
、 setAccelODR
和setGyroODR
函数可用于将加速度计和陀螺仪满量程范围和输出数据速率设置为默认值以外的值。 enableDataReadyInterrupt
和disableDataReadyInterrupt
控制ICM42688 是否在数据就绪时生成中断。 enableFifo
设置并启用 FIFO 缓冲区。下面详细描述了这些功能。
int begin()这应该在您的设置函数中调用。它初始化与 ICM42688 的通信,设置传感器以读取数据,并估计陀螺仪偏差(从传感器数据中删除)。该函数在初始化成功时返回正值,在初始化失败时返回负值。如果不成功,请检查接线或尝试重置传感器电源。以下是设置 ICM42688 的示例。
int status = IMU.begin();
(可选) int setAccelRange(AccelRange range)该函数将加速度计满量程范围设置为给定值。默认情况下,如果未调用此函数,则将使用 +/- 16 g 的满量程范围。列举的加速度计满量程范围为:
加速度计名称 | 加速度计满量程范围 |
---|---|
GPPM2 | +/- 2(克) |
GPPM4 | +/- 4(克) |
gpm8 | +/- 8(克) |
加仑值16 | +/- 16(克) |
该函数在成功时返回正值,在失败时返回负值。请参阅Advanced_I2C 示例。以下是选择加速度计满量程范围 +/- 8g 的示例。
status = IMU.setAccelFS(ICM42688::gpm2);
(可选) int setGyroRange(GyroRange range)该函数将陀螺仪满量程范围设置为给定值。默认情况下,如果未调用此函数,将使用 +/- 2000 deg/s 的满量程范围。列举的陀螺仪满量程范围为:
陀螺仪名称 | 陀螺仪满量程范围 |
---|---|
dps15_625 | +/- 15.625(度/秒) |
dps31_25 | +/- 31.25(度/秒) |
dps62_5 | +/- 62.5(度/秒) |
dps125 | +/- 125(度/秒) |
伤害250 | +/- 250(度/秒) |
伤害500 | +/- 500(度/秒) |
伤害1000 | +/- 1000(度/秒) |
dps2000 | +/- 2000(度/秒) |
该函数在成功时返回正值,在失败时返回负值。请参阅Advanced_I2C 示例。以下是选择陀螺仪满量程范围 +/- 250 deg/s 的示例。
status = IMU.setGyroFS(ICM42688::dps250);
(可选) int setFilters(bool gyroFilters, bool accFilters)这是设置可编程滤波器(陷波滤波器、抗混叠滤波器、UI 滤波器块)的可选函数。默认情况下,所有过滤器均打开。下图显示了 ICM42688 的信号路径框图:
该函数在成功时返回正值,在失败时返回负值。以下是打开过滤器的示例。
status = IMU.setFilters( true , true );
(可选) int enableDataReadyInterrupt()中断与数据输出速率相关。当数据准备好时,ICM42688 INT引脚将发出 50us 脉冲。这对于使用中断来计时应定期发生的数据收集非常有用。请参阅Interrupt_SPI 示例。该函数启用此中断,该中断将以 SRD 给定的频率发生。该函数在成功时返回正值,在失败时返回负值。下面是使能数据就绪中断的示例。
status = IMU.enableDataReadyInterrupt();
(可选) int disableDataReadyInterrupt()该函数禁用数据就绪中断,如上所述。该函数在成功时返回正值,在失败时返回负值。以下是禁用数据就绪中断的示例。
status = IMU.disableDataReadyInterrupt();
(可选) uin8_t isInterrupted()该函数读取数据就绪中断寄存器。该函数在被中断时返回 true。下面是读取数据就绪中断寄存器的示例。
status = IMU.isInterrupted();
(可选) int calibrateGyro()陀螺仪偏差在begin()函数期间自动估计并从传感器测量中删除。此函数将重新估计陀螺仪偏差并从未来的传感器测量中消除新的偏差。在此过程中传感器应保持静止。该函数在成功时返回正值,在失败时返回负值。以下是估计新陀螺仪偏差的示例。
status = IMU.calibrateGyro();
(可选) float getGyroBiasX()该函数返回 X 方向当前陀螺仪偏置,单位为 deg/s。
float gxb;
gxb = IMU.getGyroBiasX();
(可选) float getGyroBiasY()该函数返回当前 Y 方向陀螺仪偏置,单位为 deg/s。
float gyb;
gyb = IMU.getGyroBiasY();
(可选) float getGyroBiasZ()该函数返回 Z 方向当前陀螺仪偏置,单位为 deg/s。
float gzb;
gzb = IMU.getGyroBiasZ();
(可选) void setGyroBiasX(floatbias)该函数将 X 方向使用的陀螺仪偏置设置为输入值(以度/秒为单位)。
float gxb = 0.001 ; // gyro bias of 0.001 deg/s
IMU.setGyroBiasX(gxb);
(可选) void setGyroBiasY(floatbias)该函数将 Y 方向使用的陀螺仪偏置设置为输入值(以度/秒为单位)。
float gyb = 0.001 ; // gyro bias of 0.001 deg/s
IMU.setGyroBiasY(gyb);
(可选) void setGyroBiasZ(floatbias)该函数将 Z 方向使用的陀螺仪偏置设置为输入值(以度/秒为单位)。
float gzb = 0.001 ; // gyro bias of 0.001 deg/s
IMU.setGyroBiasZ(gzb);
(可选)int calibrateAccel()该函数将估计校准加速度计所需的偏差和比例因子。该函数一次只对一个轴起作用,并且需要针对所有 6 个传感器方向运行。收集足够的传感器数据后,它将估计所有三个加速度计通道的偏差和比例因子,并将这些校正应用于测量的数据。加速度计校准只需在 IMU 上执行一次,下面详述的获取和设置函数可用于检索估计的偏差和比例因子,并在未来的电源周期或 IMU 操作中使用它们。该函数在成功时返回正值,在失败时返回负值。
status = IMU.calibrateAccel();
(可选) float getAccelBiasX_mss()该函数返回当前加速度计在 X 方向的偏差,单位为 m/s/s。
float axb;
axb = IMU.getAccelBiasX_mss();
(可选) float getAccelScaleFactorX()该函数返回 X 方向当前加速度计比例因子。
float axs;
axs = IMU.getAccelScaleFactorX();
(可选) float getAccelBiasY_mss()该函数返回 Y 方向当前加速度计偏差,单位为 m/s/s。
float ayb;
ayb = IMU.getAccelBiasY_mss();
(可选) float getAccelScaleFactorY()该函数返回 Y 方向当前加速度计比例因子。
float ays;
ays = IMU.getAccelScaleFactorY();
(可选) float getAccelBiasZ_mss()该函数返回当前 Z 方向的加速度计偏差,单位为 m/s/s。
float azb;
azb = IMU.getAccelBiasZ_mss();
(可选) float getAccelScaleFactorZ()该函数返回 Z 方向当前加速度计比例因子。
float azs;
azs = IMU.getAccelScaleFactorZ();
(可选) void setAccelCalX(floatbias,floatscaleFactor)此函数将 X 方向使用的加速度计偏差 (m/s/s) 和比例因子设置为输入值。
float axb = 0.01 ; // accel bias of 0.01 m/s/s
float axs = 0.97 ; // accel scale factor of 0.97
IMU.setAccelCalX(axb,axs);
(可选) void setAccelCalY(floatbias,floatscaleFactor)此函数将 Y 方向使用的加速度计偏差 (m/s/s) 和比例因子设置为输入值。
float ayb = 0.01 ; // accel bias of 0.01 m/s/s
float ays = 0.97 ; // accel scale factor of 0.97
IMU.setAccelCalY(ayb,ays);
(可选) void setAccelCalZ(floatbias,floatscaleFactor)此函数将 Z 方向使用的加速度计偏差 (m/s/s) 和比例因子设置为输入值。
float azb = 0.01 ; // accel bias of 0.01 m/s/s
float azs = 0.97 ; // accel scale factor of 0.97
IMU.setAccelCalZ(azb,azs);
以下函数用于从 ICM42688 传感器收集数据。有关敏感轴的方向,请参阅数据表第 10.1 节。
int getAGT()读取传感器并将最新数据存储在缓冲区中,每次您想从传感器检索数据时都应该调用它。该函数在成功时返回正值,在失败时返回负值。
IMU.getAGT();
float accX()从数据缓冲区中获取 X 方向的加速度计值,并以 g 为单位返回。
float ax = IMU.accX();
float accY()从数据缓冲区中获取 Y 方向的加速度计值,并以 g 为单位返回。
float ay = IMU.accY();
float accZ()从数据缓冲区获取 Z 方向的加速度计值,并以 g 为单位返回。
float az = IMU.accZ();
float gyrX()从数据缓冲区中获取 X 方向的陀螺仪值,并以度/秒为单位返回。
float gx = IMU.gyrX();
float gyrY()从数据缓冲区中获取 Y 方向的陀螺仪值,并以度/秒为单位返回。
float gy = IMU.gyrY();
float gyrZ()从数据缓冲区中获取 Z 方向的陀螺仪值,并以度/秒为单位返回。
float gz = IMU.gyrZ();
float temp()从数据缓冲区获取芯片温度值并以 C 为单位返回。
float temperature = IMU.temp();
ICM42688FIFO派生类通过提供对设置和读取 ICM42688FIFO 缓冲区的支持来扩展ICM42688基类提供的功能。作为ICM42688类一部分的上述所有功能也可用于ICM42688FIFO类。
ICM42688FIFO(TwoWire &bus, uint8_t address)应声明 ICM42688FIFO 对象,指定 I2C 总线和 ICM42688 I2C 地址。如果 AD0 引脚接地,则 ICM42688 I2C 地址将为 0x68;如果 AD0 引脚拉高,则 ICM42688 I2C 地址将为 0x69。例如,以下代码声明了一个名为IMU的 ICM42688FIFO 对象,其中 ICM42688 传感器位于 I2C 总线 0 上,传感器地址为 0x68(AD0 接地)。
ICM42688FIFO IMU (Wire, 0x68 );
ICM42688FIFO(SPIClass &bus, uint8_t csPin, uint32_t SPI_HS_CLK=8000000)应声明 ICM42688FIFO 对象,指定使用的 SPI 总线和片选引脚。多个 ICM42688 或其他 SPI 对象可以在同一 SPI 总线上使用,每个对象都有自己的片选引脚。片选引脚可以是任何可用的数字引脚。例如,以下代码声明了一个名为IMU的 ICM42688FIFO 对象,其中 ICM42688 传感器位于 SPI 总线 0 上,片选引脚为 10。
ICM42688FIFO IMU (SPI, 10 );
请注意,默认高速 SPI 总线时钟设置为 8 MHz,但 ICM 42688-p 支持高达 24 MHz SPI 时钟。读取数据时使用更快的时钟可实现更快的 SPI 数据传输。
(可选) int enableFifo(bool accel,bool gyro,bool temp)该函数配置并启用 ICM42688 FIFO 缓冲区。该 512 字节缓冲区以 SRD 设置的数据输出速率对数据进行采样,并使微控制器能够批量读取数据,从而减少某些应用的微控制器工作负载。它配置有一组布尔值,描述要在 FIFO 中缓冲哪些数据:加速度计、陀螺仪或温度。加速度计和陀螺仪数据每个样本占用 6 个字节的空间,温度占用 2 个字节。仅选择所需的数据源非常重要,以确保 FIFO 在读取期间不会溢出。例如,启用所有数据源每个样本将占用 21 个字节,从而允许 FIFO 在溢出之前仅保存 24 个样本。如果仅需要加速度计数据,则在溢出之前会增加到 85 个样本。该函数在成功时返回正值,在失败时返回负值。请参阅FIFO_SPI 示例。下面是启用 FIFO 缓冲加速度计和陀螺仪数据的示例。
status = IMU.enableFifo( true , true , false , false );
int readFifo()从 ICM42688 读取 FIFO 缓冲区,对其进行解析并将数据存储在微控制器的缓冲区中。每次您想要从 FIFO 缓冲区检索数据时都应该调用它。该函数在成功时返回正值,在失败时返回负值。
IMU.readFifo();
void getFifoAccelX_mss(size_t size,float data)从数据缓冲区中获取 X 方向的加速度计值,并以 m/s/s 为单位返回。数据以数组的形式返回,并包含该数组中的元素数量。确保您要传输到的缓冲区有足够的容量来存储数据。
float ax[ 100 ];
size_t samples;
IMU.getFifoAccelX_mss(&samples,ax);
void getFifoAccelY_mss(size_t size,float data)从数据缓冲区中获取 Y 方向的加速度计值,并以 m/s/s 为单位返回。数据以数组的形式返回,并包含该数组中的元素数量。确保您要传输到的缓冲区有足够的容量来存储数据。
float ay[ 100 ];
size_t samples;
IMU.getFifoAccelY_mss(&samples,ay);
void getFifoAccelZ_mss(size_t size,float data)从数据缓冲区中获取 Z 方向的加速度计值并以 m/s/s 为单位返回。数据以数组的形式返回,并包含该数组中的元素数量。确保您要传输到的缓冲区有足够的容量来存储数据。
float az[ 100 ];
size_t samples;
IMU.getFifoAccelZ_mss(&samples,az);
void getFifoGyroX(size_t size,float data)从数据缓冲区中获取 X 方向的陀螺仪值,并以 deg/s 为单位返回。数据以数组的形式返回,并包含该数组中的元素数量。确保您要传输到的缓冲区有足够的容量来存储数据。
float gx[ 100 ];
size_t samples;
IMU.getFifoGyroX(&samples,gx);
void getFifoGyroY(size_t size,float data)从数据缓冲区中获取 Y 方向的陀螺仪值并以 deg/s 为单位返回。数据以数组的形式返回,并包含该数组中的元素数量。确保您要传输到的缓冲区有足够的容量来存储数据。
float gy[ 100 ];
size_t samples;
IMU.getFifoGyroY(&samples,gy);
void getFifoGyroZ(size_t size,float data)从数据缓冲区中获取Z方向的陀螺仪值并以deg/s为单位返回。数据以数组的形式返回,并包含该数组中的元素数量。确保您要传输到的缓冲区有足够的容量来存储数据。
float gz[ 100 ];
size_t samples;
IMU.getFifoGyroZ(&samples,gx);
void getFifoTemperature_C(size_t size,float data)从数据缓冲区获取芯片温度值,并以 C 为单位返回。数据以数组形式返回,并包含该数组中的元素数量。确保您要传输到的缓冲区有足够的容量来存储数据。
float temp[ 100 ];
size_t samples;
IMU.getFifoTemperature_C(&samples,temp);
请参阅 ICM42688 数据表。该库应该适用于其他分线板或嵌入式传感器,请参阅供应商的引脚图。
ICM42688 引脚应连接为:
4.7 kOhm 电阻器应用作 SDA 和 SCL 上的上拉电阻,这些电阻器应使用 3.3V 电源进行上拉。
ICM42688 引脚应连接为:
某些分线板(包括嵌入式主控分线板)需要稍作修改才能启用 SPI。请参阅供应商的文档。