MPU6050三轴传感器

news2024/9/21 12:39:56

1.背景:

        MPU6050 是由 InvenSense(现为 TDK 旗下公司)生产的一款集成了三轴加速度计和三轴陀螺仪的微机电系统(MEMS)传感器。它可以测量物体在三个轴上的加速度和旋转角速度,被广泛应用于消费电子、工业控制、无人机、智能设备等领域。

1.2.工作原理

MPU6050 内部集成了:

  1. 三轴加速度计:能够测量X、Y、Z轴的加速度(以g为单位,1g ≈ 9.81 m/s²)。加速度计的工作原理基于微机电系统技术,通过微小的悬臂梁结构感知加速度引起的位移,然后转换为电信号输出。

  2. 三轴陀螺仪:能够测量X、Y、Z轴的角速度(以°/s为单位)。陀螺仪使用科里奥利效应,通过检测旋转时微小质量块的偏移来测量角速度。

        MPU6050 通过 I2C 或 SPI 接口与主机通信,传输传感器数据和配置信息。它还包括一个数字运动处理单元(DMP),可以进行姿态估计和运动检测。内部的数字低通滤波器(DLPF)能够减少噪声影响,提高数据稳定性。

1.3.规格

以下是 MPU6050 的一些关键规格:

  • 加速度计量程:±2g、±4g、±8g、±16g(可配置)
  • 陀螺仪量程:±250°/s、±500°/s、±1000°/s、±2000°/s(可配置)
  • 工作电压:2.375V - 3.46V
  • I2C 地址:0x68 或 0x69(可选)
  • 采样率:最高 1kHz
  • 低功耗特性:具备睡眠模式和低功耗传感器读取功能
  • 尺寸:4x4x0.9mm
  • 功耗:在典型配置下约为 3.9 mA

1.4.应用

MPU6050 在多种领域中有广泛应用,包括但不限于:

  1. 消费电子:智能手机、平板电脑中的屏幕旋转检测和稳定功能。
  2. 无人机:姿态控制、飞行稳定和导航。
  3. 可穿戴设备:运动追踪器、智能手表的活动监测和姿态检测。
  4. 虚拟现实(VR)和增强现实(AR)设备:用于头部和手部跟踪。
  5. 机器人和自动化控制:用于姿态估计和平衡控制。
  6. 汽车电子:用于车内安全系统、导航和防盗报警系统。

        MPU6050 的高集成度和多功能性使其成为各种应用中的理想选择,尤其是在需要精确运动检测和姿态估计的场景中。

2.pin to pin(引脚说明):

        这两个电路都是基于STM32F7系列的微控制器,它们通过不同的接口与外部设备相连。

  • 左侧电路:

    • MPU-6000微控制器通过CLKIN引脚接收外部时钟信号,同时通过SDI/SCK引脚发送数据。
    • AUX_DA引脚连接到AUX_CL上,用于提供额外的数据通道。
    • VDD引脚连接到C1和C2电容器上,用于稳定电源电压。
    • GND引脚接地,确保电路的稳定运行。
    • FSYNC引脚连接到INT上,用于同步外部设备的数据流。
  • 右侧电路:

    • MPU-6050微控制器同样通过CLKIN引脚接收外部时钟信号,并通过SDI/SCK引脚发送数据。
    • AUX_DA引脚也连接到AUX_CL上,提供额外的数据通道。
    • VDD引脚同样连接到C1和C2电容器上,确保电源电压稳定。
    • GND引脚接地,保证电路稳定运行。
    • C4电容器和VLOGIC引脚用于滤波和逻辑处理,提高电路的性能和稳定性。
    • FSYNC引脚连接到INT上,实现数据的同步传输。

        这两个电路的主要区别在于它们的功能和连接方式略有不同。左侧电路主要用于数据传输和同步控制,而右侧电路则更加注重逻辑处理和滤波功能。尽管如此,它们都采用了相同的STM32F7系列微控制器作为核心处理器,并共享了相似的接口和功能设计。这种设计使得这两个电路可以在不同的应用场景下发挥各自的优势,满足不同的需求。

3.陀螺仪特性:

3.1.特性:

  • 数字输出的X、Y和Z轴角速度传感器(陀螺仪),用户可编程的满量程范围为±250、±500、±1000和±2000°/秒
  • 连接到FSYNC引脚的外部同步信号支持图像、视频和GPS同步
  • 集成的16位ADCs能够同时采样陀螺仪
  • 增强的偏差和灵敏度温度稳定性减少了用户校准的需求
  • 改善了低频噪声性能
  • 数字可编程低通滤波器
  • 陀螺仪工作电流:3.6mA
  • 待机电流:5µA
  • 工厂校准的灵敏度比例因子
  • 用户自检

3.2. 加速度计特性

MPU-60X0中的三轴MEMS加速度计包括以下特性:

  • 数字输出的三轴加速度计,可编程的满量程范围为±2g、±4g、±8g和±16g
  • 集成的16位ADCs能够在不需要外部多路复用器的情况下同时采样加速度计
  • 加速度计正常工作电流:500µA
  • 低功耗加速度计模式电流:1.25Hz时10µA,5Hz时20µA,20Hz时60µA,40Hz时110µA
  • 方向检测和信号传递
  • 敲击检测
  • 用户可编程中断
  • 高G中断
  • 用户自检

 3.3.自检代码示例:

(注意这里的你的i2c地址需要根据自己的设计修改)

#include <Wire.h>

#define MPU6050_ADDR 0x68 // I2C地址

int16_t ax, ay, az; // 加速度计数据
int16_t gx, gy, gz; // 陀螺仪数据

void setup() {
  Serial.begin(9600);
  Wire.begin();
  Wire.setClock(400000); // 设置I2C时钟频率为400kHz

  // 初始化MPU6050
  Wire.beginTransmission(MPU6050_ADDR);
  Wire.write(0x6B); // PWR_MGMT_1寄存器地址
  Wire.write(0);    // 复位所有传感器
  Wire.endTransmission(true);
  delay(200);

  Wire.beginTransmission(MPU6050_ADDR);
  Wire.write(0x6B); // PWR_MGMT_1寄存器地址
  Wire.write(0x00); // 唤醒所有传感器
  Wire.endTransmission(true);
  delay(200);

  Wire.beginTransmission(MPU6050_ADDR);
  Wire.write(0x1B); // GYRO_CONFIG寄存器地址
  Wire.write(0x18); // 设置陀螺仪量程为±2000°/sec
  Wire.endTransmission(true);
  delay(200);

  Wire.beginTransmission(MPU6050_ADDR);
  Wire.write(0x1C); // ACCEL_CONFIG寄存器地址
  Wire.write(0x10); // 设置加速度计量程为±2g
  Wire.endTransmission(true);
  delay(200);
}

void loop() {
  // 读取加速度计数据
  Wire.beginTransmission(MPU6050_ADDR);
  Wire.write(0x3B); // ACCEL_XOUT_H寄存器地址
  Wire.endTransmission(false);
  Wire.requestFrom(MPU6050_ADDR, 14, true);
  ax = Wire.read() << 8 | Wire.read();
  ay = Wire.read() << 8 | Wire.read();
  az = Wire.read() << 8 | Wire.read();
  gx = Wire.read() << 8 | Wire.read();
  gy = Wire.read() << 8 | Wire.read();
  gz = Wire.read() << 8 | Wire.read();

  // 输出加速度计和陀螺仪数据
  Serial.print("Accelerometer: X=");
  Serial.print(ax);
  Serial.print(" Y=");
  Serial.print(ay);
  Serial.print(" Z=");
  Serial.println(az);

  Serial.print("Gyroscope: X=");
  Serial.print(gx);
  Serial.print(" Y=");
  Serial.print(gy);
  Serial.print(" Z=");
  Serial.println(gz);

  delay(1000); // 每秒更新一次数据
}

4.初始化运行示例:

#include "main.h"
#include "i2c.h"

#define MPU6050_ADDR 0x68 << 1      // I2C address of MPU6050 (shifted for HAL)
#define MPU6050_WHO_AM_I 0x75       // WHO_AM_I register address
#define MPU6050_PWR_MGMT_1 0x6B     // Power management register
#define MPU6050_ACCEL_XOUT_H 0x3B   // Acceleration data register
#define MPU6050_GYRO_XOUT_H 0x43    // Gyroscope data register
#define MPU6050_ACCEL_CONFIG 0x1C   // Accelerometer configuration register
#define MPU6050_GYRO_CONFIG 0x1B    // Gyroscope configuration register
#define MPU6050_CONFIG 0x1A         // Configuration register (DLPF)

// Accelerometer sensitivity scale factors
#define AFS_2G 16384.0
#define AFS_4G 8192.0
#define AFS_8G 4096.0
#define AFS_16G 2048.0

// Gyroscope sensitivity scale factors
#define GFS_250DPS 131.0
#define GFS_500DPS 65.5
#define GFS_1000DPS 32.8
#define GFS_2000DPS 16.4

void MPU6050_Init(uint8_t accelRange, uint8_t gyroRange, uint8_t dlpf);
void MPU6050_ReadAccel(int16_t* pData);
void MPU6050_ReadGyro(int16_t* pData);
float MPU6050_ConvertAccel(int16_t rawValue, uint8_t accelRange);
float MPU6050_ConvertGyro(int16_t rawValue, uint8_t gyroRange);

I2C_HandleTypeDef hi2c1; // Assume hi2c1 is initialized elsewhere

int main(void) {
    // System initialization code
    HAL_Init();
    // Initialize the I2C peripheral
    MX_I2C1_Init();
    // Initialize the MPU6050
    MPU6050_Init(0x00, 0x00, 0x03); // 2G accel range, 250dps gyro range, DLPF 42Hz

    int16_t accelData[3];
    int16_t gyroData[3];

    while (1) {
        // Read accelerometer and gyroscope data
        MPU6050_ReadAccel(accelData);
        MPU6050_ReadGyro(gyroData);

        // Convert raw data to meaningful values
        float accelX = MPU6050_ConvertAccel(accelData[0], 0x00);
        float accelY = MPU6050_ConvertAccel(accelData[1], 0x00);
        float accelZ = MPU6050_ConvertAccel(accelData[2], 0x00);

        float gyroX = MPU6050_ConvertGyro(gyroData[0], 0x00);
        float gyroY = MPU6050_ConvertGyro(gyroData[1], 0x00);
        float gyroZ = MPU6050_ConvertGyro(gyroData[2], 0x00);

        // Use the converted data
    }
}

void MPU6050_Init(uint8_t accelRange, uint8_t gyroRange, uint8_t dlpf) {
    uint8_t check, data;

    // Check MPU6050 WHO_AM_I register
    HAL_I2C_Mem_Read(&hi2c1, MPU6050_ADDR, MPU6050_WHO_AM_I, 1, &check, 1, HAL_MAX_DELAY);
    if (check == 0x68) {
        // Wake up the MPU6050 by writing to PWR_MGMT_1 register
        data = 0x00;
        HAL_I2C_Mem_Write(&hi2c1, MPU6050_ADDR, MPU6050_PWR_MGMT_1, 1, &data, 1, HAL_MAX_DELAY);

        // Set accelerometer range
        HAL_I2C_Mem_Read(&hi2c1, MPU6050_ADDR, MPU6050_ACCEL_CONFIG, 1, &data, 1, HAL_MAX_DELAY);
        data = (data & 0xE7) | (accelRange << 3);
        HAL_I2C_Mem_Write(&hi2c1, MPU6050_ADDR, MPU6050_ACCEL_CONFIG, 1, &data, 1, HAL_MAX_DELAY);

        // Set gyroscope range
        HAL_I2C_Mem_Read(&hi2c1, MPU6050_ADDR, MPU6050_GYRO_CONFIG, 1, &data, 1, HAL_MAX_DELAY);
        data = (data & 0xE7) | (gyroRange << 3);
        HAL_I2C_Mem_Write(&hi2c1, MPU6050_ADDR, MPU6050_GYRO_CONFIG, 1, &data, 1, HAL_MAX_DELAY);

        // Set DLPF (Digital Low Pass Filter)
        HAL_I2C_Mem_Read(&hi2c1, MPU6050_ADDR, MPU6050_CONFIG, 1, &data, 1, HAL_MAX_DELAY);
        data = (data & 0xF8) | dlpf;
        HAL_I2C_Mem_Write(&hi2c1, MPU6050_ADDR, MPU6050_CONFIG, 1, &data, 1, HAL_MAX_DELAY);
    }
}

void MPU6050_ReadAccel(int16_t* pData) {
    uint8_t data[6];
    HAL_I2C_Mem_Read(&hi2c1, MPU6050_ADDR, MPU6050_ACCEL_XOUT_H, 1, data, 6, HAL_MAX_DELAY);
    pData[0] = (int16_t)(data[0] << 8 | data[1]);
    pData[1] = (int16_t)(data[2] << 8 | data[3]);
    pData[2] = (int16_t)(data[4] << 8 | data[5]);
}

void MPU6050_ReadGyro(int16_t* pData) {
    uint8_t data[6];
    HAL_I2C_Mem_Read(&hi2c1, MPU6050_ADDR, MPU6050_GYRO_XOUT_H, 1, data, 6, HAL_MAX_DELAY);
    pData[0] = (int16_t)(data[0] << 8 | data[1]);
    pData[1] = (int16_t)(data[2] << 8 | data[3]);
    pData[2] = (int16_t)(data[4] << 8 | data[5]);
}

float MPU6050_ConvertAccel(int16_t rawValue, uint8_t accelRange) {
    float scaleFactor;

    switch (accelRange) {
        case 0x00: scaleFactor = AFS_2G; break;
        case 0x01: scaleFactor = AFS_4G; break;
        case 0x02: scaleFactor = AFS_8G; break;
        case 0x03: scaleFactor = AFS_16G; break;
        default: scaleFactor = AFS_2G; break;
    }

    return rawValue / scaleFactor;
}

float MPU6050_ConvertGyro(int16_t rawValue, uint8_t gyroRange) {
    float scaleFactor;

    switch (gyroRange) {
        case 0x00: scaleFactor = GFS_250DPS; break;
        case 0x01: scaleFactor = GFS_500DPS; break;
        case 0x02: scaleFactor = GFS_1000DPS; break;
        case 0x03: scaleFactor = GFS_2000DPS; break;
        default: scaleFactor = GFS_250DPS; break;
    }

    return rawValue / scaleFactor;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1945278.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微前端--single-spa

微前端 使用微前端的挑战&#xff1a; 子应用切换&#xff0c;应用相互隔离&#xff0c;互补干扰&#xff0c;子应用之前的通信&#xff0c;多个子应用并存&#xff0c;用户状态的存储&#xff0c;免登。 常用技术方案 路由分发式微前端 通过http服务的反向代理 http {serv…

光盘防水嘛 ? DVD+R 刻录光盘泡水实验

首发日期 2024-07-20, 以下为原文内容: 同志们好, 欢迎来到 胖喵穷人实验室 ! 这里专注于 低成本, 低难度, 低风险 的 “三低” 小实验. 胖喵穷人实验室 (PM-PLab-E)正式名称: 紫腹巨蚊 (Toxorhynchites gravelyi) 系列穷人 (Poor people) 实验室风险警告: 低风险并不是零风险…

47.简易电压表的设计与验证(2)

&#xff08;1&#xff09;Verilog 代码&#xff1a; module adc_collect(input clk ,input reset_n ,input [7:0] adc_data ,output clk_adc );wire clk_adc_a ;…

PostgreSQL异常:An I/O error occurred while sending to the backend

在使用PostgreSQL数据库批量写入数据的时候&#xff0c;遇到了一个问题&#xff0c;异常内容如下&#xff1a; Cause: org.postgresql.util.PSQLException: An I/O error occurred while sending to the backend.报错内容 报错提示1 Caused by: org.postgresql.util.PSQLExc…

QTimer::singleShot导致定时器资源耗尽解决方法

参考文章&#xff1a;Qt QTimer::singleShot问题及用法 1. 问题描述 QTimer::singleShot定时器事件超时&#xff0c;如果此时类内对象已经被回收&#xff0c;定时器事件调用已经释放的类内资源时会引起崩溃。 这通常是因为定时器的回调函数&#xff08;槽函数&#xff09;在执…

网工能保住饭碗的小技能-划分VLAN

网络工程师&#xff0c;咱也是有一定的专业的知识和技能&#xff0c;今天&#xff0c;我们就来聊聊网络工程师的一项核心技能——VLAN划分&#xff0c;以及它如何成为网络工程师职业生涯中的“铁饭碗”。 VLAN&#xff0c;全称Virtual Local Area Network&#xff08;虚拟局域…

MVCC数据库并发控制技术

一、引言 MVCC&#xff08;Multi-Version Concurrency Control&#xff09;是一种广泛使用的数据库并发控制技术&#xff0c;它允许数据库读操作和写操作并发执行&#xff0c;而无需加锁整个表或行&#xff0c;从而大大提高了数据库的并发性能和吞吐量。MVCC主要被应用于支持事…

Java学习 - Spring Boot整合 Thymeleaf 实例

什么是 Thymeleaf Thymeleaf 是新一代的 Java 模板引擎&#xff0c;类似于 Velocity、FreeMarker 等传统引擎&#xff0c;其语言和 HTML 很接近&#xff0c;而且扩展性更高&#xff1b; Thymeleaf 的主要目的是将优雅的模板引入开发工作流程中&#xff0c;并将 HTML 在浏览器中…

IEEE官方列表会议 | 第三届能源与环境工程国际会议(CFEEE 2024)

会议简介 Brief Introduction 2024年第三届能源与环境工程国际会议(CFEEE 2024) 会议时间&#xff1a;2024年12月2日-4日 召开地点&#xff1a;澳大利亚凯恩斯 大会官网&#xff1a;CFEEE 2024-2024 International Conference on Frontiers of Energy and Environment Engineer…

信创改造叠加等保/密评合规,服务器定期改密难落实?

信创国产化改造是我国党政、金融、电信、电力等行业信息安全建设的主旋律。在信创改造背景下还叠加了等保、密评等合规性要求&#xff0c;因此党政、金融等行业单位在建设信创应用、终端、服务器时必须满足等保、密评要求。 在数据中心运维场景&#xff0c;受行业监管、密评、…

SQL 注入漏洞详解 - Union 注入

1)漏洞简介 SQL 注入简介 SQL 注入 即是指 Web 应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在 Web 应用程序中事先定义好的查询语句的结尾上添加额外的 SQL 语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,…

javaScrip的学习(一)

目录 引言 一、java和JavaScript的联系 二、js中的弹出框 1.alert弹出框 2.confirm带确认取消的按钮弹框 3.prompt带有提示信息且带有输入框的弹框 4.输出到网页中 ​三、js引入方式 1. 放在script标签中 2.放在外部js文件中 四、执行顺序 五、书写规范 1. 语句结…

专业技能(挖坑填坑)——Java核心基础知识,对集合、线程

熟悉Java核心基础知识&#xff0c;对集合、线程等都有了解&#xff0c;能运用模块化、面向对象的方式编程。 1.Java八种基本数据类型 Java的数据类型分为两大类&#xff1a;①基本数据类型 ②引用数据类型 2.面向对象三大特性 封装、继承、多态。 简要介绍一下/谈一下你的…

为什么 FPGA 的效率低于 ASIC?

FPGA是“可重构逻辑”器件。先制造的芯片&#xff0c;再次设计时“重新配置”。 ASIC 不需要“重新配置”。你先设计&#xff0c;把它交给代工厂&#xff0c;然后制造芯片。 现在让我们看看这些芯片的结构是什么样的&#xff0c;以及它们的不同之处。 ● 逻辑单元&#xff1a;F…

(leetcode学习)21. 合并两个有序链表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4]示例 2&#xff1a; 输入&#xff1a;l1 [], l2 [] 输出&#xff1a;[]示例…

Ethernet/IP转ModbusTCP协议转化网关(经典通讯案例)

怎么样把EtherNet/IP和ModbusTCP网络通讯连接起来呢?最近有很多朋友咨询这个问题&#xff0c;在这里统一为大家详细说明一下。其实有一个设备可以很轻松地解决这个问题&#xff0c;名为YC-EIP-TCP&#xff0c;下面是详细信息。 一&#xff0c;设备主要功能 1YC-EIP-TCP工业级…

数据结构(5.3_1)——二叉树的先中后序遍历

先序遍历——根左右——前缀表达式 中序遍历——左根右——中缀表达式 后序遍历——左右根——后缀表达式 二叉树的遍历(手算) 先序遍历代码 struct ElemType {int value; }; //二叉树的结点(链式存储) typedef struct BiTNode {ElemType data;//数据域struct BiTNode *lchil…

数据采集产品 搭建智能水房实现远程控制的案例分享

一、系统简介 随着科技的逐步发达&#xff0c;在各个领域都迫切的希望有一种控制系统能代替传统的操作方式&#xff0c;智能水房控制系统则是一种符合人们要求的系统&#xff0c;他可代替传统的人工机械操控&#xff0c;真正实现控制智能化。通过水房的各种数据采集可以实现24小…

学习记录——day15 数据结构 链表

链表的引入 顺序表的优缺点 1、优点:能够直接通过下标进行定位元素&#xff0c;访问效率高&#xff0c;对元素进行查找和修改比较快 2、不足:插入和删除元素需要移动大量的元素&#xff0c;效率较低 3、缺点:存储数据元素有上限&#xff0c;当达到MAX后&#xff0c;就不能再…

VScode tab不能正常使用

现象不能够在文本编辑器中按下tab键&#xff0c;如果按下了&#xff0c;就焦点会跑到终端或者是其他地方&#xff0c;猜测是因为装了某些插件导致的。 解决方案比较简单&#xff1a; 删除掉其他的按键 比如这样的&#xff0c;保存就可以了