登录/注册

STM32陀螺仪使用教程

STM32陀螺仪使用教程

更多

以下是一个基于 STM32 驱动 I²C 接口陀螺仪(以常见的 MPU6050 为例) 的中文教程,涵盖硬件连接、软件配置、数据读取和简单滤波处理步骤:


1. 硬件准备


2. 软件环境


3. 配置步骤

(1) 初始化 I²C 外设

// 在 main.c 中
I2C_HandleTypeDef hi2c1;

void MX_I2C1_Init(void) {
  hi2c1.Instance = I2C1;
  hi2c1.Init.ClockSpeed = 100000;      // 100kHz 标准模式
  hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
  hi2c1.Init.OwnAddress1 = 0;          // STM32 作为主机地址可设为0
  hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
  if (HAL_I2C_Init(&hi2c1) != HAL_OK) {
    Error_Handler();
  }
}

(2) 编写 MPU6050 驱动

mpu6050.h

#define MPU6050_ADDR_WRITE 0xD0   // I²C 写地址 (AD0=0)
#define MPU6050_ADDR_READ  0xD1   // I²C 读地址 (AD0=0)

// 寄存器地址
#define SMPLRT_DIV_REG     0x19
#define PWR_MGMT_1_REG     0x6B
#define ACCEL_CONFIG_REG   0x1C
#define GYRO_CONFIG_REG    0x1B
#define ACCEL_XOUT_H_REG   0x3B
#define TEMP_OUT_H_REG     0x41
#define GYRO_XOUT_H_REG    0x43

// 初始化函数
uint8_t MPU6050_Init(I2C_HandleTypeDef *hi2c);
// 读取原始数据函数
void MPU6050_Read_Raw(I2C_HandleTypeDef *hi2c, int16_t *accel, int16_t *gyro, int16_t *temp);

mpu6050.c

#include "mpu6050.h"

// 初始化 MPU6050
uint8_t MPU6050_Init(I2C_HandleTypeDef *hi2c) {
  // 1. 解除休眠状态
  uint8_t data = 0x00;  
  HAL_I2C_Mem_Write(hi2c, MPU6050_ADDR_WRITE, PWR_MGMT_1_REG, 1, &data, 1, 100);

  // 2. 设置陀螺仪量程 ±500°/s (可选 ±250, ±500, ±1000, ±2000)
  data = 0x08; // 二进制 00001000(FS_SEL=1)
  HAL_I2C_Mem_Write(hi2c, MPU6050_ADDR_WRITE, GYRO_CONFIG_REG, 1, &data, 1, 100);

  // 3. 设置加速度计量程 ±4g (可选 ±2g,±4g,±8g,±16g)
  data = 0x08; // 二进制 00001000(AFS_SEL=1)
  HAL_I2C_Mem_Write(hi2c, MPU6050_ADDR_WRITE, ACCEL_CONFIG_REG, 1, &data, 1, 100);

  return 0; // 成功返回0
}

// 读取原始数据(加速度、温度、角速度)
void MPU6050_Read_Raw(I2C_HandleTypeDef *hi2c, int16_t *accel, int16_t *gyro, int16_t *temp) {
  uint8_t buffer[14];

  // 从 ACCEL_XOUT_H 开始连续读取14字节 (加速度6B + 温度2B + 陀螺仪6B)
  HAL_I2C_Mem_Read(hi2c, MPU6050_ADDR_READ, ACCEL_XOUT_H_REG, 1, buffer, 14, 100);

  // 合并高8位和低8位数据
  accel[0] = (buffer[0] << 8) | buffer[1];  // Accel X
  accel[1] = (buffer[2] << 8) | buffer[3];  // Accel Y
  accel[2] = (buffer[4] << 8) | buffer[5];  // Accel Z

  *temp = (buffer[6] << 8) | buffer[7];     // Temperature

  gyro[0] = (buffer[8] << 8) | buffer[9];   // Gyro X
  gyro[1] = (buffer[10] << 8) | buffer[11]; // Gyro Y
  gyro[2] = (buffer[12] << 8) | buffer[13]; // Gyro Z
}

4. 主循环中读取数据

#include "mpu6050.h"

int main(void) {
  // HAL初始化、I2C初始化...
  MPU6050_Init(&hi2c1); // 初始化陀螺仪

  int16_t accel[3], gyro[3], temp;

  while (1) {
    MPU6050_Read_Raw(&hi2c1, accel, gyro, &temp);

    // 转换为物理值(根据量程设置)
    float gx = gyro[0] / 65.5f; // ±500°/s 时灵敏度为 65.5 LSB/(°/s)
    float gy = gyro[1] / 65.5f;
    float gz = gyro[2] / 65.5f;

    // 打印数据(通过串口/USB输出)
    printf("Gyro: X=%.2f°/s, Y=%.2f°/s, Z=%.2f°/s\r\n", gx, gy, gz);

    HAL_Delay(100); // 100ms读取一次
  }
}

5. 数据处理关键点

  1. 单位转换

    • 陀螺仪角速度(°/s) = 原始值 / 灵敏度
      • ±250dps → 131 LSB/(°/s)
      • ±500dps → 65.5 LSB/(°/s) ✅
      • ±1000dps → 32.8 LSB/(°/s)
      • ±2000dps → 16.4 LSB/(°/s)
  2. 数据滤波

    • 原始数据存在噪声,常用 卡尔曼滤波互补滤波 融合加速度计数据得到稳定姿态角。
    • 简单场景可用移动平均:

      #define FILTER_SIZE 10
      float gyro_buffer[3][FILTER_SIZE];
      float filtered_gyro[3] = {0};
      
      // 每次更新时
      for (int i=0; i<3; i++) {
       gyro_buffer[i][current_index] = g_raw[i]; // 存入新数据
       filtered_gyro[i] = 0;
       for (int j=0; j<FILTER_SIZE; j++) {
           filtered_gyro[i] += gyro_buffer[i][j];
       }
       filtered_gyro[i] /= FILTER_SIZE;
      }
      current_index = (current_index + 1) % FILTER_SIZE;
  3. 零偏校准

    • 静止时读取多次陀螺仪数据求平均,作为零偏值(Offset),后续数据减去此值。

6. 常见问题排查

问题 可能原因 解决方法
I²C 通信失败 接线错误、地址不对、上拉电阻缺失 检查接线、地址、添加上拉电阻
数据全为0 未唤醒芯片、供电异常 调用 PWR_MGMT_1_REG 唤醒
数据跳动剧烈 未滤波、量程设置过小 增加滤波算法、增大量程设置
温度值异常 未正确读取温度寄存器 检查温度寄存器地址和数据拼接

7. 进阶应用

资源推荐

通过以上步骤,即可完成 STM32 与陀螺仪的基础通信和数据处理。实际应用中需根据需求优化滤波算法和姿态解算逻辑。

什么是光纤陀螺仪陀螺仪有哪些作用?

陀螺仪是干什么用的?陀螺仪是用来感知和测量物体旋转的一个传感器。简单来说,它可以帮助设备知道自己当前的角度和运动方向。通常,我们会在智能手机、无人机、VR设备等科技产品中看到

2025-08-26 17:36:13

手机陀螺仪失灵解决方法

手机陀螺仪是一种用于感知和测量设备旋转、倾斜和方向的传感器。失灵的陀螺仪可能导致手机在运动控制、游戏和导航等应用中出现问题。下面将详细介绍陀螺仪

2024-01-30 10:06:45

陀螺仪的基本组成 陀螺仪的工作原理 陀螺仪的作用

陀螺仪的基本组成 陀螺仪的工作原理 陀螺仪的作用 陀螺仪和重力传感器有什

2023-12-07 11:26:00

陀螺仪x轴和y轴的应用

陀螺仪是一种用于测量和感应物体旋转和转动的设备,它通常由三个轴组成:x轴、y轴和z轴。在陀螺仪中,x轴和y轴通常成对出现,关于它们的比例可以因具体应用而异。首先,我们先了解一下

资料下载 jf_49927484 2024-04-17 15:42:06

EPSON X2A0002710002 XV7011BB陀螺仪传感器的特征和用途

陀螺仪传感器在很多领域都需要用到。如被用在手机的摄像头上,来防止由于抖动对图像质量的影响。再如当汽车行驶过程中没有GPS讯号时,可以通过陀螺仪来测量汽车的偏航或直线运动位移,从而继续导航等。

资料下载 jf_49927484 2024-03-12 17:13:41

EPSON的GGPM6083STD陀螺仪传感器(压电侠)

之前介绍过应用于割草机惯性导航高性能陀螺仪传感器SGPM01,SGPM01是基于高性能陀螺仪陀传感器和加速度计开发的模组,内置3轴陀螺仪和3轴加

资料下载 jf_49927484 2024-03-05 16:59:56

STM32F407ZE开发板MPU6050陀螺仪的应用

STM32F407ZE开发板MPU6050陀螺仪的应用

资料下载 佚名 2021-12-06 14:36:14

MEMS陀螺仪姿态算法研究综述

MEMS陀螺仪姿态算法研究综述

资料下载 佚名 2021-05-26 14:24:14

陀螺仪是什么?陀螺仪工作原理

因为ST选用了音叉方法设计陀螺仪,其差分特性使系统本身对作用在传感器上的无用线性加速度和杂乱振动的敏感度低于市场上现有的其它类型陀螺仪。当这些无用的信号被施加到

2023-10-08 16:49:56

怎么解决陀螺仪角度漂移问题 三轴陀螺仪和六轴陀螺仪的区别

陀螺仪角度漂移是指在使用陀螺仪时,由于各种误差和不完美的因素导致测量的角度随时间发生偏移。为了解决陀螺仪角度漂移问题,可以考虑以下几种方法。

2023-08-21 14:40:37

什么是MEMS陀螺仪

Ericco的MEMS陀螺仪根据轴数分为单轴、双轴和三轴。它分为工业级、战术级(ER-MG-056、ER-MG-067)和导航级(ER-MG2-50/100、ER-MG2-300/400)。战术

2023-07-07 10:16:47

陀螺仪芯片的工作原理

陀螺仪是用来测量角速率的器件,可以在加速度功能基础上,构建陀螺仪。

2021-12-10 11:44:33

陀螺仪传感器的分类_陀螺仪传感器有什么用

陀螺仪传感器可以全方位的感受空间上位移的变化维较少,最早应用于航空、航天和航海等领域。随着陀螺仪传感器成本的下降,现在很多智能手机都集成有陀螺仪

2020-12-07 15:01:32

工业和汽车级MEMS陀螺仪的应用

目前,在陀螺仪应用领域,按精度细分的话,陀螺仪可分为商用陀螺仪、战术陀螺仪

2020-07-14 16:00:39

光纤陀螺仪与旋转式陀螺仪的工作原理解析

光纤陀螺仪(FOGs)与常用于玩具中的旋转式陀螺仪类似,因为这两种陀螺仪都能测量物体的旋转。但这两种

2019-10-10 15:22:31

7天热门专题 换一换
相关标签