STM32F4_MPU6050六轴传感器详解

目录

前言

1. 姿态检测的基本概念

2. 传感器的基本概念

2.1 传感器原理

2.2 传感器参数

2.3 物理量的表示方法

3. MPU6050简介

4. 利用STM32F4读取MPU6050的姿态步骤

5. 硬件设计

6. 实验程序

6.1 ANO_Tech 匿名四轴上位机_V2.6.exe

6.2 main.c

6.3 MyMPU6050.c

6.4 MyMPU6050.h


前言

        MPU6050是当下最流行的一款六轴(三轴加速度+三轴角速度(陀螺仪))传感器。该传感器广泛的用于四轴、平衡车和空中鼠标等设计,具有非常广泛的应用范围。STM32F4板载了MPU6050传感器,本节我们将使用STM32F4来驱动MPU6050读取其最原始的数据,并且利用其自带的DMP实现姿态解算,结合匿名四轴上位机软件和LCD进行显示

1. 姿态检测的基本概念

        在飞行器中,飞行姿态是非常重要的参数,以飞机自身的中心建立坐标系,当飞机绕坐标轴旋转的时候,会分别影响到偏航角横滚角俯仰角

        假设我们知道飞机初始时是左上角的状态,只要想办法测量出基于原始状态的三个姿态角的变化量,再进行叠加,就可以获知它的实时姿态了。

坐标系:

        抽象的说,姿态载体坐标系地理坐标系之间的转换关系。

        地球坐标系:以地球球心为原点,Z轴沿地球自转轴方向,X、Y轴在赤道平面内的坐标系。

        地理坐标系:它的原点在地球表面,Z轴沿当地地理垂线的方向,也就是重力加速度的方向,XY轴沿当地经纬线的切线方向。跟我们说的东南西北是一样的。

        载体坐标系:载体坐标系以运载体的质心为原点,一般根据运载体自身结构方向构成坐标系,如Z轴上由原点指向载体顶部,Y轴指向载体头部,X轴沿载体两侧方向。

其中,北轴、天轴、东轴对应的是地理坐标系。

使用陀螺仪检测角度:

        陀螺仪是最直观的角度检测器,他可以检测物体绕坐标轴转动的角速度, 如同将速度对时间积分可以求出路程一样,将角速度对时间积分就可以计算出旋转的角度。

利用加速度计检测角度:

        由于直接用陀螺仪测量角度在长时间测量时会产生累积误差,因而我们又引入了检测倾角的传感器

         测量倾角最常见的例子是建筑中使用的水平仪,在重力的影响下,水平仪内的气泡能大致反映水柱所在直线与重力方向的夹角关系,利用T字型水平仪,可以检测横滚角与俯仰角,但是偏航角是无法以这样的方式检测的

        在电子设备中,一般使用加速度传感器来检测倾角,他通过检测器件在各个方向的形变情况而采样得到受力数据,根据F=ma转换,传感器直接输出加速度数据,因而被称为加速度传感器

        由于地球存在重力场,所以重力在任何时刻都会作用于传感器,当传感器静止的时候(实际上加速度为0),传感器会在该方向检测出加速度g,不能认为重力方向测出的加速度为g,就表示传感器在该方向作加速度为g的运动

磁场检测:

        为了弥补加速度传感器无法检测偏航角的问题,我们再引入磁场检测传感器,它可以检测出各个方向上的磁场大小,通过检测地球磁场,它可以实现指南针的功能,所以也称为电子罗盘。由于地磁场与地理坐标系的 “南北” 轴固联,利用磁场检测传感器的指南针功能,就可以测量出偏航角了。

磁场检测器的缺陷:

        与指南针的缺陷一样,使用磁场传感器会受到外部磁场干扰,如载体本身的电磁场干扰,不同地理环境的磁铁矿干扰等等。

GPS检测:

        使用GPS可以直接检测出载体在地球上的坐标,假如载体在某时刻测得坐标在A,另一时刻测得坐标为B,利用两个坐标即可求出它的航向,即可以确定偏航角,且不受磁场的影响,但这种检测方式只有当载体产生大范围位移的时候才有效(GPS民用精度大概为10米级)

姿态融合:

        可以发现,使用陀螺仪检测角度时,在静止状态下存在缺陷,且受时间影响,而加速度传感器检测角度时,在运动状态下存在缺陷,且不受时间影响,刚好互补。假如我们同时使用这两种传感器,并设计一个滤波算法,当物体处于静止状态时,增大加速度数据的权重,当物体处于运动状态时,增大陀螺仪数据的权重,从而获得更准确的姿态数据。

        同理,检测偏航角,当载体在静止状态时,可增大磁场检测器数据的权重,当载体在运动状态时,增大陀螺仪和GPS检测数据的权重。这些采用多种传感器数据来检测姿态的处理算法被称为姿态融合

四元数:

        在姿态融合解算的时候常常使用 “四元数” 来表示姿态,它由三个实数及一个虚数组成,因而被称之为四元数。使用四元数表示姿态并不直观,但因为使用欧拉角(也就是前面说的偏航角、横滚角及俯仰角)表示姿态的时候会有 “万向节死锁” 问题,且运算比较复杂,所以一般在处理数据的时候会使用四元数,处理完毕后再把四元数转换成欧拉角。

        也就是说,四元数是姿态角的另一种表达方式

2. 传感器的基本概念

        之前,我们学到的DS18B20温度传感器、DHT11温湿度传感器,以及我们本节学习的 MPU6050 六轴传感器都属于传感器中的一种。这一部分我们来总结何为传感器?

2.1 传感器原理

        在电子技术中,传感器一般是指把物理量转化成电信号量的装置

        敏感元件直接感受被测物理量,并输出与该物理量有确定关系的信号,经过转换元件将该物理量信号转换为电信号,变换电路对转换元件输出的电信号进行放大调制,最后输出容易检测的电信号量。

        例如:温度传感器可以把温度量转换成电压信号量输出且温度值与电压值成比例关系(这也就是敏感元件的作用:输出与该物理量有确定关系的信号),我们只要使用ADC测量出电压值,并根据转换关系即可求得实际温度值。 

        陀螺仪、加速度及磁场传感器也是类似的,它们检测的角速度、加速度及磁场强度与电压值有确定的转换关系。

2.2 传感器参数

传感器一般使用精度、分辨率采样频率这些参数来进行比较,衡量它的性能:

  •         精度:指传感器测量值与真实物理量值之间的拟合度误差。
  •         分辨率:指传感器可检测到的最小物理量的单位。
  •         采样频率:指在单位时间内的采样次数。

2.3 物理量的表示方法

        大部分传感器的输出都是与电压成比例关系的,电压值一般采用ADC来测量,而ADC一般有固定位数,如8位ADC、12位ADC等,ADC的位数会影响测量的分辨率及量程。

        假设使用一个2位的ADC来测量长度,那么2位ADC可以测量的值就只能是00 01 10 11,也就是0 1 2 3。假设它的分辨率(传感器可以检测到的最小物理量的单位)为20厘米,那么它最大的测量长度为60厘米。假如它的分辨率为10厘米,那么它的最大测量长度为30厘米,由此可知,对于特定位数的ADC,量程和分辨率不可兼得

        在实际应用中,常常直接用ADC每位表征的物理量值来表示分辨率,如每位代表20厘米,我们称它的分辨率为1LSB/20cm它等效于5位表示1米:5LSB/m。其中的LSB(Least Significant Bit),意为ADC的低有效位。

        使用采样得到的ADC数值,除以分辨率,即可求取得到物理量。例如使用分辨率为5LSB/m、线性误差为0.1m的传感器进行长度测量,其ADC采样得到数据值为 “20” ,可计算知道该传感器的测量值为4米,而该长度的真实值介于3.9-4.1米之间。

3. MPU6050简介

        MPU6050模块是一个六轴传感器模块,采用InvenSense公司的MPU6050作为主芯片,能同时检测三轴加速度、三轴陀螺仪(三轴角速度)的运动数据以及温度数据

        利用MPU6050芯片内部的DMP模块(Digital Motion Processor数字运动处理器),可传感器数据进行滤波、融合处理,他直接通过IIC接口向主控器输出姿态解算后的姿态数据降低主控器的运算量。其姿态解算频率最高可达200Hz,非常适合用于对姿态控制实时要求较高的领域。常见应用于手机、智能手环、四轴飞行器及计步器等的姿态检测。

基本参数:

  •         供电:3.3V~5V
  •         通讯接口:IIC协议,支持IIC时钟最高频率为400KHz
  •         测量维度:加速度3维,陀螺仪3维
  •         ADC分辨率:加速度16位,陀螺仪16位
  •         
  •         加速度测量范围\pm 2g、\pm4g、\pm 8g、\pm 16g  其中g为重力加速度常数,g=9.8m/s^{2}
  •         加速度最高分辨率:16384 LSB/g
  •         加速度线性误差:0.1g
  •         加速度输出频率:最高1000Hz
  •         
  •         陀螺仪测量范围\pm250○/s、\pm500○/s、\pm1000○/s、\pm2000○/s  其中g为重力加速度常数,g=9.8m/s^{2}
  •         陀螺仪最高分辨率:131 LSB/(○/s)
  •         陀螺仪线性误差:0.1○/s
  •         陀螺仪输出频率:最高8000Hz
  •         DMP姿态解算频率:最高200Hz
  •         
  •         温度传感器测量范围:-40~+85℃
  •         温度传感器分辨率:340 LSB/℃
  •         温度传感器线性误差\pm1℃

DMP模块(Digital Motion Processor数字运动处理器):

        从MPU6050的参数中可以得到,加速度计和陀螺仪的采样频率分别是1000Hz和8000Hz,它们是指加速度及角速度数据的采样频率,我们可以使用STM32控制器把这些数据读取出来然后进行姿态融合解算,以求出传感器当前的姿态(包括偏航角、横滚角、俯仰角)

        而如果我们使用传感器内部的DMP数字运动处理器单元进行解算,他可以直接对采样得到的加速度及角速度进行姿态解算,解算得到的结果再输出给STM32控制器,即STM32无需自己计算,可直接获取偏航角、横滚角及俯仰角,该DMP每秒可输出200次姿态解算。

MPU6050芯片引脚:

  •         SCL:IIC从时钟信号线SCL,模块需要外接上拉电阻,一般为4.7K
  •         SDA:IIC从时钟信号线SDA,模块需要外接上拉电阻,一般为4.7K
  •         INT:中断输出引脚
  •         AUX_CL:IIC主串行数据信号线,用于外接传感器
  •         AUX_DA:IIC主串行时钟信号线,用于外接传感器
  •         VDD:3.3/5V电源输入
  •         VLOGIC:IO口电压,该引脚最低可以到1.8V,我们一般直接接VDD即可
  •         AD0:从IIC接口(接MCU)的地址控制引脚,该引脚控制IIC地址的最低位。如果接GND,则MPU6050的IIC地址是:0X68;如果接VDD,则是0X69

注意

        这里的地址是不包含数据传输的最低位的(最低位用来表示读写)!!!

        在STM32F4开发板上,AD0是接GND的,所以MPU6050的IIC地址是0X68(不含最低位)。

注:

        这里解释一下为什么MPU6050在有SCL和SDA两条IIC通讯信号线的基础之上,还要设置AUX_CL和AUX_DA引脚?

        我们本次使用的是MPU6050六轴传感器,其中包括三轴的加速度传感器和三轴的陀螺仪(角速度传感器)。在实际使用的过程中,可能还会使用到九轴MPU6050传感器,扩展三轴的磁场传感器。三轴的磁场传感器就需要外接芯片到MPU6050上,通过IIC和MPU6050进行通信,通讯过程中使用的引脚就是AUX_CL和AUX_DA引脚

        MPU6050模块可以把从主机SDA/SCL接收的数据或命令通过AUX_CL和AUX_DA引脚转发到磁场传感器中。但是实际上这种功能比较鸡肋,控制麻烦且效率低,一般会直接把磁场传感器之类的IIC传感器直接与MPU6050挂载在同一条总线上(也就是都连接到SDA/SCL),使用主机直接控制。

4. 利用STM32F4读取MPU6050的姿态步骤

1. 初始化IIC接口

        MPU6050采用IIC与STM32F4进行通讯,所以我们需要先初始化与MPU6050连接的SDA和SCL数据线。

2. 复位MPU6050

        让MPU6050内部所有寄存器恢复默认值,通过对电源管理寄存器1(0X6B)的位7写1实现。复位后,电源管理寄存器1恢复默认值(0X40),然后必须设置该寄存器为0X00,以唤醒MPU6050,进入正常工作状态

电源管理寄存器1:

  • 位7 DEVICE_RESET:该位设置1,重启内部寄存器到默认值。复位完成后该位自动清0。
  • 位6 SLEEP:该位置1,MPU6050进入睡眠模式。
  • 位5 CYCLE:当失能SLEEP且CYCLE位置1,MPU6050进入循环模式。在循环模式,设备在睡眠模式和唤醒模式间循环,根据LP_WAKE_CTRL寄存器设定的速率从加速度计采集样品数据。
  • 位3 TEMP_DIS:该位置1,失能温度传感器。
  • 位[2:0] CLKSEL:3位无符号数值。指定设备的系统时钟源。

其中,DEVICE_RESET 位用来控制复位,设置为 1,复位 MPU6050,复位结束后,MPU硬件自动清零该位。SLEEEP 位用于控制 MPU6050 的工作模式,复位后,该位为 1,即进入了 睡眠模式(低功耗),所以我们要清零该位,以进入正常工作模式。TEMP_DIS 用于设置是否使能温度传感器,设置为 0,则使能;CLKSEL[2:0]用于选择系统时钟源,默认是使用内部 8M RC 晶振的,精度不高,所以我们一般选择 X/Y/Z 轴陀螺作为参考的PLL 作为时钟源,一般设置 CLKSEL=001 即可。

3. 设置角速度传感器(陀螺仪)和加速度传感器的满量程范围

        设置两个传感器的满量程范围(FSR),分别通过陀螺仪配置寄存器(0X1B)加速度传感器配置寄存器(0X1C)设置。我们一般设置陀螺仪的满量程范围为\pm2000dps加速度传感器的满量程范围为\pm2g

陀螺仪配置寄存器:GYRO_CONFIG

        该寄存器用来触发陀螺仪自检和配置陀螺仪的满量程范围。 

  • 位7 XG_ST:置位X轴进行自检。
  • 位6 YG_ST:置位Y轴进行自检。
  • 位5 ZG_ST:置位Z轴进行自检。
  • 位[4:3] FS_SEL:2位无符号数值,选择陀螺仪的满量程范围。

该寄存器我们只关心 FS_SEL[1:0]这两个位,用于设置陀螺仪的满量程范围:0,±250°/S;1,±500°/S;2,±1000°/S;3,±2000°/S;我们一般设置为 3,即±2000°/S,因为陀螺 仪的 ADC 为 16 位分辨率,所以得到灵敏度为:65536/4000=16.4LSB/(°/S)。

加速度传感器配置寄存器:ACCEL_CONFIG

        这寄存器是用来触发加速度计自检和配置加速度计的满量程范围。这个寄存器也可以用于配置数字高通滤波器(DHPF)

  • 位7 XA_ST:该位置1,加速度计的X轴执行自检。
  • 位6 YA_ST:该位置1,加速度计的Y轴执行自检。
  • 位5 ZA_ST:该位置1,加速度计的Z轴执行自检。
  • 位[4:3] AFS_SEL:2位无符号值。选择加速度计的满量程范围。

该寄存器我们只关心 AFS_SEL[1:0]这两个位,用于设置加速度传感器的满量程范围:0, ±2g;1,±4g;2,±8g;3,±16g;我们一般设置为 0,即±2g,因为加速度传感器的 ADC也是 16 位,所以得到灵敏度为:65536/4=16384LSB/g。

4. 设置其他参数

        还需要配置的参数有:关闭中断关闭AUX IIC接口禁止FIFO设置陀螺仪采样率设置数字低通滤波器(DLPF)等。

①:本节不使用中断的方式读取数据,所以关闭中断,通过中断使能寄存器(0X38)

中断使能寄存器:INT_ENABLE

该寄存器使能中断源的中断的产生

  • 位6 MOT_EN:该位置1,该位使能运动检测(Motion detection)产生中断
  • 位4 FIFO_OFLOW_EN:该位置1,该位使能FIFO缓冲区溢出产生中断
  • 位3 I2C_MST_INT_EN:该位置1,该位使能IIC主机所有中断源产生中断
  • 位0 DATA_RDY_EN:该位置1,该位使能数据就绪(Data Ready interrupt)产生中断,所有的传感器寄存器写操作完成时都会产生

②:本节不使用AUX IIC接口外接其他传感器(磁力传感器),所以关闭这个接口,通过用户控制寄存器(0X6A)

用户控制寄存器:USER_CTRL

该寄存器允许用户使能或使能FIFO缓冲区,IIC主机模式和主要IIC接口。

  • 位6 FIFO_EN:该位置1,使能FIFO操作;该位清0,失能FIFO缓冲区。
  • 位5 I2C_MST_EN:该位置1,使能I2C主机模式;该位清0,辅助I2C总线(AUX_DA 和 AUX_CL)逻辑上由主I2C总线(SDA 和 SCL)驱动
  • 位4 I2C_IF_DIS:MPU6000---该位置1,失能主I2C接口并使能SPI接口(这里注意MPU6000系列是使用SPI进行通讯的);MPU6050该位写0
  • 位2 FIFO_RESET:当FIFO_EN=0 该位置1,复位FIFO缓冲区。复位后该位自动清0
  • 位1 I2C_MST_RESET:当I2C_MST_EN=0 该位置1,复位I2C主机。复位后该位自动清0
  • 位0 SIG_COND_RESET:该位置1,复位所有传感器的信号通道(陀螺仪、加速度计和温度传感器)。

③:本节不使用FIFO存储传感器数据,所以关闭所有FIFO通道,通过FIFO使能寄存器(0X23)控制

FIFO使能寄存器:FIFO_EN

此寄存器决定哪个传感器的测量值被加载到FIFO缓冲区

  • 位7 TEMP_FIFO_EN:该位置1,使能TEMP_OUT_H 和 TEMP_OUT_L寄存器加载到FIFO缓冲区
  • 位6 XG_FIFO_EN:该位置1,使能GYRO_XOUT_H 和 GYRO_XOUT_L寄存器加载到FIFO缓冲区
  • 位5 YG_FIFO_EN:该位置1,使能GYRO_YOUT_H 和 GYRO_YOUT_L寄存器加载到FIFO缓冲区
  • 位4 ZG_FIFO_EN:该位置1,使能GYRO_ZOUT_H 和 GYRO_ZOUT_L寄存器加载到FIFO缓冲区
  • 位3 ACCEL_FIFO_EN:该位置1,使能ACCEL_XOUT_H, ACCEL_XOUT_L, ACCEL_YOUT_H, ACCEL_YOUT_L, ACCEL_ZOUT_H 和
  • ACCEL_ZOUT_L寄存器加载到FIFO缓冲区
  • 位2 SLV2_FIFO_EN:该位置1,使能EXT_SENS_DATA 寄存器和从机 2 加载到FIFO缓冲区
  • 位1 SLV1_FIFO_EN:该位置1,使能EXT_SENS_DATA 寄存器和从机 1 加载到FIFO缓冲区
  • 位0 SLV0_FIFO_EN:该位置1,使能EXT_SENS_DATA 寄存器和从机 0 加载到FIFO缓冲区

该寄存器用于控制 FIFO 使能,在简单读取传感器数据的时候,可以不用 FIFO,设置对应 位为 0 即可禁止 FIFO,设置为 1,则使能 FIFO。注意加速度传感器的 3 个轴,全由 1 个位 (ACCEL_FIFO_EN)控制,只要该位置 1,则加速度传感器的三个通道都开启 FIFO 了。

④:设置陀螺仪采样率通过采样率分频寄存器(0X19)控制,这个采样率我们一般设置为50

采样率分频寄存器:SMPLRT_DIV

该寄存器用于MPU60X0的陀螺仪采样频率输出设置

  • 位[7:0] SMPLRT_DIV:8位无符号值。陀螺仪输出频率由这个值的分频所确定。

该寄存器用于设置 MPU6050 的陀螺仪采样频率,计算公式为:

采样频率 = 陀螺仪输出频率 / (1+SMPLRT_DIV)

这里陀螺仪的输出频率,是 1Khz 或者 8Khz,与数字低通滤波器(DLPF)的设置有关, 当 DLPF_CFG=0/7 的时候,频率为 8Khz,其他情况是 1Khz。而且 DLPF 滤波频率一般设置为 采样率的一半。采样率,我们假定设置为 50Hz,那么 SMPLRT_DIV=1000/50-1=19。

⑤:设置数字低通滤波器DLPF,通过配置寄存器(0X1A)设置,一般设置DLPF为带宽的1/2即可。

 配置寄存器:CONFIG

 该寄存器配置外部Frame Synchronization(FSYNC)引脚采样,陀螺仪和加速度计的数字低通滤波器

  • 位[5:3] EXT_SYNC_SET:3位无符号数值。配置FSYNC引脚采样
  • 位[2:0] DLPF_CFG:3位无符号数值。配置DLPF设置

这里的加速度传感器,输出速率(Fs)固定是 1Khz,而角速度传感器的输出速率(Fs), 则根据 DLPF_CFG 的配置有所不同。

5. 配置系统时钟源并使能角速度传感器和加速度传感器

        系统时钟源同样是通过电源管理寄存器1(0X6B)来设置,这个前面我们已经介绍了,该寄存器的最低三位用于设置系统时钟源选择,默认值是0(内部 8M RC 震荡),不过我们一般设置为1,选择x轴陀螺PLL作为时钟源,以获得更高精度的时钟。

        同时使能加速度传感器和加速度传感器,这两个操作通过电源管理寄存器2(0X6C)来设置,设置对应位为0即可开启。

电源管理寄存器2:PWR_MGMT_2

该寄存器允许用户配置加速度计在低功耗模式下唤起的频率。也允许用户让加速度计和陀螺仪的个别轴进入待机模式

  • 位[7:6] LP_WAKE_CTRL:2位无符号数值。指定加速度计在低功耗模式下的唤醒频率
  • 位5 STBY_XA:该位置1,加速度计的X轴进入待机模式
  • 位4 STBY_YA:该位置1,加速度计的Y轴进入待机模式
  • 位3 STBY_ZA:该位置1,加速度计的Z轴进入待机模式
  • 位2 STBY_XG:该位置1,陀螺仪的X轴进入待机模式
  • 位1 STBY_YG:该位置1,陀螺仪的Y轴进入待机模式
  • 位0 STBY_ZG:该位置1,陀螺仪的Z轴进入待机模式

该寄存器的 LP_WAKE_CTRL 用于控制低功耗时的唤醒频率,本章用不到。剩下的 6 位, 分别控制加速度和陀螺仪的 x/y/z 轴是否进入待机模式,这里我们全部都不进入待机模式,所以 全部设置为 0 即可。

补充:

        最后再介绍陀螺仪数据输出寄存器加速度传感器数据输出寄存器

①:陀螺仪数据输出寄存器,总共有 6 个寄存器组成,地址为:0X43~0X48

通过读这六个寄存器,就可以读到陀螺仪x/y/z轴的值。比方说X轴的数据,可以通过读取0X43(高8位)和0X44(低8位)寄存器得到。

                                                                                                Y轴的数据,通过读取0X45和0X46寄存器得到。

                                                                                                Z轴的数据,通过读取0X47和0X48寄存器得到。

:这六个寄存器都是8位寄存器,而读取陀螺仪x/y/z的寄存器都是十六位寄存器,所以每两个寄存器配置一个轴。

②:加速度传感器数据输出寄存器,也是6个寄存器组成,地址为:0X3B~0X40

同理,该寄存器和陀螺仪数据输出寄存器的配置方法相同。

③:温度传感器的值,通过读取0X41(高8位)和0X42(低8位)寄存器得到

温度转换公式为:

Temperature = 36.53 + regval/340

其中,Temperature为计算得到的温度值,单位是℃,regval为从寄存器0X41和0X42读取的温度传感器值。

5. 硬件设计

        MPU6050通过三根线与STM32F4开发板连接,其中IIC总线和AT24C02以及WM8978共用,接在PB8和PB9上面。MPU6050的中断输出,连接在STM32F4的PC0引脚上(本实验不使用MPU6050的中断输出)。

        另外,AD0接GND,所以MPU6050的器件地址是:0X68

6. 实验程序

实验功能:

        程序先初始化MPU6050等外设,然后利用DMP库,初始化MPU6050及使能DMP,最后,在死循环里面不停的读取:温度传感器、加速度传感器、陀螺仪、DMP姿态解算后的欧拉角等数据,通过串口上报给上位机(温度不上报),利用上位机软件(ANO_Tech 匿名四轴上位_V2.6.exe),可以实时显示MPU6050的传感器状态曲线,并显示3D姿态。

6.1 ANO_Tech 匿名四轴上位机_V2.6.exe

ANO_Tech 匿名四轴上位机_V2.6.exe 软件基本参数设置如下:

需要该软件的朋友联系UP!!!

6.2 main.c

#include "stm32f4xx.h"                 
#include "delay.h"
#include "usart.h"
#include "LED.h"
#include "lcd.h"
#include "Key.h"
#include "usmart.h"
#include "MyI2C.h"
#include "AT24C02.h"
#include "MyMPU6050.h"
#include "inv_mpu.h"
#include "inv_mpu_dmp_motion_driver.h"

//LCD状态设置函数
void led_set(u8 sta)//只要工程目录下有usmart调试函数,主函数就必须调用这两个函数
{
	LED1=sta;
}
//函数参数调用测试函数
void test_fun(void(*ledset)(u8),u8 sta)
{
	led_set(sta);
}
//串口1发送一个字符
//c:要发送的字符
void usart1_send_char(u8 c)
{
	while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);//获取串口发送状态位,可以发送
	USART_SendData(USART1,c); //将一个字符通过串口1发送
}
//传送数据给匿名四轴上位机软件
//Function:功能字  0XA0~0XAF
//Data:数据缓存区 最多28字节!
//Length:Data区有效数据的个数
void usart1_Anonymous_Report(u8 Function,u8 *Data,u8 Length)
{
	u8 send_buffer[32];
	u8 i;
	if(Length>28)
		return;
	send_buffer[Length+3]=0; //校验数置零
	send_buffer[0]=0X88;	//帧头
	send_buffer[1]=Function;	//功能字
	send_buffer[2]=Length;	//数据长度
	for(i=0;i<Length;i++)send_buffer[3+i]=Data[i];			//复制数据
	for(i=0;i<Length+3;i++)send_buffer[Length+3]+=send_buffer[i];	//计算校验和	
	for(i=0;i<Length+4;i++)usart1_send_char(send_buffer[i]);	//发送数据到串口1 
}
//发送加速度传感器数据和陀螺仪数据
//aacx,aacy,aacz:x,y,z三个方向上面的加速度值
//gyrox,gyroy,gyroz:x,y,z三个方向上面的陀螺仪值
void MPU6050_Send_Data(short aacx,short aacy,short aacz,short gyrox,short gyroy,short gyroz)
{
	u8 Buffer[12];  //数组中可以存放12个8字节大小的数据
	Buffer[0]=(aacx>>8)&0XFF; //MyMPU6050.c文件中获取的原始值都是16位的,所有首先右移8位,与0XFF进行与&操作,取出高8位
	Buffer[1]=aacx&0XFF;	  //直接进行与&操作,取出低8位
	Buffer[2]=(aacy>>8)&0XFF;
	Buffer[3]=aacy&0XFF;
	Buffer[4]=(aacz>>8)&0XFF;
	Buffer[5]=aacz&0XFF; 
	Buffer[6]=(gyrox>>8)&0XFF;
	Buffer[7]=gyrox&0XFF;
	Buffer[8]=(gyroy>>8)&0XFF;
	Buffer[9]=gyroy&0XFF;
	Buffer[10]=(gyroz>>8)&0XFF;
	Buffer[11]=gyroz&0XFF;
	usart1_Anonymous_Report(0XA1,Buffer,12);  //通过调用函数将原始值发送给四轴匿名上位机软件 0XA1是自定义帧
}
//通过串口1上报解算后的姿态数据给电脑
//aacx,aacy,aacz:x,y,z三个方向上面的加速度值
//gyrox,gyroy,gyroz:x,y,z三个方向上面的陀螺仪值
//roll:横滚角.单位0.01度。 -18000 -> 18000 对应 -180.00  ->  180.00度
//pitch:俯仰角.单位 0.01度。-9000 - 9000 对应 -90.00 -> 90.00 度
//yaw:航向角.单位为0.1度 0 -> 3600  对应 0 -> 360.0度
void Usart1_Report_InComputer(short aacx,short aacy,short aacz,short gyrox,short gyroy,short gyroz,short roll,short pitch,short yaw)
{
	u8 Buffer[28];
	u8 i=0;
	for(i=0;i<28;i++)
	{
		Buffer[i]=0; //清0
	}
	Buffer[0]=(aacx>>8)&0XFF;//MyMPU6050.c文件中获取的原始值都是16位的,所有首先右移8位,与0XFF进行与&操作,取出高8位
	Buffer[1]=aacx&0XFF;	//直接进行与&操作,取出低8位
	Buffer[2]=(aacy>>8)&0XFF;
	Buffer[3]=aacy&0XFF;
	Buffer[4]=(aacz>>8)&0XFF;
	Buffer[5]=aacz&0XFF; 
	Buffer[6]=(gyrox>>8)&0XFF;
	Buffer[7]=gyrox&0XFF;
	Buffer[8]=(gyroy>>8)&0XFF;
	Buffer[9]=gyroy&0XFF;
	Buffer[10]=(gyroz>>8)&0XFF;
	Buffer[11]=gyroz&0XFF;	
	Buffer[18]=(roll>>8)&0XFF;
	Buffer[19]=roll&0XFF;
	Buffer[20]=(pitch>>8)&0XFF;
	Buffer[21]=pitch&0XFF;
	Buffer[22]=(yaw>>8)&0XFF;
	Buffer[23]=yaw&0XFF;
	usart1_Anonymous_Report(0XAF,Buffer,28); //飞控显示帧,0XAF
}
int main(void)
{
	u8 t=0;
	u8 Report=1;  //默认开启上报
	u8 key=0;
	float pitch,roll,yaw; //欧拉角
	short aacx,aacy,aacz; //加速度传感器原始数据
	short gyrox,gyroy,gyroz; //陀螺仪原始数据
	short temp;    //温度
	delay_init(168);
	uart_init(500000);   //初始化串口波特率为500000
	
	LED_Init();
	LCD_Init();
	Key_Init();
	MPU6050_Init();
	
	POINT_COLOR=RED;
	LCD_ShowString(30,50,200,16,16,"Explorer STM32F4");
	LCD_ShowString(30,70,200,16,16,"MPU6050 Test");
	LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
	LCD_ShowString(30,110,200,16,16,"2023/20/23");
	
	while(mpu_dmp_init())
	{
		LCD_ShowString(30,130,200,16,16,"MPU6050 Error");
		delay_ms(200);
		LCD_Fill(30,130,239,130+16,WHITE);
		delay_ms(200);
	}
	LCD_ShowString(30,130,200,16,16,"MPU6050 OK");
	LCD_ShowString(30,150,200,16,16,"KEY0:UPLOAD ON/OFF");
	
	POINT_COLOR=BLUE;
	LCD_ShowString(30,170,200,16,16,"UPLOAD ON");
	LCD_ShowString(30,200,200,16,16," Temp:    . C");
	LCD_ShowString(30,220,200,16,16,"Pitch:    . C");
	LCD_ShowString(30,240,200,16,16," Roll:    . C");
	LCD_ShowString(30,260,200,16,16," Yaw :    . C");
	
	while(1)
	{
		key=KEY_Scan(0);
		if(key==1)  //KEY0按键按下
		{
			Report=!Report;
			if(Report)
			{
				LCD_ShowString(30,170,200,16,16,"UPLOAD ON");
			}
			else
				LCD_ShowString(30,170,200,16,16,"UPLOAD OFF");
		}
		if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0) //该mpu_dmp_get_data函数得到DMP处理后的欧拉角数据,返回0表示正确
		{
			temp=MPU6050_Get_Temperature();   				//得到温度数据
			MPU6050_Get_Gyroscope(&gyrox,&gyroy,&gyroz);	//得到陀螺仪数据
			MPU6050_Get_Accelerometer(&aacx,&aacy,&aacz);	//得到加速度数据
			if(Report)
				MPU6050_Send_Data(aacx,aacy,aacz,gyrox,gyroy,gyroz);//用自定义帧发送加速度和陀螺仪原始数据
			if(Report)
				Usart1_Report_InComputer(aacx,aacy,aacz,gyrox,gyroy,gyroz,(int)(roll*100),(int)(pitch*100),(int)(yaw*10));//串口1上报姿态转换后的数据给电脑
			if((t%10)==0)
			{
				if(temp<0)
				{
					LCD_ShowChar(30+6*8,200,'-',16,0); //显示负号
					temp=-temp; //转换为正数
				}
				else
				{
					LCD_ShowChar(30+6*8,200,' ',16,0); //去掉负号
				}
				LCD_ShowNum(30+7*8,200,temp/100,3,16); //显示整数部分
				LCD_ShowNum(30+8*11,200,temp%10,1,16); //显示小数部分
				temp=pitch*10; //实际上显示的是pitch角的整数部分和小数部分
				
				if(temp<0)
				{
					LCD_ShowChar(30+6*8,220,'-',16,0); //显示负号
					temp=-temp; //转换为正数
				}
				else
				{
					LCD_ShowChar(30+6*8,220,' ',16,0); //去掉负号
				}
				LCD_ShowNum(30+7*8,220,temp/10,3,16); //显示整数部分
				LCD_ShowNum(30+8*11,220,temp%10,1,16); //显示小数部分
				temp=roll*10; //实际上显示的是roll角的整数部分和小数部分
				
				if(temp<0)
				{
					LCD_ShowChar(30+6*8,240,'-',16,0); //显示负号
					temp=-temp; //转换为正数
				}
				else
				{
					LCD_ShowChar(30+6*8,240,' ',16,0); //去掉负号
				}
				LCD_ShowNum(30+7*8,240,temp/10,3,16); //显示整数部分
				LCD_ShowNum(30+8*11,240,temp%10,1,16); //显示小数部分
				temp=yaw*10; //实际上显示的是yaw角的整数部分和小数部分
				
				if(temp<0)
				{
					LCD_ShowChar(30+6*8,260,'-',16,0); //显示负号
					temp=-temp; //转换为正数
				}
				else
				{
					LCD_ShowChar(30+6*8,260,' ',16,0); //去掉负号
				}
				LCD_ShowNum(30+7*8,260,temp/10,3,16); //显示整数部分
				LCD_ShowNum(30+8*11,260,temp%10,1,16); //显示小数部分
				t=0;
				LED0=!LED0;
			}
		}
		t++;
	}
}



6.3 MyMPU6050.c

#include "stm32f4xx.h"               
#include "MyMPU6050.h"
#include "delay.h"
#include "usart.h"


//初始化MPU6050
//返回值:0,成功
//    其他,错误代码
u8 MPU6050_Init(void)
{
	//该步骤严格按读取MPU6050姿态的步骤进行
	u8 res;
	IIC_Init();
    //#define MPU_PWR_MGMT1_REG		0X6B	//电源管理寄存器1
	MPU6050_Write_Byte(MPU_PWR_MGMT1_REG,0X80);	//复位MPU6050  通过对电源管理寄存器1的位7写1来实现
    //位7 DEVICE_RESET:该位设置1,重启内部寄存器到默认值。复位完成后该位自动清0。
    delay_ms(100);
	MPU6050_Write_Byte(MPU_PWR_MGMT1_REG,0X00);	//唤醒MPU6050  通过使电源管理寄存器1清0,进入正常工作模式
    //设置角速度传感器(陀螺仪)和加速度传感器的满量程范围
    //设置两个传感器的满量程范围(FSR),分别通过陀螺仪配置寄存器(0X1B)和加速度传感器配置寄存器(0X1C)设置。
    //我们一般设置陀螺仪的满量程范围为2000dps,加速度传感器的满量程范围为2g。
	MPU6050_Set_Gyro_Fsr(3);					//陀螺仪传感器,±2000dps
	MPU6050_Set_Accel_Fsr(0);					//加速度传感器,±2g
	MPU6050_Set_Rate(50);						//设置采样率50Hz
    //设置其他参数,其中包括关闭中断、关闭AUX IIC接口、禁止FIFO、设置陀螺仪采样率和设置数字低通滤波器(DLPF)
	MPU6050_Write_Byte(MPU_INT_EN_REG,0X00);	//关闭所有中断  将中断使能寄存器的所有位写入0,关闭所有中断
	MPU6050_Write_Byte(MPU_USER_CTRL_REG,0X00);	//I2C主模式关闭 也就是MPU6050充当主机,通过IIC和磁力传感器进行通讯,实现九轴传感器
	MPU6050_Write_Byte(MPU_FIFO_EN_REG,0X00);	//关闭FIFO  将FIFO使能寄存器的所有位写入0,来关闭FIFO
	MPU6050_Write_Byte(MPU_INTBP_CFG_REG,0X80);	//INT引脚低电平有效
	res=MPU6050_Read_Byte(MPU_DEVICE_ID_REG);   //通过读取WHO_AM_I寄存器获取MPU6050的ID
	if(res==MPU_Address)//器件ID正确   //判断ID是否是0X68
	{
        //配置系统时钟源并使能角速度传感器和加速度传感器
		MPU6050_Write_Byte(MPU_PWR_MGMT1_REG,0X01);	//设置CLKSEL,PLL X轴为参考 通过设置电源管理寄存器1的最低位,设置系统时钟为001
		MPU6050_Write_Byte(MPU_PWR_MGMT2_REG,0X00);	//加速度与陀螺仪都工作  通过设置电源管理寄存器2的所有位为0来使能加速度计和陀螺仪,设置为1则加速度计和陀螺仪的X,Y,Z轴进入待机模式
		MPU6050_Set_Rate(50);						//设置采样率为50Hz
 	}
    else 
        return 1; //ID错误
	return 0;
}
//设置MPU6050的陀螺仪传感器满量程范围
//FS_SEL:0,±250dps;1,±500dps;2,±1000dps;3,±2000dps
//返回值:0,设置成功
//		其他,设置失败
u8 MPU6050_Set_Gyro_Fsr(u8 FS_SEL)
{
	return MPU6050_Write_Byte(MPU_GYRO_CFG_REG,FS_SEL<<3); //设置陀螺仪配置寄存器的位3和位4,这里选择量程3,±2000dps,所以配置为3即可
}
//设置MPU6050加速度传感器满量程范围
//AFS_SEL::0,±2g;1,±4g;2,±8g;3,±16g
//返回值:0,设置成功
//    其他,设置失败 
u8 MPU6050_Set_Accel_Fsr(u8 AFS_SEL)
{
	return MPU6050_Write_Byte(MPU_ACCEL_CFG_REG,AFS_SEL<<3); //配置加速度传感器配置寄存器的位3和位4,所以需要左移三位,这里设置0,±2g;
}
//设置MPU6050的数字低通滤波器
//PinLv:数字低通滤波频率
//返回值:0,设置成功
//    其他,设置失败 
u8 MPU6050_Set_LPF(u16 PinLv)
{
	u8 Data=0;
	if(PinLv>=188)  //这里解释一下,为什么分别设置数字低通滤波频率为188 98 42 20 10 并且得到的低通滤波频率为1 2 3 4 5 6
					//首先设置MPU6050的数字低通滤波器其实质是设置配置寄存器的低3位,根据官方MPU6050寄存器手册
		Data=1;     //当设置的数字低通滤波器频率大于188Hz时,配置寄存器的低三位写入001,也就是1
	else if(PinLv>=98)
		Data=2;		//当设置的数字低通滤波器频率大于98Hz时,配置寄存器的低三位写入010,也就是2
	else if(PinLv>=42)
		Data=3;		//当设置的数字低通滤波器频率大于42Hz时,配置寄存器的低三位写入011,也就是3
	else if(PinLv>=20)
		Data=4;		//当设置的数字低通滤波器频率大于20Hz时,配置寄存器的低三位写入100,也就是4
	else if(PinLv>=10)
		Data=5;		//当设置的数字低通滤波器频率大于10Hz时,配置寄存器的低三位写入101,也就是5
	else
		Data=6;		//其他情况下均写入111,表示6
	return MPU6050_Write_Byte(MPU_CFG_REG,Data);  //通过写配置寄存器的第三位即可设置数字低通滤波器
    //#define MPU_CFG_REG				0X1A	//配置寄存器
}
//设置MPU6050采样率
//Rate:4~1000Hz
//返回值:0,设置成功
//    其他,设置失败 
u8 MPU6050_Set_Rate(u16 Rate) //这里一定要假设MPU6050的输出频率为1Khz,输出频率可以是1Khz或者8Khz,其值和数字低通滤波器的设置有关,当数字低通滤波器的低三位写入0或者7时,为8Khz,其余均是1Khz
{
	u8 Data;  //定义Data是采样率分频寄存器写入的8位数值
	if(Rate>1000) //设置范围
		Rate=1000;
	if(Rate<4)    //设置范围
		Rate=4;
	Data=1000/Rate-1;  //采样频率 = 陀螺仪输出频率 / (1+SMPLRT_DIV)  其中SMPLRT_DIV就是Data,寄存器中写入的值
	//采样频率 = 陀螺仪输出频率 / (1+Data) 其中输出频率是1Khz
	Data=MPU6050_Write_Byte(MPU_SAMPLE_RATE_REG,Data); //设置数字低通滤波器
	return MPU6050_Set_LPF(Rate/2); //自动设置数字低通滤波器为采样频率的一半
}
//得到温度值
//返回值:温度值(扩大了100倍)
short MPU6050_Get_Temperature(void)
{
	u8 Buffer[2]; //温度的值是由两个八位寄存器读取的,所以定义一个存储两字节大小的数组
	short raw;  //短整型16位
	float temperature;
	MPU6050_Read_Len(MPU_Address,MPU_TEMP_OUTH_REG,2,Buffer);
	raw=((u16)Buffer[0]<<8)|Buffer[1]; //16位温度值需要两个8位进行或运算
	temperature=36.53+((double)raw)/340; //Temperature = 36.53 + regval/340 ,计算温度的公式 其中regval是从0X41和0X42寄存器读出的值
	return temperature*100;
}
//得到陀螺仪原始值
//GX,GY,GZ:陀螺仪X,Y,Z轴的原始读数
//返回值:0,成功
//    其他,错误代码
u8 MPU6050_Get_Gyroscope(short *GX,short *GY,short *GZ)
{
	u8 Buffer[6];
	u8 res;
	res=MPU6050_Read_Len(MPU_Address,MPU_GYRO_XOUTH_REG,6,Buffer);//读陀螺仪的原始值是通过读6个陀螺仪数据输出寄存器,这些寄存器都是8位的,每两个寄存器拼接成一个16位的原始数据
	if(res==0)//返回值为0,表示读成功
	{
		*GX=((u16)Buffer[0]<<8)|Buffer[1];//因为先读的是寄存器的高8位
		*GY=((u16)Buffer[2]<<8)|Buffer[3];
		*GZ=((u16)Buffer[4]<<8)|Buffer[5];
	}
	return res;
}
//得到加速度计原始值
//AX,AY,AZ:加速度计X,Y,Z轴的原始读数
//返回值:0,成功
//    其他,错误代码
u8 MPU6050_Get_Accelerometer(short *AX,short *AY,short *AZ)
{
	u8 Buffer[6];
	u8 res;
	res=MPU6050_Read_Len(MPU_Address,MPU_ACCEL_XOUTH_REG,6,Buffer);//读加速度计的原始值是通过读6个加速度数据输出寄存器,这些寄存器都是8位的,每两个寄存器拼接成一个16位的原始数据
	if(res==0)//返回值为0,表示读成功
	{
		*AX=((u16)Buffer[0]<<8)|Buffer[1];//因为先读的是寄存器高8位
		*AY=((u16)Buffer[2]<<8)|Buffer[3];
		*AZ=((u16)Buffer[4]<<8)|Buffer[5];
	}
	return res;
}
//IIC连续写
//Address:器件地址
//Register:寄存器地址
//Length:要写入的长度
//Buffer:数据区
//返回值:0,正常
//		其他,错误代码
u8 MPU6050_Write_Len(u8 Address,u8 Register,u8 Length,u8 *Buffer)
{
	u8 i;
	IIC_Start(); //发送起始信号
	IIC_Send_Byte((Address<<1)|0); //主机向从机发送器件地址,也就是主机想要和从机的哪块地址进行通讯,地址最低位是读写位
	//IIC发送的从机地址是7位,最低位是R/W:主从写方向位,(Address<<1)|0表示左移一位再把最低位置0,也就表示主机写数据到从机
	if(IIC_Wait_Ack()) //等待从机应答,IIC_Wait_Ack该函数的返回值若为1,则表示没有接收到从机的应答信号,IIC通讯结束
	{
		IIC_Stop();
		return 1;
	}
	IIC_Send_Byte(Register); //跳过if判断语句就意味着从机接收到了主机的信号,主机发送寄存器地址
	IIC_Wait_Ack(); //等待从机应答
	for(i=0;i<Length;i++) 
	{
		IIC_Send_Byte(Buffer[i]);//通过循环一位一位的发送数据,发送Length字节长的数据
		if(IIC_Wait_Ack())//IIC时序规定每发送一位,从机都要应答一次
		{
			IIC_Stop();
			return 1;
		}
	}
	IIC_Stop(); //发送完毕,IIC通讯结束
	return 0;
}
//IIC连续读
//Address:器件地址
//Register:要读取的寄存器地址
//Length:要读取的长度
//Buffer:读取到的数据存储区
//返回值:0,正常
//		其他,错误代码
u8 MPU6050_Read_Len(u8 Address,u8 Register,u8 Length,u8 *Buffer)
{
	IIC_Start(); //发送起始信号
	IIC_Send_Byte((Address<<1)|0); //主机向从机发送器件地址,也就是主机想要和从机的哪块地址进行通讯
	//IIC发送的从机地址是7位,最低位是R/W:主从写方向位,(Address<<1)|0表示左移一位再把最低位置0,也就表示主机写数据到从机
	if(IIC_Wait_Ack()) //等待从机应答,IIC_Wait_Ack该函数的返回值若为1,则表示没有接收到从机的应答信号,IIC通讯结束
	{
		IIC_Stop();
		return 1;
	}
	IIC_Send_Byte(Register); //跳过if判断语句就意味着从机接收到了主机的信号,主机发送寄存器地址
	IIC_Wait_Ack(); //等待从机应答
	IIC_Start(); //发送起始信号
	IIC_Send_Byte((Address<<1)|1); //主机向从机发送器件地址,也就是主机想要和从机的哪块地址进行通讯
	//IIC发送的从机地址是7位,最低位是R/W:主从写方向位,(Address<<1)|1表示左移一位再把最低位置1,也就表示主机从从机中读数据
	IIC_Wait_Ack(); //等待从机应答
	while(Length)
	{
		if(Length==1)//如果只写入了一个节长的数据,那么发送NAck
		{
			*Buffer=IIC_Read_Byte(0); //不产生应答
		}
		else
			*Buffer=IIC_Read_Byte(1);//产生应答
		Length--;
		Buffer++;
	}
	IIC_Stop();
	return 0;
}
//IIC写一个字节
//Register:寄存器地址
//Data:数据
//返回值:0,正常
//		其他,错误代码
u8 MPU6050_Write_Byte(u8 Register,u8 Data)
{
	IIC_Start();
	IIC_Send_Byte((MPU_Address<<1)|0); //注意写一位写字节时,发送的是从机IIC的地址
	if(IIC_Wait_Ack()) //等待从机应答,IIC_Wait_Ack该函数的返回值若为1,则表示没有接收到从机的应答信号,IIC通讯结束
	{
		IIC_Stop();
		return 1;
	}
	IIC_Send_Byte(Register);
	IIC_Wait_Ack();
	IIC_Send_Byte(Data);
	if(IIC_Wait_Ack()) //等待从机应答,IIC_Wait_Ack该函数的返回值若为1,则表示没有接收到从机的应答信号,IIC通讯结束
	{
		IIC_Stop();
		return 1;
	}
	IIC_Stop();
	return 0;
}
//IIC读一个字节
//Register:寄存器地址
//返回值:读到的数据
u8 MPU6050_Read_Byte(u8 Register)
{
	u8 res;
	IIC_Start();
	IIC_Send_Byte((MPU_Address<<1)|0);
	IIC_Wait_Ack();
	IIC_Send_Byte(Register);
	IIC_Wait_Ack();
	IIC_Start();
	IIC_Send_Byte((MPU_Address<<1)|1);
	IIC_Wait_Ack();
	res=IIC_Read_Byte(0);
	IIC_Stop();
	return res;
}


6.4 MyMPU6050.h

#ifndef _MYMPU6050__H_
#define _MYMPU6050__H_
#include "sys.h"
#include "MyI2C.h"

/
//MyMPU6050.h头文件的寄存器地址宏定义均来源于MPU6050寄存器手册。如果想要了解每一种寄存器对应位的具体功能,请查阅MPU6050寄存器手册。
#define MPU_SELF_TESTX_REG		0X0D	//自检寄存器X
#define MPU_SELF_TESTY_REG		0X0E	//自检寄存器Y
#define MPU_SELF_TESTZ_REG		0X0F	//自检寄存器Z
#define MPU_SELF_TESTA_REG		0X10	//自检寄存器A
#define MPU_SAMPLE_RATE_REG		0X19	//采样频率分频器
#define MPU_CFG_REG				0X1A	//配置寄存器
#define MPU_GYRO_CFG_REG		0X1B	//陀螺仪配置寄存器
#define MPU_ACCEL_CFG_REG		0X1C	//加速度计配置寄存器
#define MPU_MOTION_DET_REG		0X1F	//运动检测阀值设置寄存器
#define MPU_FIFO_EN_REG			0X23	//FIFO使能寄存器
#define MPU_I2CMST_CTRL_REG		0X24	//IIC主机控制寄存器
#define MPU_I2CSLV0_ADDR_REG	0X25	//IIC从机0器件地址寄存器
#define MPU_I2CSLV0_REG			0X26	//IIC从机0数据地址寄存器
#define MPU_I2CSLV0_CTRL_REG	0X27	//IIC从机0控制寄存器
#define MPU_I2CSLV1_ADDR_REG	0X28	//IIC从机1器件地址寄存器
#define MPU_I2CSLV1_REG			0X29	//IIC从机1数据地址寄存器
#define MPU_I2CSLV1_CTRL_REG	0X2A	//IIC从机1控制寄存器
#define MPU_I2CSLV2_ADDR_REG	0X2B	//IIC从机2器件地址寄存器
#define MPU_I2CSLV2_REG			0X2C	//IIC从机2数据地址寄存器
#define MPU_I2CSLV2_CTRL_REG	0X2D	//IIC从机2控制寄存器
#define MPU_I2CSLV3_ADDR_REG	0X2E	//IIC从机3器件地址寄存器
#define MPU_I2CSLV3_REG			0X2F	//IIC从机3数据地址寄存器
#define MPU_I2CSLV3_CTRL_REG	0X30	//IIC从机3控制寄存器
#define MPU_I2CSLV4_ADDR_REG	0X31	//IIC从机4器件地址寄存器
#define MPU_I2CSLV4_REG			0X32	//IIC从机4数据地址寄存器
#define MPU_I2CSLV4_DO_REG		0X33	//IIC从机4写数据寄存器
#define MPU_I2CSLV4_CTRL_REG	0X34	//IIC从机4控制寄存器
#define MPU_I2CSLV4_DI_REG		0X35	//IIC从机4读数据寄存器

#define MPU_I2CMST_STA_REG		0X36	//IIC主机状态寄存器
#define MPU_INTBP_CFG_REG		0X37	//中断/旁路设置寄存器
#define MPU_INT_EN_REG			0X38	//中断使能寄存器
#define MPU_INT_STA_REG			0X3A	//中断状态寄存器

#define MPU_ACCEL_XOUTH_REG		0X3B	//加速度值,X轴高8位寄存器
#define MPU_ACCEL_XOUTL_REG		0X3C	//加速度值,X轴低8位寄存器
#define MPU_ACCEL_YOUTH_REG		0X3D	//加速度值,Y轴高8位寄存器
#define MPU_ACCEL_YOUTL_REG		0X3E	//加速度值,Y轴低8位寄存器
#define MPU_ACCEL_ZOUTH_REG		0X3F	//加速度值,Z轴高8位寄存器
#define MPU_ACCEL_ZOUTL_REG		0X40	//加速度值,Z轴低8位寄存器

#define MPU_TEMP_OUTH_REG		0X41	//温度值高八位寄存器
#define MPU_TEMP_OUTL_REG		0X42	//温度值低8位寄存器

#define MPU_GYRO_XOUTH_REG		0X43	//陀螺仪值,X轴高8位寄存器
#define MPU_GYRO_XOUTL_REG		0X44	//陀螺仪值,X轴低8位寄存器
#define MPU_GYRO_YOUTH_REG		0X45	//陀螺仪值,Y轴高8位寄存器
#define MPU_GYRO_YOUTL_REG		0X46	//陀螺仪值,Y轴低8位寄存器
#define MPU_GYRO_ZOUTH_REG		0X47	//陀螺仪值,Z轴高8位寄存器
#define MPU_GYRO_ZOUTL_REG		0X48	//陀螺仪值,Z轴低8位寄存器

#define MPU_I2CSLV0_DO_REG		0X63	//IIC从机0数据寄存器
#define MPU_I2CSLV1_DO_REG		0X64	//IIC从机1数据寄存器
#define MPU_I2CSLV2_DO_REG		0X65	//IIC从机2数据寄存器
#define MPU_I2CSLV3_DO_REG		0X66	//IIC从机3数据寄存器

#define MPU_I2CMST_DELAY_REG	0X67	//IIC主机延时管理寄存器
#define MPU_SIGPATH_RST_REG		0X68	//信号通道复位寄存器
#define MPU_MDETECT_CTRL_REG	0X69	//运动检测控制寄存器
#define MPU_USER_CTRL_REG		0X6A	//用户控制寄存器
#define MPU_PWR_MGMT1_REG		0X6B	//电源管理寄存器1
#define MPU_PWR_MGMT2_REG		0X6C	//电源管理寄存器2 
#define MPU_FIFO_CNTH_REG		0X72	//FIFO计数寄存器高八位
#define MPU_FIFO_CNTL_REG		0X73	//FIFO计数寄存器低八位
#define MPU_FIFO_RW_REG			0X74	//FIFO读写寄存器
#define MPU_DEVICE_ID_REG		0X75	//器件ID寄存器

//如果MPU6050芯片的引脚A0接地,IIC地址为0X68
//如果MPU6050芯片的引脚A0接电源3.3V,则IIC的地址为0X69
#define MPU_Address 0X68



u8 MPU6050_Init(void);
u8 MPU6050_Set_Gyro_Fsr(u8 FS_SEL);
u8 MPU6050_Set_Accel_Fsr(u8 AFS_SEL);
u8 MPU6050_Set_LPF(u16 PinLv);
u8 MPU6050_Set_Rate(u16 Rate);
short MPU6050_Get_Temperature(void);
u8 MPU6050_Get_Gyroscope(short *GX,short *GY,short *GZ);
u8 MPU6050_Get_Accelerometer(short *AX,short *AY,short *AZ);
u8 MPU6050_Write_Len(u8 Address,u8 Register,u8 Length,u8 *Buffer);
u8 MPU6050_Read_Len(u8 Address,u8 Register,u8 Length,u8 *Buffer);
u8 MPU6050_Write_Byte(u8 Register,u8 Data);
u8 MPU6050_Read_Byte(u8 Register);


#endif


本文如有哪里写的不对的地方,欢迎留言改正,共同进步!!!

  • 11
    点赞
  • 102
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: MPU6050是一种常见的传感器模块,用于测量物体的加速度和角速度。它通过与STM32F1微控制器相结合,可以实现姿态识别功能。 MPU6050模块通过I2C总线与STM32F1进行通信。在代码编写方面,我们可以使用STM32F1的开发环境来编写相应的驱动程序。通过读取MPU6050模块输出的原始数据,我们可以计算出物体的加速度和角速度值。 通过对加速度和角速度数据进行滤波和处理,我们可以得到物体的姿态信息,如倾斜角度、旋转角度等。这些信息可以被应用于姿态识别领域,如无人机、机器人、VR/AR等应用中。 在网络攻防方面,MPU6050模块和STM32F1可以结合起来实现更复杂的功能。通过加入相应的通信模块,如WiFi或蓝牙,我们可以将姿态数据传输到其他设备上,实现远程监控或控制。 在网络攻防代码类资源方面,可以参考网络安全相关的开源项目或资源,如Nmap、Metasploit等。这些资源提供了一套完整的网络攻防解决方案,包括扫描、漏洞利用、入侵检测等功能。 综上所述,MPU6050模块与STM32F1微控制器相结合可以实现姿态识别功能,并且可以结合网络攻防代码类资源来进行更加复杂的应用开发。 ### 回答2: mpu6050是一款运动传感器,可用于姿态识别和控制。它通过检测物体的加速度和角速度来判断物体的姿态和运动状态。mpu6050stm32f1是一款基于STM32F1单片机mpu6050传感器的应用开发板,可以方便地将mpu6050stm32f1单片机进行连接和使用。 在网络攻防领域中,使用mpu6050mpu6050stm32f1可以实现一些有趣的功能。例如,可以使用mpu6050的姿态识别功能来检测设备的姿态变化,通过与网络通信,将姿态变化信息传输到远程服务器,从而实现远程监控和控制功能。 除了姿态识别,还可以利用mpu6050mpu6050stm32f1的加速度和角速度检测功能来进行基于动作的身份验证。例如,可以将特定的手势或动作与用户的身份进行绑定,在进行身份验证时,通过检测用户的动作是否与之前注册的动作匹配来确定用户的身份。 此外,mpu6050mpu6050stm32f1还可以用于网络攻防领域的物理层攻防。例如,可以利用mpu6050检测设备的震动和移动状态,及时发现和防御可能的物理攻击,例如非法拆卸或移动设备。 总的来说,mpu6050mpu6050stm32f1是网络攻防领域中有趣和实用的资源。通过利用它们的姿态识别、加速度和角速度检测功能,可以实现一些创新的网络攻防应用。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值