【E1763】MPU6050陀螺仪的51+32+arduino驱动 指令校准+上位机+APP+PCB库

2021-10-26 08:36:15      索炜达电子      847     

项目编号:E1763

文件大小:18M

源码说明:带中文注释

开发环境:C编译器

简要概述:

arduino驱动MPU6050陀螺仪,含源码和上位机测试程序

各嵌入式平台的源码都有:

指令校准法

磁场校准方法:

1、将模块安装到设备中固定,并放置水平

2、分别将三轴磁场偏移值设置为0.发送指令如下:

a)    0xff 0xaa 0x0b 0x00 0x00

b)    0xff 0xaa 0x0c 0x00 0x00

c)    0xff 0xaa 0x0d 0x00 0x00

注意每条指令需间隔100ms

3、    开始统计三轴磁场强度的最大值和最小值,分别计为

HxMax,HxMin,HyMax,HyMin,HzMax,Hzmin。

校准的方式有两种,一种是平面校准,一种是三维校准。平面校准适用于模块在平面内工作,俯仰和滚转为小角度变化的情况,这种可以用平面校准法。如果俯仰角和滚转角变化较大,则需要用三维校准法。

平面校准法:

将模块放平,绕Z轴缓慢旋转360°,同时统计三轴磁场的最大值与最小值,直至最大值与最小值不在发生变化。

三维校准法:

先绕X缓慢旋转360°,再绕Y轴缓慢旋转360°,再绕Z轴缓慢旋转360°,最后再随意旋转几圈,同时统计三轴磁场的最大值与最小值,直至最大值与最小值不在发生变化。

4、    计算磁场偏移值,偏移值为最大值与最小值相加的一半。

HxOffset = (HxMax+HxMin)/2;

HyOffset = (HyMax+HyMin)/2;

HzOffset = (HzMax+HzMin)/2;

5、    将偏移值写入模块的寄存器,分别发送指令如下:

a)    0xff 0xaa 0x0b HxOffsetL HxOffsetH

b)    0xff 0xaa 0x0c HyOffsetL HyOffsetH

c)    0xff 0xaa 0x0d HzOffsetL HzOffsetH

注意每条指令需间隔100ms。其中HxOffsetL为第4步中算出的x轴误差的低字节,HxOffsetH为第4步中算出的x轴误差的高字节,HyOffsetL, HyOffsetH, HzOffsetL, HzOffsetH同理。

6、    保存当前配置。发送指令0xff 0xaa 0x00 0x00 0x00;

加速度校准方法:

2、    分别将加速度三轴的偏移值设置为0。发送指令如下:

a)    0xff 0xaa 0x05 0x00 0x00

b)    0xff 0xaa 0x06 0x00 0x00

c)    0xff 0xaa 0x07 0x00 0x00

注意每条指令需间隔100ms

3、    将模块放置水平。

4、    读取当前加速度的数值,为了计算准确,可多次读取后取平均。记下当前的三轴加速度值,分别为ax0,ay0,az0.

5、    计算加速度的常值偏差。模块水平放置的时候,模块的三轴加速度输出应该为【0g,0g,1g】,转换为传感器的输出值就是【0,0,2048】。那么三轴加速度的误差值为:e =【ax0,ay0,az0-2048】。

6、    将三轴的加速度偏移值写入寄存器,分别发送指令如下:

a)    0xff 0xaa 0x05 exL exH

b)    0xff 0xaa 0x06 eyL eyH

c)    0xff 0xaa 0x07 ezL ezH

注意每条指令需间隔100ms。其中exL为第4步中算出的x轴误差的低字节,exH为第4步中算出的x轴误差的高字节,eyL,eyH,ezL,ezH同理。

7、    保存当前配置。发送指令0xff 0xaa 0x00 0x00 0x00;


读取寄存器方法:

1.    往READADDR(0x27)寄存器里写入需要读取的地址,比如要读取0x05寄存器,那么给模块发送指令:0xff 0xaa 0x27 0x05 0x00

2.    模块收到指令以后,将返回数据包0x55 0x5f D1L D1H D2L D2H D3L D3H D4L D4H SUM

其中D1是刚才写入的寄存器的内容,D2、D3、D4分别是D1后面的寄存器的内容。比如刚才写入READADDR的内容是0x05,那么D1就是AXOFFSET(0x05),D2就是AYOFFSET(0x06),D3就是AZOFFSET(0x07),D4就是GXOFFSET(0x08)。

附表:

寄存器序号:

#define SAVE             0x00

#define CALSW         0x01

#define RSW             0x02

#define RRATE            0x03

#define BAUD         0x04

#define AXOFFSET    0x05

#define AYOFFSET    0x06

#define AZOFFSET    0x07

#define GXOFFSET    0x08

#define GYOFFSET    0x09

#define GZOFFSET    0x0a

#define HXOFFSET    0x0b

#define HYOFFSET    0x0c

#define HZOFFSET    0x0d

#define D0MODE        0x0e

#define D1MODE        0x0f

#define D2MODE        0x10

#define D3MODE        0x11

#define D0PWMH        0x12

#define D1PWMH        0x13

#define D2PWMH        0x14

#define D3PWMH        0x15

#define D0PWMT        0x16

#define D1PWMT        0x17

#define D2PWMT        0x18

#define D3PWMT        0x19

#define IICADDR        0x1a

#define LEDOFF         0x1b

#define MAGRANGX    0x1c

#define MAGRANGY    0x1d

#define MAGRANGZ    0x1e

#define BANDWIDTH    0x1f

#define GYRORANGE    0x20

#define ACCRANGE    0x21

#define SLEEP            0x22

#define ORIENT        0x23

#define AXIS6          0x24

#define FILTK            0x25

#define GPSBAUD        0x26

#define READADDR    0x27

#define MOVETHR        0x28

#define MOVESTA        0x29

#define ACCFILT        0x2A

#define GYROFILT    0x2b

#define MAGFILT        0x2c

#define RSV6            0x2d

#define RSV7            0x2e

#define RSV8            0x2f

#define YYMM                0x30

#define DDHH                0x31

#define MMSS                0x32

#define MS                0x33

#define AX                0x34

#define AY                0x35

#define AZ                0x36

#define GX                0x37

#define GY                0x38

#define GZ                0x39

#define HX                0x3a

#define HY                0x3b

#define HZ                0x3c            

#define Roll                0x3d

#define Pitch                0x3e

#define Yaw                0x3f

#define TEMP                0x40

#define D0Status            0x41

#define D1Status            0x42

#define D2Status            0x43

#define D3Status            0x44

#define PressureL            0x45

#define PressureH            0x46

#define HeightL            0x47

#define HeightH            0x48

#define LonL                0x49

#define LonH                0x4a

#define LatL                0x4b

#define LatH                0x4c

#define GPSHeight           0x4d

#define GPSYAW              0x4e

#define GPSVL                0x4f

#define GPSVH            0x50

#define q0                0x51

#define q1                0x52

#define q2                0x53

#define q3                0x54

#define SVNUM            0x55

#define PDOP                0x56

#define HDOP                0x57

#define VDOP                0x58

#define DELAYT            0x59

#define XMIN                0x5a

#define XMAX                0x5b

#define GXMIN            0x5c

#define GXMAX            0x5d

#define YMIN                0x5e

#define YMAX                0x5f

#define GYMIN            0x60

#define GYMAX            0x61

#define ALARMLEVEL        0x62

#define GYRONOCAL        0x63

目录│文件列表:

 └ 串口MPU6050卡尔曼滤波6轴9轴资料汇总

    │ miniIMU.apk

    │ PID资料.zip

    ├ MPU6050资料V5

    │  └ MPU6050资料V5

    │     │ MPU6050使用说明书V5.pdf

    │     ├ Datasheet

    │     │  │ MPU-6050寄存器映射.pdf

    │     │  └ MPU6050.PDF

    │     ├ PCB库

    │     │  │ 串口MPU6050原理库.lib

    │     │  └ 串口MPU6050封装库.lib

    │     ├ 上位机

    │     │  │ Config.ini

    │     │  │ Data.txt

    │     │  │ DataPlot.m

    │     │  │ MiniIMU.exe

    │     │  │ 使用说明.txt

    │     │  ├ en

    │     │  │  └ MiniIMU.resources.dll

    │     │  └ zh-CHS

    │     │     └ MiniIMU.resources.dll

    │     └ 示例程序

    │        │ 51例程.rar

    │        │ Arduino版.zip

    │        │ PC版(VS2010).zip

    │        │ STM32版.zip

    │        └ 核心代码

    │           │ main.c

    │           └ usart.c

    ├ 上位机

    │  └ 4.3.14.rar

    ├ 指令校准

    │  └ 指令校准法.docx

    └ 论坛资料

       └ JY61P、901说明书

          └ JY901使用说明书V4.0.pdf.baiduyun.downloading

TAGMPU6050
  • 2 次
  • 5 分