赞
踩
在使用MPU6050的时候,经常遇到初始化给寄存器赋值,而往往此时的注释都是错误的,导致最终错误的理解。而ICM20608和MPU6050的寄存器几乎全部一样,只是细微的地方有些区别,在此做记录。
此外要说明的几点:
MPU6050/ICM20608的DataSheet里包含的寄存器描述很少,更多的是对IMU性能的描述,想看寄存器 的描述,需要看另外的文件,即MPU-6000 and MPU-6050 Register Map and Descriptions.pdf
和ICM-20608-G Register Maps and Description.pdf
两款IMU网上例程比较多的是MPU6050,而ICM20608的很少,其实二者非常像,但是ICM20608的配置上比MPU6050多了一个加速度寄存器,所以还是有所不同。正点原子在一款开发板潘多拉STM32L4中有ICM20608的例程,但是里面的设置加速度寄存器的值注释是错误的,如下。这里的0x1D寄存器实际是ICM20608比MPU6050多出来的加速度寄存器,用于配置加速度的数字低通滤波器(digital low-pass filter,DLPF)的带宽。
MPU_Write_Byte(0x1D, 1); //INT引脚低电平有效
两款IMU的寄存器在复位之后,除了以下两个寄存器外,其他寄存器的值全部为0x00。
Register 107 Power Management 1:复位值为(0x40),即复位后IMU默认进入睡眠模式
Register 117 WHO_AM_I :复位值为(0xAF) ,注意此寄存器为只读寄存器,一直是0xAF
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.)
程序总结
//1.上电先给此寄存器写0x80,即最高位写1,复位IMU
//2.延时100ms,等待复位完成,此时IMU自动清零最高位。此时再次写入0x00,或者不写也可以
//3.进行其他寄存器的设置
//4.最后寄存器都设置完毕,再将此寄存器值设置为0x01,选择X轴陀螺仪作为PLL的时钟源以提高精度
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。
ICM20608的寄存器和这个有点区别。其最后两位也可以设置数值,并且和陀螺仪的输出速率相关,一般设置为0。当为0时,寄存器25(陀螺仪采样率分频寄存器)的设置才有效。
该寄存器用于设置 MPU6050 的陀螺仪采样频率,计算公式为:采样频率 = 陀螺仪输出频率 / (1+SMPLRT_DIV)
这里陀螺仪的输出频率,是 1Khz 或者 8Khz,与数字低通滤波器( DLPF)的设置有关, 当 DLPF_CFG=0/7 的时候,频率为 8Khz,其他情况是 1Khz。而且 DLPF 滤波频率一般设置为采样率的一半。采样率,我们假定设置为 50Hz,那么 SMPLRT_DIV=1000/50-1=19。
**ps:**采样速度和输出速率有什么不同,下面是数据手册中的描述,没太看懂???
除以内部采样速率(参见寄存器CONFIG),生成控制传感器数据输出速率的采样速率,即先进先出采样速率。注:该寄存器仅在FCHOICE_B寄存器位为2’b00和(0 < DLPF_CFG < 7)时有效。这是传感器寄存器的更新速率:采样速率=内部采样速率/ (1 + SMPLRT_DIV)其中内部采样速率= 1kHz
这里的加速度传感器,输出速率( Fs)固定是 1Khz,而角速度传感器的输出速率( Fs), 则根据 DLPF_CFG 的配置有所不同,是8Khz或者1Khz。一般我们设置角速度传感器的带宽为其采样率的一半,如前面所说的,如果设置采样率为 50Hz,那么带宽就应该设置为 25Hz,取近似值 20Hz, 就应该设置 DLPF_CFG=100
bit5-4与低功耗相关,一般不同
bit3-0与加速度计的DLPF相关,如下图
/** * @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); //设置数字低通滤波器 }
将以上程序中的下面一句删除即可。
//ICM20608独有
MPU_Write_Byte(0x1D, 1); //设置加速度寄存器2,寄存器29(0x1D),用来确定加速度的DLPF频率
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。