主题 内容 教学目的/扩展视频
加速度传感器 电路连接。手册分析。驱动程序,读出数据。 能读出3轴数据。

师从洋桃电子,杜洋老师



回顾上期🔍MPU6050模块详解:从原理到STM32驱动指南(上) | 零基础入门STM32第八十九步

回顾上期🔍MPU6050模块详解:从寄存器配置到数据读取(中) | 零基础入门STM32第九十步


1. MPU6050简介与寄存器概述

MPU6050是集成3轴加速度计和3轴陀螺仪的6轴运动处理传感器。其核心功能通过寄存器映射实现,主要寄存器如下:

寄存器名称 地址(HEX) 功能描述 示例值
PWR_MGMT_1 0x6B 电源管理(休眠模式/时钟源) 0x00
SMPLRT_DIV 0x19 采样率分频器 0x07
CONFIG 0x1A 数字低通滤波器配置 0x06
ACCEL_CONFIG 0x1C 加速度计量程设置 0x00
GYRO_CONFIG 0x1B 陀螺仪量程及自检设置 0x18
ACCEL_XOUT_H 0x3B 加速度X轴高8位数据 -

2. MPU6050初始化函数解析

初始化流程如下所示:

I2C通信初始化
解除休眠模式
配置时钟源
设置陀螺仪量程
设置加速度计量程
配置数字滤波器
设置采样率
中断配置
启用数据就绪中断

关键代码实现:

void MPU6050_Init(void) {
    // 解除休眠(写0x00到PWR_MGMT_1)
    I2C_SAND_BYTE(MPU6050_ADD, MPU6050_RA_PWR_MGMT_1, 0x80);
    delay_ms(1000); // 等待器件稳定
    I2C_SAND_BYTE(MPU6050_ADD, MPU6050_RA_PWR_MGMT_1, 0x00);
    
    // 设置采样率分频器(SMPLRT_DIV=7)
    I2C_SAND_BYTE(MPU6050_ADD, MPU6050_RA_SMPLRT_DIV, 0x07);
    
    // 配置加速度计量程为±16g(AFS_SEL=0x00)
    I2C_SAND_BYTE(MPU6050_ADD, MPU6050_RA_ACCEL_CONFIG, 0x00);
    
    // 配置陀螺仪量程为±2000dps(FS_SEL=0x18)
    I2C_SAND_BYTE(MPU6050_ADD, MPU6050_RA_GYRO_CONFIG, 0x18);
}

3. 数据读取函数实现

数据读取流程:

1. 通过I2C连续读取14字节数据(0x3B~0x48)
2. 将高低字节合并为16位原始数据
3. 根据量程转换为实际物理值

代码实现:

void MPU6050_READ(u16* n) {
    u8 t[14];
    // 读取14字节原始数据(加速度XYZ+温度+陀螺仪XYZ)
    I2C_READ_BUFFER(MPU6050_ADD, MPU6050_RA_ACCEL_XOUT_H, t, 14);
    
    // 合并加速度数据(高位在前)
    for(int i=0; i<3; i++) 
        n[i] = (t[2*i] << 8) | t[2*i+1];
    
    // 合并陀螺仪数据(跳过温度寄存器)
    for(int i=4; i<7; i++)
        n[i-1] = (t[2*i] << 8) | t[2*i+1];
}

4. 采样率设置原理

采样率由SMPLRT_DIV寄存器控制,计算公式:
实际采样率 = 陀螺仪输出速率 / (SMPLRT_DIV + 1)

DLPF配置 陀螺仪输出速率 SMPLRT_DIV=7时采样率
启用 1kHz 1000/(7+1)=125Hz
禁用 8kHz 8000/(7+1)=1000Hz

5. 关键寄存器详细配置

5.1 加速度计量程设置(ACCEL_CONFIG)

AFS_SEL 量程 LSB灵敏度
0x00 ±2g 16384 LSB/g
0x08 ±4g 8192 LSB/g
0x10 ±8g 4096 LSB/g
0x18 ±16g 2048 LSB/g

5.2 陀螺仪量程设置(GYRO_CONFIG)

FS_SEL 量程 LSB灵敏度
0x00 ±250°/s 131 LSB/°/s
0x08 ±500°/s 65.5 LSB/°/s
0x10 ±1000°/s 32.8 LSB/°/s
0x18 ±2000°/s 16.4 LSB/°/s

6. 扩展应用与优化建议

  1. 数据滤波:启用CONFIG寄存器的数字低通滤波器(DLPF)可减少噪声
  2. 中断配置:通过INT_ENABLE寄存器启用数据就绪中断
  3. 温度补偿:读取TEMP_OUT寄存器实现温度补偿算法
  4. FIFO模式:配置FIFO_EN寄存器启用硬件缓存,降低MCU负载

7. 常见问题解答

Q1:读取数据始终为0?

  • 检查I2C地址是否正确(AD0引脚电平决定地址末位)
  • 确认PWR_MGMT_1寄存器已解除休眠

Q2:数据波动较大?

  • 检查量程配置是否合适
  • 启用CONFIG寄存器的低通滤波(如设置为0x06)

8. 相关资源

[1] 洋桃电子B站课程-STM32入门100步
[2] STM32官方文档手册
[3] STM32F103固件函数库用户手册(中文)
[4] MPU6050(加速度传感器)数据手册
[5] MPU6050原始数据显示程序
[6] MPU6050原理与驱动.pptx


💬 技术讨论(请在评论区留言~)

📌 下期预告:下一期将探讨低功耗模式,欢迎持续关注!

点击查阅🔍往期【STM32专栏】文章

版权声明:本文采用[CC BY-NC-SA 4.0]协议,转载请注明来源
实测开发版:洋桃1号开发版(基于STM32F103C8T6)
更新日志

  • v1.0 初始版本(2025-03-31)
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐