主题 | 内容 | 教学目的/扩展视频 |
---|---|---|
加速度传感器 | 电路连接。手册分析。驱动程序,读出数据。 | 能读出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初始化函数解析
初始化流程如下所示:
关键代码实现:
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. 扩展应用与优化建议
- 数据滤波:启用CONFIG寄存器的数字低通滤波器(DLPF)可减少噪声
- 中断配置:通过INT_ENABLE寄存器启用数据就绪中断
- 温度补偿:读取TEMP_OUT寄存器实现温度补偿算法
- 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)