stm32的陀螺仪芯片MPU6050的初始化寄存器配置

MPU6050读取数据步骤:

1,检查MCU(主机)与MPU6050(姿态传感器)是否通信成功

2,设置MPU6050为复位状态,并且100ms延时,确保复位完成

3,唤醒MPU6050,选择PLL为时钟源

4,配置6轴数据全部输出(3轴加速度与3轴陀螺仪)

5,禁止所有中断(避免传感器读取到一个数据就中断,而耽误系统进程)

6,设置MPU6050的内部采样频率以及低通滤波器(小的飞行器一一般设施在20~30Hz即可)

7,设置陀螺仪与加速度计的满量程范围

8,主处理芯片可以直接访问MPU6050辅助I2C

下面来一步一步配置:

1,检查MCU(主机)与MPU6050(姿态传感器)是否通信成功

我们选用的读取MPU6050储存ID的寄存器即0x75,如果读出来ID是默认值0x68,那么是不是可以证明通信成功了

2,设置MPU6050为复位状态,并且100ms延时,确保复位完成

看到电源管理寄存器1(0x6B)

我们只需要将第7位寄存器置1即可复位,别的寄存器不做配置,就都置0。

那么将0x6B配置为0x80即可

3,唤醒MPU6050,选择PLL为时钟源

还是对0x6B进行配置,看到[2:0]寄存器,这里我们配置为0x01。

自动选择最好的时钟源

4,配置6轴数据全部输出(3轴加速度与3轴陀螺仪)

看到电源管理2寄存器(0x6C)

 我们看到[0:5]为加速度与陀螺仪是否待机的配置,[6:7]为低功耗模式的设置。

在这里我们不需要待机与低功耗,说话以直接每一位都置为0即可,0x6C置0x00

5,禁止所有中断(避免传感器读取到一个数据就中断,而耽误系统进程)

看控制中断使能的寄存器(0x38)

 我们不让中断产生,所以还是将寄存器配置为0x00

6,设置MPU6050的内部采样频率以及低通滤波器

配置SMPLRT_DIV的值就可以进行分频,DLPF为数字低通滤波器,后面我们为了使数据更加稳定是要进行配置的,那么陀螺仪的输出频率=1kHz,这时候我们假设SMPLRT_DIV置1,那么陀螺仪的输出频率为500Hz,这时候要考虑飞机姿态结算的频率,假设高于500Hz,那么意味着可能两次姿态结算用的都是同一组陀螺仪数据。这样不利于提升精度。所以我们这里SMPLRT_DIV置0。保持1000Hz,即0x19置为0x00

 

 0x1A寄存器是对DLPF(数字低通滤波)进行配置,一般将他们的DLPF都设为20Hz

即配置寄存器0x1A为0x04

7,设置陀螺仪与加速度计的满量程范围

我们不进行自检,所以只看[3:4]位,我们将角度设置大一些,2000度/s,

将寄存器0x1B配置为0x18

 同样的,加速度计我们也不进行自检,所以所以只看[3:4]位,我们将角度配置为+-4g

将寄存器0x1C配置为0x08

8,主处理芯片可以直接访问MPU6050辅助I2C

看到最后Bit1的I2C_BYPASS_EN的配置说明:

辅助I2C可以用来外接磁力计或其他传感器。 有两种工作模式: I2C Master Mode, 此时 MPU-60X0作为主设备与外接传感器通信; Pass-Through Mode, 此时仅用作连接, 允许 MPU 和外接传感器同时和芯片通信

我们直接将寄存器0x37配置为0x02即可

  • 11
    点赞
  • 106
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是基于STM32通过I2C读取MPU6050陀螺仪芯片数据的核心程序: ```c #include "stm32f10x.h" #include "i2c.h" #define MPU6050_ADDR 0xD0 // MPU6050 I2C 地址 #define MPU6050_PWR_MGMT_1 0x6B // MPU6050 电源管理寄存器地址 #define MPU6050_ACCEL_XOUT_H 0x3B // MPU6050 加速度计X轴高位数据寄存器地址 void MPU6050_Init(void) { I2C_WriteByte(MPU6050_ADDR, MPU6050_PWR_MGMT_1, 0x00); // 唤醒 MPU6050 I2C_WriteByte(MPU6050_ADDR, 0x1B, 0x08); // 设置陀螺仪量程为 +-500dps I2C_WriteByte(MPU6050_ADDR, 0x1C, 0x08); // 设置加速度计量程为 +-4g } void MPU6050_ReadAccel(short *accel) { uint8_t buf[6]; I2C_ReadBytes(MPU6050_ADDR, MPU6050_ACCEL_XOUT_H, buf, 6); // 读取加速度计X,Y,Z轴数据 accel[0] = (buf[0] << 8) | buf[1]; // 将高位和低位数据合并 accel[1] = (buf[2] << 8) | buf[3]; accel[2] = (buf[4] << 8) | buf[5]; } int main(void) { short accel[3]; I2C_Init(); // 初始化 I2C MPU6050_Init(); // 初始化 MPU6050 while(1) { MPU6050_ReadAccel(accel); // 读取加速度计X,Y,Z轴数据 // 做一些处理 } } ``` 其中,`I2C_WriteByte` 和 `I2C_ReadBytes` 函数是通过STM32的I2C外设实现的,用于向I2C设备写入数据和读取数据。在初始化函数中,先通过 `I2C_WriteByte` 函数设置MPU6050的电源管理寄存器,使其处于工作状态,然后设置陀螺仪和加速度计的量程。在读取函数中,通过 `I2C_ReadBytes` 函数读取MPU6050加速度计X,Y,Z轴的高位和低位数据,然后将其合并成16位数据。最后在主函数中循环读取加速度计数据,并进行一些处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值