ICM40607 High Performance 6-Axis MotionTracking

1. 陀螺仪规格(GYROSCOPE SPECIFICATIONS)

在这里插入图片描述
从上规格可以看出陀螺仪的范围有8个等级可选(±2000 ~ ±15.625),而对应的精度分别是从16.4LSB/(°/s) ~ 2097.2 LSB/(°/s)
MPU6050陀螺仪的范围有±250、±500、±2000可选,精度分别是131LSB/(°/s)、65.5LSB/(°/s)、32.8LSB/(°/s)、16.4 LSB/(°/s)

1.1 精度和范围的关系

首先查看 ADC Word 是一个16位的,因为最高位是符号位,所以数据寄存器的输出范围是-7FFF~7FFF ,也既是-32767~32767。
假如,我们选择陀螺仪的范围是 ±2000,那么对应

-32767-2000(°/s)
327672000(°/s)

比如,通过寄存器读取陀螺仪的值是1000的,对应的角速度计算如下:

32767/2000 =1000/x;
x = 1000/16.4(°/s)

可以看出32767/2000 = 16.4 ,对应手册中的精度 16.4 LSB/(°/s)。

1.2 角度和弧度的关系

已知2Pi = 360度,那么1度换算成弧度就是:

2Pi/360=(2*3.1415926)/360=0.0174532=1/57.30

那么当量程为-2000到+2000的范围,把陀螺仪获取的数据转换为真正的弧度每秒的公式:

gyro_x/(16.4057.30)=gyro_x0.001064 (gyro_x来代表从陀螺仪读到的数据 )单位为弧度每秒。

2. 加速度计规格 (ACCELEROMETER SPECIFICATIONS)

在这里插入图片描述

同陀螺仪的计算方法一样。当AFS_SEL = 3时,

-32767-16g
3276716g

灵敏度: 32767/16 = 2048

2.1 重力加速度和时间的关系

假如从寄存器读出的数字为x, x/2048= 加速度的数值。

for example,我们从加速度计读到的数字是1000,那么对应的加速度数据是1000/2048=0.49g。g为加速度的单位,重力加速度定义为1g, 等于9.8米每平方秒。

3. ICM40607 相关寄存器配置

在这里插入图片描述

4. ICM40607 I2C 和 SPI 串行通信

4.1 速率

I2C at 1MHz; SPI at 24MHz

4.2 I2C 接口

在这里插入图片描述
*Tips: * 这里需要特别说明I2C读写的地址模式是 7bit long (is 1101 000x) 。读寄存器的时为 1101 0000;
写寄存器时为 1101 0001.

在7地址模式时,只需发送出一个地址字节。一旦改地址字节被发送,ADDR位被硬件置位,如果设置了ITEVFEN位,则产生一个中断。随后主设备等待一次读SR1寄存器,接着读SR2寄存器。根据送出地址的最低位,主设备决定进入发送模式还是接收模式。

在7位地址模式时,要进入发送模式,主设备发送从地址时最低位设置为0;要进入接收模式,主设备发送从机地址时最低位设置为1.

如上采用STM32单片机配置I2C接口的代码如下:

4.2.1 初始化
void MX_I2C1_Init(void)
{
  hi2c1.Instance = I2C1;
  hi2c1.Init.ClockSpeed = 100000;
  hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
  hi2c1.Init.OwnAddress1 = 0;
  hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  hi2c1.Init.OwnAddress2 = 0;
  hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
  if (HAL_I2C_Init(&hi2c1) != HAL_OK)
  {
    Error_Handler(__FILE__, __LINE__);
  }
}
4.2.2 读寄存器
int i2c1_read_reg(void *i2cHandle, unsigned char reg, unsigned char *data, unsigned int len)
{
  int32_t ret;
  ret = HAL_I2C_Mem_Read(&hi2c1, 0xD0, reg, 1, data, len, 100);
  return ret;
}
4.2.3 写寄存器
int i2c1_write_reg(void *i2cHandle, unsigned char reg, unsigned char *data, unsigned int len)
{
  int32_t ret;
  ret = HAL_I2C_Mem_Write(&hi2c1, 0xD1, reg, 1, data, len, 100);
  return ret;
}

5. 民间模块

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「Thunder Studio」

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值