当前位置:   article > 正文

MPU6050/ICM20608寄存器笔记_icm20608和mpu6050

icm20608和mpu6050

0.前言

​ 在使用MPU6050的时候,经常遇到初始化给寄存器赋值,而往往此时的注释都是错误的,导致最终错误的理解。而ICM20608和MPU6050的寄存器几乎全部一样,只是细微的地方有些区别,在此做记录。

​ 此外要说明的几点:

  1. MPU6050/ICM20608的DataSheet里包含的寄存器描述很少,更多的是对IMU性能的描述,想看寄存器 的描述,需要看另外的文件,即MPU-6000 and MPU-6050 Register Map and Descriptions.pdfICM-20608-G Register Maps and Description.pdf

  2. 两款IMU网上例程比较多的是MPU6050,而ICM20608的很少,其实二者非常像,但是ICM20608的配置上比MPU6050多了一个加速度寄存器,所以还是有所不同。正点原子在一款开发板潘多拉STM32L4中有ICM20608的例程,但是里面的设置加速度寄存器的值注释是错误的,如下。这里的0x1D寄存器实际是ICM20608比MPU6050多出来的加速度寄存器,用于配置加速度的数字低通滤波器(digital low-pass filter,DLPF)的带宽。

    MPU_Write_Byte(0x1D, 1);	//INT引脚低电平有效  
    
    • 1
  3. 两款IMU的寄存器在复位之后,除了以下两个寄存器外,其他寄存器的值全部为0x00。

  • Register 107 Power Management 1:复位值为(0x40),即复位后IMU默认进入睡眠模式

  • Register 117 WHO_AM_I :复位值为(0xAF) ,注意此寄存器为只读寄存器,一直是0xAF

1.MPU6050/ICM20608相同的重要寄存器

1.电源管理寄存器1

image-20210328103121028

  • DEVICE_RESET 位用来控制复位,设置为 1,复位 MPU6050,复位结束后, MPU 硬件自动清零该位

  • SLEEEP 位用于控制 MPU6050 的工作模式,复位后,该位为 1,即进入了睡眠模式(低功耗),所以我们要清零该位,以进入正常工作模式

  • TEMP_DIS 用于设置是否使能温度传感器,设置为 0,则使能

  • CLKSEL[2:0]用于选择系统时钟源,选择关系如表。默认是使用内部 8M RC 晶振的,精度不高,所以我们一般选择 X/Y/Z 轴陀螺作为参考 的 PLL 作为时钟源,一般设置 CLKSEL=001 即可。(Note: The default value of CLKSEL[2:0] is 000. It is required that CLKSEL[2:0] be set to 001 to achieve full gyroscope performance.)

    image-20210328103248125

    程序总结

//1.上电先给此寄存器写0x80,即最高位写1,复位IMU
//2.延时100ms,等待复位完成,此时IMU自动清零最高位。此时再次写入0x00,或者不写也可以
//3.进行其他寄存器的设置
//4.最后寄存器都设置完毕,再将此寄存器值设置为0x01,选择X轴陀螺仪作为PLL的时钟源以提高精度
  • 1
  • 2
  • 3
  • 4

2.电源管理寄存器2

image-20210328103857448

  • bit7-6是设置低功耗唤醒相关的,一般用不到,设为0即可
  • bit5-0用来配置是否使能三个轴上的陀螺仪和加速度计,一般都要使能。
  • 最终此寄存器设置为0x00。由于复位后默认值为0x00,因此通常程序中此寄存器无须配置。

3.加速度计配置寄存器

image-20210328104616277

  • bit7-5配置陀螺仪自检,一般不自检,设为0。
  • bit4-3设置加速度传感器的满量程范围: 0,±2g; 1,±4g; 2,±8g; 3,±16g
  • 我们一般设置bit4-3 为0,即±2g。因为加速度传感器的 ADC 也是 16 位,所以得到灵敏度为: 65536/4=16384LSB/g。最终此寄存器值为0x00。

4.FIFO使能寄存器

image-20210328104954737

  • bit7设置温度使能FIFO
  • bit6-4设置陀螺仪使能FIFO
  • bit3控制加速度传感器的 3 个轴的FIFO,只要该位置 1,则加速度传感器的三个通道都开启 FIFO
  • 该寄存器用于控制 FIFO 使能,在简单读取传感器数据的时候,可以不用 FIFO,设置对应位为 0 即可禁止 FIFO,设置为 1,则使能 FIFO。一般不适用FIFO。最终此寄存器值为0x00。

2.MPU6050/ICM20608相同但有区别的重要寄存器

1.陀螺仪配置寄存器

1.MPU6050

image-20210328104143138

  • bit7-5配置陀螺仪自检,一般不自检,设为0。

  • bit4-3配置陀螺仪的量程,0,±250° /S; 1,±500° /S; 2,±1000° /S; 3,±2000° /S。

  • 我们一般设置bit4-3为 3,即±2000° /S。因为陀螺仪的 ADC 为 16 位分辨率,所以得到灵敏度为: 65536/4000=16.4LSB/(° /S)。最终此寄存器值为0x18,或者3<<3

2.ICM20608

image-20210328110454339

ICM20608的寄存器和这个有点区别。其最后两位也可以设置数值,并且和陀螺仪的输出速率相关,一般设置为0。当为0时,寄存器25(陀螺仪采样率分频寄存器)的设置才有效。

2.陀螺仪采样率分频寄存器

1.MPU6050

image-20210328105658278

该寄存器用于设置 MPU6050 的陀螺仪采样频率,计算公式为:采样频率 = 陀螺仪输出频率 / (1+SMPLRT_DIV)这里陀螺仪的输出频率,是 1Khz 或者 8Khz,与数字低通滤波器( DLPF)的设置有关, 当 DLPF_CFG=0/7 的时候,频率为 8Khz,其他情况是 1Khz。而且 DLPF 滤波频率一般设置为采样率的一半。采样率,我们假定设置为 50Hz,那么 SMPLRT_DIV=1000/50-1=19。

**ps:**采样速度和输出速率有什么不同,下面是数据手册中的描述,没太看懂???

image-20210328113107301
2.ICM20608

image-20210328111533614

除以内部采样速率(参见寄存器CONFIG),生成控制传感器数据输出速率的采样速率,即先进先出采样速率。注:该寄存器仅在FCHOICE_B寄存器位为2’b00和(0 < DLPF_CFG < 7)时有效。这是传感器寄存器的更新速率:采样速率=内部采样速率/ (1 + SMPLRT_DIV)其中内部采样速率= 1kHz

3.配置寄存器

1.MPU6050

image-20210328111737485

  • bit5-3一般用不到
  • bit2-0数字低通滤波器( DLPF)的设置位,即: DLPF_CFG[2:0],加速度计和陀螺仪都是根据这三个位的配置进行过滤的(这里是和ICM最大的不同)。 DLPF_CFG 不同配置对应的过滤情况如表:
image-20210328111850626

​ 这里的加速度传感器,输出速率( Fs)固定是 1Khz,而角速度传感器的输出速率( Fs), 则根据 DLPF_CFG 的配置有所不同,是8Khz或者1Khz。一般我们设置角速度传感器的带宽为其采样率的一半,如前面所说的,如果设置采样率为 50Hz,那么带宽就应该设置为 25Hz,取近似值 20Hz, 就应该设置 DLPF_CFG=100

2.ICM20608

image-20210328113551083

  • bit6-3一般用不到
  • bit2-0:当FCHOICE_B [1:0] = 2b’00时,DLPF由DLPF_CFG配置。陀螺仪和温度传感器根据DLPF_CFG和FCHOICE_B的值进行滤波,如下表所示
image-20210328113655523
4.ICM多出来的加速度配置寄存器2

image-20210328114039933

  • bit5-4与低功耗相关,一般不同

  • bit3-0与加速度计的DLPF相关,如下图

    image-20210328114145444

3.初始化总结

1.ICM20608
/**
 * @brief	ICM20608初始化函数
 * @param   void
 * @return  u8		0,成功,其他,失败
 */
u8 ICM20608_Init(void)
{
    u8 res;
    IIC_Init();//初始化IIC总线
    MPU_Write_Byte(MPU_PWR_MGMT1_REG, 0X80);	//复位ICM20608,寄存器107(0x6B)值0x80
    delay_ms(100);						
    MPU_Write_Byte(MPU_PWR_MGMT1_REG, 0X00);	//唤醒ICM20608,寄存器107(0x6B)值0x00
    MPU_Set_Gyro_Fsr(3);					//陀螺仪传感器,±2000dps,寄存器27(0x1B)值0x18
    MPU_Set_Accel_Fsr(0);					//加速度传感器,±2g,寄存器28(0x1C)值0x18
    //ICM20608独有
    MPU_Write_Byte(0x1D, 1);	//设置加速度寄存器2,寄存器29(0x1D),用来确定加速度的DLPF频率
    
    MPU_Set_Rate(50);						//设置采样率50Hz,见函数
    
    MPU_Write_Byte(MPU_INT_EN_REG, 0X00);	//关闭所有中断
    MPU_Write_Byte(MPU_USER_CTRL_REG, 0X00);	//I2C主模式关闭
    MPU_Write_Byte(MPU_FIFO_EN_REG, 0X00);	//关闭FIFO
    MPU_Write_Byte(MPU_INTBP_CFG_REG, 0X80);	//INT引脚低电平有效

    res = MPU_Read_Byte(MPU_DEVICE_ID_REG);  	//读取WHO_AM_I寄存器,一定是0xAF 

    if(res == 0XAF) //器件ID正确
    {
        MPU_Write_Byte(MPU_PWR_MGMT1_REG, 0X01);	//设置CLKSEL,PLL X轴为参考
        MPU_Write_Byte(MPU_PWR_MGMT2_REG, 0X00);	//加速度与陀螺仪都工作
        MPU_Set_Rate(50);						//设置采样率为50Hz
    }
    else return 1;
	return 0;
}
/**
 * @brief	设置ICM20608的采样率(假定Fs=1KHz)
 * @param   rate	4~1000(Hz)
 * @return  u8		0,成功,其他,失败
 */
u8 MPU_Set_Rate(u16 rate)
{
    u8 data;
    if(rate > 1000)rate = 1000;
    if(rate < 4)rate = 4;
    data = 1000 / rate - 1;
    data = MPU_Write_Byte(MPU_SAMPLE_RATE_REG, data);	//设置数字低通滤波器
    return MPU_Set_LPF(rate / 2);	//自动设置LPF为采样率的一半
}
/**
 * @brief	设置ICM20608的数字低通滤波器
 * @param   lpf		数字低通滤波频率(Hz)
 * @return  u8		0,成功,其他,失败
 */
u8 MPU_Set_LPF(u16 lpf)
{
    u8 data = 0;
    if(lpf >= 188)data = 1;
    else if(lpf >= 98)data = 2;   	//这些带宽貌似和数据手册不一致
    else if(lpf >= 42)data = 3;
    else if(lpf >= 20)data = 4;
    else if(lpf >= 10)data = 5;
    else data = 6;
    return MPU_Write_Byte(MPU_CFG_REG, data); //设置数字低通滤波器
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
2.MPU6050

​ 将以上程序中的下面一句删除即可。

//ICM20608独有
    MPU_Write_Byte(0x1D, 1);	//设置加速度寄存器2,寄存器29(0x1D),用来确定加速度的DLPF频率
  • 1
  • 2
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/205750
推荐阅读
相关标签
  

闽ICP备14008679号