0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于CW32系列MCU的MPU6050姿态传感器设计

jf_qE49KoVBr8 来源:武汉芯源半导体 2023-09-27 13:49 次阅读

一、简介

1.MPU6050是一种常用的六轴姿态传感器模块,结合了三轴陀螺仪和三轴加速度计,以及一个可扩展的数字运动处理器DMP(Digital Motion Processor),可用I2C接口连接一个第三方的数字传感器,比如磁力计。MPU6050 对陀螺仪和加速度计分别用了三个16 位的ADC(0~65535),将其测量的模拟量转化为可输出的数字量。为了精确跟踪快速和慢速的运动,传感器的测量范围都是用户可控的,陀螺仪可测范围为±250,±500,±1000,±2000°/秒(dps),加速度计可测范围为±2,±4,±8,±16g。并有可编程的低通滤波器。MPU6050模块的应用场景非常广泛,包括但不限于以下几个领域:

(1)姿态感知与控制:通过读取陀螺仪和加速度计的数据,可以实时获取物体的姿态信息,如倾斜角度、旋转角度等。这在飞行器、机器人、无人车等项目中非常常见,用于实现姿态感知和控制。

(2)运动跟踪与手势识别:MPU6050可以用于捕捉人体运动轨迹,如手部的姿态和手势,从而实现运动跟踪、手势识别、虚拟现实交互等应用。

(3)震动检测与防抖:结合加速度计,MPU6050可以检测到物体的震动和冲击,用于防抖技术、硬盘保护、运动检测等。

(4)步态分析与健康监测:MPU6050可以用于分析人体的步态特征和动作,用于健康监测、运动分析、姿势校正等。

二、所需物料+寄存器说明

.本实验使用到了CW32F030C8小蓝板、GY-521模块、0.96寸OLED显示屏Keil5开发环境

14cced38-5cf7-11ee-939d-92fbcf53809c.png
CW32F030C8小蓝板
14d4ed76-5cf7-11ee-939d-92fbcf53809c.png
GY-521模块

14eab19c-5cf7-11ee-939d-92fbcf53809c.png

实物展示

【GY-521模块与单片机连线】:VCC<-->+3.3V

GND<-->GND

SCL<-->PB5

SDA<-->PB4

【OLED显示屏与单片机连线】:VCC<-->+3.3V

GND<-->GND

SCL<-->PA1

SDA<-->PA2

注:SCL和 SDA是连接MCU的 IIC接口,MCU通过这个IIC 接口来控制MPU6050,另外还有一个 IIC 接口: XCL和XDA ,这个接口可用来连外部从设备比如磁力计,这样就可以组成一个九轴传感器。AD0是MPU6050的地址控制引脚,该引脚控制的是IIC 地址的最低位。MPU6050的默认IIC地址是:0X68,如果AD0接VDD,则是0X69。需要注意的是:这里的地址0x68(110 1000)和0x69(110 1001)是不包含最低位的7位数据,通常最低位用于表示IIC主机的读取数据/写数据模式。如默认情况下对MPU6050进行写操作,则发送地址0xD0(1101 0000),读操作则发送地址0xD1(1101 0001)。

寄存器说明:

1500e566-5cf7-11ee-939d-92fbcf53809c.png

该寄存器是配置陀螺仪输出速率的分频器,用于为MPU-6050生成采样速率。这里有个公式:采样频率=陀螺仪输出频率/(1+采样分频数)。当 DLPF(数字低通滤波器,见寄存器Configuration)禁用时,陀螺仪输出频率为8kHz;当 DLPF 使能,陀螺仪输出频率=1KHz。

15072c28-5cf7-11ee-939d-92fbcf53809c.png

该寄存器为陀螺仪和加速度计配置外部帧同步(FSYNC) 管脚的采样和数字低通滤波(DLPF)设置。其中,数字低通滤波器DLPF由DLPF_CFG配置。根据下表所示的DLPF_CFG值对加速度计和陀螺仪进行滤波。

150e1bd2-5cf7-11ee-939d-92fbcf53809c.png

FS为陀螺仪输出频率。SMPLRT_DIV由预设定的采样频率根据上述的公式计算得出。一般情况下,DPLF滤波频率为采样频率的一半,如设定采样频率为50Hz,由表可知当FS为1kHz,SMPLRT_DIV的值为1000/50-1=19。

150e1bd2-5cf7-11ee-939d-92fbcf53809c.png

该寄存器是用来触发陀螺仪自检和配置陀螺仪的满量程范围。其中,XG_ST、YG_ST、ZG_ST分别用来设置陀螺仪X轴、Y轴、Z轴自检,置0则不触发自检。FS_SEL[1:0]用于设置陀螺仪的满量程,如下表:

151c2182-5cf7-11ee-939d-92fbcf53809c.png

我们一般设置为3,即满量程为±2000°/s

152d0326-5cf7-11ee-939d-92fbcf53809c.png

该寄存器是用来触发加速度计自检和配置加速度计的满量程范围。同时这个寄存器也可以用于配置数字高通滤波器(DHPF)。其中,XA_ST、YA_ST、ZA_ST分别用来设置加速度计X轴、Y轴、Z轴自检,置0则不触发自检。AFS_SEL[1:0]用于选择加速度计的满量程范围,如下表:

153a1f70-5cf7-11ee-939d-92fbcf53809c.png

我们一般设置为0,即满量程为±2g

1548c318-5cf7-11ee-939d-92fbcf53809c.png

ACCEL_XOUT :由 2部分组成的 16位数值存储最近X 轴加速度计的测量值。ACCEL_YOUT :由 2部分组成的 16位数值存储最近Y 轴加速度计的测量值。ACCEL_ZOUT :由 2部分组成的 16位数值存储最近Z 轴加速度计的测量值。

以ACCEL_XOUT为例,若倍率设定为2g,则意味着ACC_X取最小值-32768时,当前加速度为沿X轴正方向2倍的重力加速度;若设定为4g,取-32768时表示沿X轴正方向4倍的重力加速度,以此类推。显然,倍率越低精度越好,倍率越高表示的范围越大,这要根据具体的应用来设定。以ACC_X为例,若当前设定的加速度倍率为4g,那么将ACC_X读数换算为加速度的公式为:

1559aa2a-5cf7-11ee-939d-92fbcf53809c.png

g可取当地重力加速度。

1563e92c-5cf7-11ee-939d-92fbcf53809c.png

该寄存器存储最近加陀螺仪的测量值,构成与加速度计测量值寄存器相同,不做赘述。

以GYR_X为例,若倍率设定为250度/秒,则意味着GYR取正最大值32768时,当前角速度为顺时针250度/秒;若设定为500度/秒,取32768时表示当前角速度为顺时针500度/秒。显然,倍率越低精度越好,倍率越高表示的范围越大。以GYR_X为例,若当前设定的角速度倍率为1000度/秒,那么将GRY_X读数换算为角速度(顺时针)的公式为:

15734dae-5cf7-11ee-939d-92fbcf53809c.png

15878ad0-5cf7-11ee-939d-92fbcf53809c.png

该寄存器允许用户配置电源模式和时钟源,还提供了复位整个设备和禁用温度传感器的位。当置SLEEP位为1时,MPU-60X0 可以进入低功耗睡眠模式。该寄存器的最低三位用于设置系统的时钟源选择,默认值是0(内部8M RC振荡),不过一般设置为1,即选择x轴陀螺仪PLL作为时钟源,以获得更高精度的时钟。DEVICE_RESET该位置 1,重启内部寄存器到默认值。复位完成后该位自动清0。TEMP_DIS该位置 1,禁用温度传感器。

三、核心代码

main.c:
#include "main.h"
#include "OLED.h"
#include "GY_521.h"
#include "MYI2C.h"
#include "Delay.h"


typedef struct{
  int16_t AX;
  int16_t AY;
  int16_t AZ;  
}MPU6050_Adata;  //MPU6050加速度计三轴数据


typedef struct{
  int16_t GX;
  int16_t GY;
  int16_t GZ;  
}MPU6050_Gdata;  //MPU6050陀螺仪三轴数据


MPU6050_Adata Adata;  //结构体变量
MPU6050_Gdata Gdata;


void GY_521_Init(void)  //GY-521初始化
{
  GY521_GPIO_Init();  //GPIO初始化
  //解除睡眠,失能温度传感器,选择X轴的陀螺仪时钟
  WriteData(GY521_ADDR, MPU6050_PWR_MGMT_1, 0x09); 
  WriteData(GY521_ADDR, MPU6050_CONFIG, 0x06); //低通滤波
  WriteData(GY521_ADDR, MPU6050_SMPRT_DIV, 0x09); //1KHz十分频为100Hz
  WriteData(GY521_ADDR, MPU6050_GYRO_CONFIG, 0x18);//陀螺仪最大量程
  WriteData(GY521_ADDR, MPU6050_ACCEL_CONFIG, 0x18);//加速度计最大量程
}


void MPU6050_GetData()  //获取MPU6050六轴数据
{
  uint8_t MPU6050_Raw_Data[14]={0};
  //以MPU6050_ACCEL_XOUT_H为起始地址,连续读取14字节的数据
  ReadData(GY521_ADDR,MPU6050_ACCEL_XOUT_H,MPU6050_Raw_Data,14);
  //数据处理
  Adata.AX=(MPU6050_Raw_Data[0]<<8)|MPU6050_Raw_Data[1];
  Adata.AY=(MPU6050_Raw_Data[2]<<8)|MPU6050_Raw_Data[3];
  Adata.AZ=(MPU6050_Raw_Data[4]<<8)|MPU6050_Raw_Data[5];
  Gdata.GX=(MPU6050_Raw_Data[8]<<8)|MPU6050_Raw_Data[9];
  Gdata.GY=(MPU6050_Raw_Data[10]<<8)|MPU6050_Raw_Data[11];
  Gdata.GZ=(MPU6050_Raw_Data[12]<<8)|MPU6050_Raw_Data[13];
}


int main()
{
  OLED_Init();   //OLED初始化
  GY_521_Init(); //GY-521初始化
  OLED_ShowString(1,1,"A:      G:");//提示:左列显示加速度计数据;右列显示陀螺仪数据
  while(1)
  {
    MPU6050_GetData(); //获取六轴数据
    OLED_ShowSignedNum(2,1,Adata.AX,5);
    OLED_ShowSignedNum(3,1,Adata.AY,5);
    OLED_ShowSignedNum(4,1,Adata.AZ,5);
    
    OLED_ShowSignedNum(2,9,Gdata.GX,5);
    OLED_ShowSignedNum(3,9,Gdata.GY,5);
    OLED_ShowSignedNum(4,9,Gdata.GZ,5);
    Delay_ms(100); //延时刷新
  }
}

四、效果演示

159a74ec-5cf7-11ee-939d-92fbcf53809c.png
平放
15b7e338-5cf7-11ee-939d-92fbcf53809c.png
向下倾斜
15d53d7a-5cf7-11ee-939d-92fbcf53809c.png
左倾斜向
15f0bd70-5cf7-11ee-939d-92fbcf53809c.png
直立

读到的原始数据还不能直接使用,要转化成四元数,欧拉角后,获得器件的姿态角才有用,而 MPU6050 自带了数字运动处理器,即 DMP,并且,InvenSense 提供了一个 MPU6050 的嵌入式运动驱动库,结合 MPU6050 的 DMP,可以将我们的原始数据,直接转换成四元数输出,而得到四元数之后,就可以很方便的计算出欧拉角,从而得到yaw、roll和pitch。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 传感器
    +关注

    关注

    2550

    文章

    51035

    浏览量

    753078
  • mcu
    mcu
    +关注

    关注

    146

    文章

    17123

    浏览量

    350992
  • OLED
    +关注

    关注

    119

    文章

    6198

    浏览量

    224102
  • 寄存器
    +关注

    关注

    31

    文章

    5336

    浏览量

    120230
  • CW32
    +关注

    关注

    1

    文章

    203

    浏览量

    628

原文标题:【CW32】基于CW32的MPU6050姿态传感器的应用

文章出处:【微信号:武汉芯源半导体,微信公众号:武汉芯源半导体】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    MPU6050可以测线加速度吗?----基于Mems传感器的运动目标姿态识别系统(硬件部分)

    大家好,我最近在做毕业设计,题目叫做《基于Mems传感器的运动目标姿态识别系统(硬件部分)》,任务书要求求出姿态角,转矩,还有位移,然后我就用的是MPU6050来测角加速度,然后就是
    发表于 04-25 21:10

    请问谁有mpu6050姿态传感器的底层驱动程序?

    想要一个stm32f103c8t6控制mpu6050姿态传感器的底层驱动程序
    发表于 08-05 04:35

    MPU6050姿态解算的原理是什么

    MPU6050姿态解算的原理是什么?MPU6050姿态解算的程序该如何去是实现呢?
    发表于 12-17 07:14

    MPU6050六轴传感器的相关资料推荐

    一、MPU6050简介MPU6050是InvenSense公司推出的全球首款整合性6轴运动处理组件,内带3轴陀螺仪和3轴加速度传感器,并且含有一个第二IIC接口,可用于连接外部磁力传感器
    发表于 02-10 06:15

    MPU6050的使用步骤

    ,还有内置的温度传感器,在姿态解析方面应用非常广泛。某宝上的卖的也非常多。二、使用步骤1.引入库代码如下(示例):import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seab
    发表于 02-10 07:22

    shineblink MPU6050六轴传感器测量物体姿态角的相关资料分享

    MPU6050六轴传感器测量物体姿态角一、姿态角(欧拉角)基本概念二、代码实现功能描述三、接线图五、完整代码六、代码运行结果七、需要注意的地方一、姿
    发表于 02-10 07:42

    MPU6050的四元数解算姿态方法

    最近在研究小四轴的飞行,姿态检测主要用到的传感器MPU6050。从MPU6050读出来的加速度和角速度数据最后要转成姿态,可以转换成欧拉角
    发表于 11-07 10:39 2.1w次阅读
    <b class='flag-5'>MPU6050</b>的四元数解算<b class='flag-5'>姿态</b>方法

    mpu6050姿态融合原理及程序代码

    介绍了mpu6050姿态融合原理及程序代码分析,MPU6050是一款姿态传感器。主要介绍三种姿态
    发表于 12-11 13:31 7.3w次阅读
    <b class='flag-5'>mpu6050</b><b class='flag-5'>姿态</b>融合原理及程序代码

    mpu6050六轴传感器模块驱动程序源代码分享

    本文为大家分享了mpu6050六轴传感器模块驱动程序源代码,STM32F1读取MPU6050的加速度和角度传感器数据的初始化步骤,以及MPU6050
    发表于 12-11 14:26 3.7w次阅读
    <b class='flag-5'>mpu6050</b>六轴<b class='flag-5'>传感器</b>模块驱动程序源代码分享

    mpu6050姿态解算原理_mpu6050姿态解算程序

    mpu6050常用作提供飞控运行时的姿态测量和计算。本文首先介绍了MPU6050姿态解算的原理,其次详细的介绍了mpu6050
    的头像 发表于 03-09 09:15 4.4w次阅读

    MPU6050传感器的电路原理图

    本文档的主要内容详细介绍的是MPU6050传感器的电路原理图免费下载。
    发表于 05-29 08:00 39次下载
    <b class='flag-5'>MPU6050</b><b class='flag-5'>传感器</b>的电路原理图

    MPU6050简介

    MPU6050简介什么是MPU6050MPU6050的特点MPU6050框图MPU6050初始化MPU6050—DMP使用介绍
    发表于 12-06 11:51 76次下载
    <b class='flag-5'>MPU6050</b>简介

    MPU6050姿态融合解算(DMP)

    MPU6050姿态融合解算(DMP)
    发表于 12-06 13:21 39次下载
    <b class='flag-5'>MPU6050</b><b class='flag-5'>姿态</b>融合解算(DMP)

    基于CW32MPU6050姿态传感器的应用

    一、简介 1.MPU6050是一种常用的六轴姿态传感器模块,结合了三轴陀螺仪和三轴加速度计,以及一个可扩展的数字运动处理DMP(Digital Motion Processor),可
    的头像 发表于 10-10 16:42 2074次阅读
    基于<b class='flag-5'>CW32</b>的<b class='flag-5'>MPU6050</b><b class='flag-5'>姿态</b><b class='flag-5'>传感器</b>的应用

    什么是姿态传感器MPU6050

     MPU6050是6轴运动处理传感器,它集成了3轴MEMS陀螺仪,3轴MEMS加速度计,以及一个可扩展的数字运动处理DMP。使用它就是为了得到待测物体(如四轴飞行、平衡小车)x、y
    发表于 02-15 10:53 3457次阅读
    什么是<b class='flag-5'>姿态</b><b class='flag-5'>传感器</b><b class='flag-5'>MPU6050</b>