MPU6050用法
时间: 2025-05-22 20:47:57 浏览: 12
### MPU6005 使用教程
#### 关于MPU6050简介
MPU6050 是一款集成了三轴加速度计和三轴陀螺仪的惯性测量单元 (IMU),广泛应用于姿态检测、运动跟踪等领域。它通过 I2C 协议与微控制器通信,支持多种功能配置。
---
#### 接线图说明
以下是 MPU6050 与 STM32F103 的典型接线方式:
| **MPU6050 引脚** | **STM32F103 引脚** |
|-------------------|---------------------|
| VCC | 3.3V |
| GND | GND |
| SDA | PB7 (I2C1_SDA) |
| SCL | PB6 (I2C1_SCL) |
| INT | PA0 (可选中断引脚) |
注意:MPU6050 工作电压为 3.3V,切勿直接连接到 5V 电源[^2]。
---
#### 示例代码
以下是一个基于 STM32F103 和 HAL 库实现的 MPU6050 数据读取示例代码:
```c
#include "stm32f1xx_hal.h"
#define MPU6050_ADDR 0xD0 // 地址取决于 AD0 引脚状态
// 初始化 I2C
void I2C_Init(void) {
__HAL_RCC_I2C1_CLK_ENABLE();
hi2c1.Instance = I2C1;
hi2c1.Init.ClockSpeed = 100000; // 设置时钟频率为 100kHz
hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
hi2c1.Init.OwnAddress1 = 0;
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
if (HAL_I2C_Init(&hi2c1) != HAL_OK) {
Error_Handler();
}
}
// 写入寄存器
void Write_Reg(uint8_t reg, uint8_t data) {
HAL_I2C_Mem_Write(&hi2c1, MPU6050_ADDR, reg, 1, &data, 1, 100);
}
// 读取寄存器
uint8_t Read_Reg(uint8_t reg) {
uint8_t data;
HAL_I2C_Mem_Read(&hi2c1, MPU6050_ADDR, reg, 1, &data, 1, 100);
return data;
}
// 配置 MPU6050
void MPU6050_Config(void) {
// 复位设备
Write_Reg(0x6B, 0x80); // PWR_MGMT_1 寄存器复位
HAL_Delay(100);
// 取消睡眠模式
Write_Reg(0x6B, 0x00);
// 启用直通模式
Write_Reg(0x37, 0x02); // INT_PIN_CFG 寄存器启用直通模式
Write_Reg(0x6A, 0x00); // USER_CTRL 寄存器取消 FIFO 模式
}
int main(void) {
HAL_Init();
I2C_Init();
MPU6050_Config();
while (1) {
// 读取加速度数据
int16_t acc_x = ((Read_Reg(0x3B) << 8) | Read_Reg(0x3C)) / 16384.0 * 9.8;
int16_t acc_y = ((Read_Reg(0x3D) << 8) | Read_Reg(0x3E)) / 16384.0 * 9.8;
int16_t acc_z = ((Read_Reg(0x3F) << 8) | Read_Reg(0x40)) / 16384.0 * 9.8;
// 打印数据
printf("Acc X:%d Acc Y:%d Acc Z:%d\n", acc_x, acc_y, acc_z);
HAL_Delay(100);
}
}
```
以上代码实现了基本的初始化和加速度数据读取功能[^1]。
---
#### 注意事项
1. 在使用前需确认 MPU6050 的地址是否正确(默认为 `0xD0` 或 `0xD2`,具体由 AD0 引脚决定)。
2. 如果需要更高精度的角度计算,则可以结合 DCM 算法或 Kalman 滤波算法处理原始数据。
---
阅读全文
相关推荐


















