陀螺仪加速度计MPU6050程序与校准方法

2023-05-16

文章目录

  • 前言
  • 一、陀螺仪与加速度计简介
  • 二、程序使用
    • 1.初始化
    • 2.读取数据
  • 三、误差校准
    • 1.陀螺仪校准
    • 2.加速度计校准
    • 3.校准后的输出
  • 四、源码获取


前言

本文将介绍陀螺仪和加速度计的使用程序和校准方法,STM32的程序代码可从文章末尾获得。


一、陀螺仪与加速度计简介

陀螺仪的理解可以从单位入手,测量值的单位是°/s。意思是某时刻的旋转角度的变化速度是每秒多少度。加速度计则容易理解很多,单位为g,这里就不多阐述。下面是MPU6050三轴的方向图。
在这里插入图片描述

二、程序使用

文章末尾可获取STM32F103C8T6的程序,可稍微更改一下就能移植到别的平台。硬件连线如下:

  • PB5 --> INT
  • PB6 --> SCL
  • PB7 --> SDA
  • PA9,PA10–>串口

1.初始化

MPU6050的初始化函数如下。这里提供了一般的初始化设置,也可自行根据寄存器手册进行修改。

/************************************
*	函数功能:传感器初始化
*	参数:无
*	返回值: 0 初始化成功
*           1 初始化失败
*************************************/
uint8_t mpu6050_init(void)
{
    uint8_t temp;
    uint8_t param[] = {0,0x03,0x18,0x10,0x10,0x01};
    mpu6050_i2c_readMem(MPU6050_WHO_AM_I,&temp,1);
    if(temp != 0x68)
    {
       // printf("不能读取寄存器,初始化失败");
        return 1;
    }

    temp = 0x80;
    mpu6050_i2c_writeMem(MPU6050_PWR_MGMT_1,&temp);          //重启设备
    delay_ms(100);
    temp = 0;
    mpu6050_i2c_writeMem(MPU6050_PWR_MGMT_1,&temp);          //退出休眠模式

    mpu6050_i2c_writeMem(MPU6050_SMPLRT_DIV,&param[0]);      //Sample Rate = Gyroscope Output Rate / (1 + SMPLRT_DIV) = 1kHz
    mpu6050_i2c_readMem(MPU6050_SMPLRT_DIV,&temp,1);           //其中Gyroscope Output Rate=1kHz 或 8kHz 取决于是否开启数字低通滤波器
    if(temp != param[0])
        return 1;

    mpu6050_i2c_writeMem(MPU6050_CONFIG,&param[1]);          //失能低通滤波器,带宽: 加速度 44Hz; 陀螺仪 42Hz
    mpu6050_i2c_readMem(MPU6050_CONFIG,&temp,1);
    if(temp != param[1])
        return 1;

    mpu6050_i2c_writeMem(MPU6050_GYRO_CONFIG,&param[2]);     //陀螺仪量程:± 2000 °/s
    mpu6050_i2c_readMem(MPU6050_GYRO_CONFIG,&temp,1);
    if(temp != param[2])
        return 1;
		
		mpu6050_i2c_writeMem(MPU6050_ACCEL_CONFIG,&param[3]);     //加速度量程:± 8g
    mpu6050_i2c_readMem(MPU6050_ACCEL_CONFIG,&temp,1);
    if(temp != param[3])
        return 1;
		
				mpu6050_i2c_writeMem(MPU6050_INT_PIN_CFG,&param[4]);     //中断引脚设置
    mpu6050_i2c_readMem(MPU6050_INT_PIN_CFG,&temp,1);
    if(temp != param[4])
        return 1;
		
		mpu6050_i2c_writeMem(MPU6050_INT_ENABLE,&param[5]);     //中断引脚使能
    mpu6050_i2c_readMem(MPU6050_INT_ENABLE,&temp,1);
    if(temp != param[5])
        return 1;
		
		//printf("初始化成功");
		return 0;
}

2.读取数据

以下为读取陀螺仪数据的函数,读取到的数据为ADC的原始数据,需要根据ADC的分辨率将单位转换为°/s。加速度计的数据读取也类似,不再赘述。

/************************************
*	函数功能:获得陀螺仪原始数据
*	参数: *GYRO	接收数据的指针
*	返回值: 无
*************************************/
void mpu6050_getRawGyro(mpu6050_data *pGyro)
{
	uint8_t rawData[6];
	int16_t rawGyroData[3];
	mpu6050_i2c_readMem(MPU6050_GYRO_XOUT_H,rawData,6);

	rawGyroData[0] = (int16_t)((uint16_t)rawData[0]<<8)|((uint16_t)rawData[1]);
	rawGyroData[1] = (int16_t)((uint16_t)rawData[2]<<8)|((uint16_t)rawData[3]);
	rawGyroData[2] = (int16_t)((uint16_t)rawData[4]<<8)|((uint16_t)rawData[5]);
	
	pGyro->x = ((float)rawGyroData[0]) * gyro_raw_to_deg_s;
	pGyro->y = ((float)rawGyroData[1]) * gyro_raw_to_deg_s;
	pGyro->z = ((float)rawGyroData[2]) * gyro_raw_to_deg_s;
	
	pGyro->x -= gyro_offest[0];
	pGyro->y -= gyro_offest[1];
	pGyro->z -= gyro_offest[2];
}

三、误差校准

一般来说,MEMS(微机电系统)器件由于制造工艺精度问题,都会存在一定的误差。下图是静止在水平面的条件下测试得到的数值。可见,水平静止的情况下,陀螺仪输出应该为0,加速度计Z轴输出应为1g。所以出现了较大误差。
在这里插入图片描述

1.陀螺仪校准

陀螺仪的校准相对简单。在静止的情况下,将多个采样的平均值作为偏置值。测量后减去这个零偏即为真实值。若存在零偏,即使在静止的情况下,得出的数据会认为正在旋转,随着时间累积会出现较大误差。

const float gyro_offest[3] = {-0.96,0.902,-1.05};

	pRogy->x -= gyro_offest[0];
	pRogy->y -= gyro_offest[1];
	pRogy->z -= gyro_offest[2];                          //校准

2.加速度计校准

加速度计校准可建立以下数学模型。
在这里插入图片描述
使用matlab的lsqcurvefit函数进行拟合,解出6个参数。具体matlab代码示例如下:

clear;clc;
axm=[0.007813   0.100098   0.066162   0.031982   1.070068    -0.939697];
aym=[-0.061279  -0.019043  -1.013916  0.979248   -0.018555   -0.023438];
azm=[0.929688   -1.088379  -0.096191  -0.079346  -0.172607   -0.054932];
am=[axm',aym',azm']; %axm, aym, azm分别是采集的三轴加速度计数据,最好是6个面进行采集
G=[1 1 1 1 1 1]';
f=@(a,am)(a(1)*am(:,1)+a(2)).^2+(a(3)*am(:,2)+a(4)).^2+(a(5)*am(:,3)+a(6)).^2;
a0=[1 0 1 0 1 0];
a=lsqcurvefit(f,a0,am,G)

以下是解出的参数和校准代码。

const float acc_param_k[3] = {0.9928,1.0030,0.9894};
const float acc_param_a[3] = {-0.0668,0.0172,0.0774};

	pAcc->x = acc_param_k[0] * pAcc->x + acc_param_a[0];
	pAcc->y = acc_param_k[1] * pAcc->y + acc_param_a[1];
	pAcc->z = acc_param_k[2] * pAcc->z + acc_param_a[2];

3.校准后的输出

可见,校准后的输出误差明显减少。
在这里插入图片描述

四、源码获取

关注下方公众号,回复 “MPU6050” 获取源码;若有疑问,请在公众号回复“交流群”,进群一起讨论分享!
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

陀螺仪加速度计MPU6050程序与校准方法 的相关文章

  • linux系统实现tcp协议通讯

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 一 tcp通讯的链接二 使用步骤1 引入库2 读入数据 注意 提示 xff1a 以下是本篇文章正文内容 xff0c 下面案例可供
  • 无人机拉力测试台-无人机拉力、扭矩、转速测试教学

    无人机动力系统 测试实验实训教学课程 amp nbsp 实验课程3 xff1a 动力系统基础测试参数测试实验 课程内容 xff1a 1 amp nbsp 无人机动力系统基础测试参数解读 2 amp nbsp 无人机动力系统基础参数测试实验
  • 无人机拉力测试台-无人机动力系统匹配试验

    无人机动力系统 测试实验实训教学课程 amp nbsp 实验指引 一 实验开设背景 人社部2020年8月27号在 新职业 无人机装调检修工就业景气现状分析报告 中说明 xff0c 预计未来五年无人机装调检修工需求量约350万人 无人机装调检
  • 无人机动力测试-无人机电机、螺旋桨、电调测试

    无人机动力系统 测试实验实训教学课程 实验课程4 xff1a 动力系统基本参数测量与验证 课程内容 xff1a 1 amp nbsp 动力系统性能参数及性能特性曲线 2 amp nbsp 动力系统性能参数及性能特性曲线测试实验 实验器材 x
  • ubuntu18.04环境搭建

    1 ubuntu安装make xff1a sudo apt install make sudo apt install make guile 2 ubuntu上安装git xff1a 运行Ubuntu的主机 打开终端 xff0c 输入 su
  • 从0到1!Ubuntu上搭建Kubernetes Cluster

    目录 一 环境准备 二 初始化工作 1 设置root用户密码 2 使用xshell连接三台主机 3 设置主机名和修改hosts文件 4 安装依赖软件以及关闭停用不需要使用的软件 5 时间的同步与时区设置 6 关闭swap分区 7 在 kub
  • 傅立叶变换和拉普拉斯变换的区别

    傅立叶变换可以看做拉普拉斯变换的特殊形式 拉氏变换就是将原时域函数乘上一个与o相关的衰减 子 因为傅氏变换要求绝对可积 xff0c 但实际上很多函数不满足 xff0c 乘上衰减因子之后就基本都可以 了 之后做傅氏变换得来 假如这个为0就还是
  • 一篇让你完全弄懂GPIO的8种配置模式

    前言 配置GPIO口是我们软件开发中必须要掌握的 xff0c 每个模式的作用效果也是需要清楚的 如果连gpio应该配置成什么模式都不懂 xff0c 是无法进行后面的开发的 1 输入模式 1 1 浮空输入模式 I O端口的电平信号进入输入数据
  • 上位机与下位机的通讯

    一 概念 上位机 xff1a 是指人可以直接发出操作命令的计算机 xff0c 一般指PC 人机界面等 发出的命令首先给下位机 xff0c 下位机再根据命令解释成相应的时序信号 xff0c 直接控制相应设备 下位机 xff1a 直接控制设备获
  • OptiTrack Motive 使用教程

    相机标定 最近在使用Quanser的地面车做实验 xff0c 需要用到OptiTrack系统进行定位 xff0c 记录一下使用过程 xff0c 供需要的人参考 本文参考了以下博客 xff1a https blog csdn net banz
  • 一种int型、float型转char型以及回转方法

    摘要 xff1a 本文讲述一种可以在STM32F103C8T6上面运行的一种int型 float型转char型以及回转方法 xff0c 一般用于计算好的数据输入到传感器中或物联网器件中 xff1b 把传感器中的数据提取出来计算等等 实验时间
  • Ubuntu18 python多版本管理切换

    一 背景 Ubuntu18 04电脑 xff0c 安装有python2 7和python3 6 9两个python版本 xff0c 目前像安装另一款软件 xff0c 依赖要求是python gt 61 3 7 xff0c 但又不想删除pyt
  • 解决“E: Package ‘libqtgui4‘ has no installation candidate”无法安装qt4

    使用场景 xff1a Ubuntu20 4 xff0c VMware16pro 笔者在安装Ubuntu下的网络调试助手NetAssist xff0c 遇到了 E Package libqtgui4 has no installation c
  • 时序数据插值,对GPS采样数据进行线性插值

    此篇为上一篇的接续 xff0c 对时序数据进行插值 上篇文章 解析kml文件 xff0c 提取经纬度信息存入csv 将kml里面的信息提取了出来 xff0c 但是有些数据间隔太大 xff0c 甚至几十秒才一个采样点 xff0c 需求对这样的
  • Jetson nano/NX安装Opencv Cuda版

    一 卸载系统自带的opencv sudo apt span class token operator span get purge libopencv span class token operator span python span c
  • Jetson Xavier NX-EMMC重装系统

    Jetson xavier NX EMMC版本重装系统相对比较麻烦 xff0c 以下方法本人已经试过多次 xff0c 基本没有出现什么问题 一 安装虚拟机 安装虚拟机的步骤我们不多过述 xff0c 网上有许多博客讲述虚拟机安装 我们这里主要
  • JTAG、JLINK、ULINK、ST-LINK

    一 JTAG JTAG用的计算机的并口 xff0c JTAG也是一种国际标准测试协议 xff08 IEEE 1149 1兼容 xff09 xff0c 主要用于芯片内部测试 现在多数的高级器件都支持JTAG协议 如DSP FPGA器件等 标准
  • ubuntu18.04安装Ros(详细)

    Ubuntu18 04安装Ros本人已试过多次 xff0c 安装过程基本没出现问题 xff0c 而且该方法也可用在Jetson nano NX 上 一 设置软件源 xff1a 清华源 xff1a sudo sh c 39 etc lsb r
  • Jetson Xavier NX安装Mavros

    Px4飞控通过USB线连接Jetson Xavier NX xff0c 如果需要进行软连接 xff0c 即通讯 xff0c 需要下载Mavros功能包 xff0c 并通过启动命令进行连接 安装Mavros sudo apt install
  • Jetson Xavier NX 部署Yolov5

    大部分过程非原创 xff0c 写这篇文章主要是因为设备不同出的问题也各不相同 xff0c 需要到处去找解决方法 xff0c 因此我把配置过程中遇到的全部问题以及解决方法记录在此 注 xff1a 该博客原文来自Jetson nano NX 部

随机推荐

  • Yolov5 更改识别窗口大小

    启动yolov5时 xff0c 会因为像素太大导致占据整个桌面 xff0c 这样非常影响使用和操作 xff0c 我们可以通过opencv中的resize函数来修改识别窗口的像素大小 xff0c 这样操作就方便多了 原代码中 通过修改cv2
  • MCS-51系列单片机指令系统分类

    51系列单片机共有111条指令 xff0c 这些指令的集合称为指令系统 常用的分类为以下几种 xff1a 按位寻址方式 xff1a 1 寄存器寻址 2 直接寻址 3 寄存器间接寻址 4 立即寻址 5 变址寻址 6 相对寻址 7 位寻址 按功
  • ubuntu20.04安装ROS【详细】

    Ubuntu20 04安装ROS与Ubuntu18 04大差不差 xff0c 安装过程基本没出现问题 按以下教程操作即可 一 更换源 xff1a 1 备份源文件 sudo cp etc apt sources list etc apt so
  • Ubuntu 16.04设置开机自启动脚本

    1 创建脚本 sh文件 可以在 home user Documents scripts路径下建立名为auto run test sh的文件 xff1b auto run test sh里面写上具体要做的事 xff0c 例如我这里 xff1a
  • ubuntu 修改默认python版本

    1 查看当前默认版本和存放位置 2 安装python3 8 2 删除原软连接 xff0c 生成新版本软连接 python V 输出 xff1a Python 2 7 17 whereis python or which python 输入
  • C语言 strcat方法的使用方式

    strcat char str1 char str2 将字符串str2拼接到str1的尾部 对于新手来说 xff0c 使用这个方法只要将str1的内存大小给够了 xff0c 这个方法就没有问题 xff0c 当然这个方法在C程序看来是不安全的
  • STM32_串口中断接收数据_空闲中断

    STM32 串口中断接收数据 空闲中断 引言 xff1a 1 串口中断接收数据首先要保证完整性 xff08 设置串口中断优先级 xff09 2 串口中断接收数据要保证实时性 xff08 打开串口空闲中断 空闲时间是2个字节的时间 xff09
  • STM32调试方式JTAG&SWD的区别

    在学习STM32时 xff0c 我们经常会遇到JTAG和SWD的调试方法 xff0c 还涉及到Jlink Ulink Stlink等 xff0c JTAG和SWD是ARM板一种调试模式 后面三种都是实现这种模式的一种工具 xff0c 他们之
  • 大端序、小端序和MSB、LSB的区别和举例

    大端序 小端序和MSB LSB的区别和举例 1 字节序序 不同平台上数据存储方式 xff1a 大端字节序 小端字节序 字节序就是一个多字节数据的低位置 一般是低8位 放置在存储单元的高有效位 高地址 还是 低有效位 低地址 的概念 xff1
  • 将word文件中的文本转成字符串

    将word文件中的文本转成字符串 需要用到apache poi 下面的一些jar包 下面是pom文件 xff0c 因为我也是在网上找的 xff0c 所以可能有多余的jar包 xff1a lt dependency gt lt groupId
  • spring boot线程里bean注入失败

    在多线程处理问题时 xff0c 无法通过 64 Autowired注入bean xff0c 报空指针异常 xff0c 在线程中为了线程安全 xff0c 是防注入的 xff0c 如果要用到这个类 xff0c 只能从bean工厂里拿个实例 sp
  • python生成Excel

    import xlwt import random lonlat 61 wb 61 xlwt Workbook ws 61 wb add sheet point for i in range 1000 lon 61 random unifo
  • python爬虫商品信息,并生成Excel

    刚开始学习爬虫 xff0c 记录一下 我爬了一页的数据 xff0c 想要爬取多页的 xff0c 只需要遍历 xff0c 改变url中最后的数字 xff0c 44是一页显示的条数 xff0c 第二页就是2 44 xff0c 以此类推 url中
  • Qt中的类

    一 xff0e 信号与槽 1 QT元对象系统 QT元对象系统提供三件事情 xff1a 1 QObject类 2 Q OBJECT 宏 xff0c 声明在类私有段中 3 moc编译器 xff1a 为每个Qobject子类对象生成实现元对象特性
  • 解析HTTP请求报文(GET、POST)

    目的 xff1a 一个WEB服务器需要解析客户端 xff08 浏览器 xff09 发来的请求 xff0c 两种常见的请求方式是GET和POST GET的请求格式 xff1a GET请求没有请求体只有请求头GET请求的请求参数放在URL后加上
  • 数字电视的格式(BT.601 BT.709 BT.2020)和接口(BT.656 BT.1120 BT.2077)

    规格和格式接口特性 标清数字电视 xff08 SDTV xff09 BT 601BT 656 高清数字电视 xff08 HDTV xff09 BT 709BT 1120 超高清数字电视 xff08 UHDTV xff09 BT 2020BT
  • Linux下TCP协议客户端和服务器之间的通信

    tcp 传输控制协议 1 TCP 是 种可靠的传输服务 xff08 不会出现传输差错 丢失 重复等各种现象 xff09 2 是 向连接的服务 3 个 tcp 连接只有两个端点 xff0c 是 对 通信 4 是可靠传输 拥塞控制 流量控制 超
  • DSO/LDSO 等直接法相关资料整理

    直接法视觉里程计 SLAM的学习门槛较特征法高 xff0c 我将DSO LDSO 等直接法相关资料尽量按作者分类整理如下 xff0c 毕竟沿着一个人的思路学习跨度不会太大 xff1b 此外 xff0c 将一些涉及的其他知识也一并整理 xff
  • SLAM和里程计评估工具——evo使用方法全解

    前言 本帖的主要内容是整理evo的使用方法及各种命令 xff0c 不含安装步骤及过程 xff0c 还未安装的请移步其他博主 evo目前支持的公开数据集格式有 xff1a TUM KITTI EuRoC以及ROS bagfile 如果使用的数
  • 陀螺仪加速度计MPU6050程序与校准方法

    文章目录 前言一 陀螺仪与加速度计简介二 程序使用1 初始化2 读取数据 三 误差校准1 陀螺仪校准2 加速度计校准3 校准后的输出 四 源码获取 前言 本文将介绍陀螺仪和加速度计的使用程序和校准方法 xff0c STM32的程序代码可从文