文章目录
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) |
---|---|
32767 | 2000(°/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 |
---|---|
32767 | 16g |
灵敏度: 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;
}