Bootstrap

stm32学习笔记---MPU6050(理论部分)

目录

MPU6050简介

MPU6050参数

硬件电路

MPU6050框图

PS产品说明书和RM寄存器映像手册

PS产品说明书

RM寄存器映像

采样频率分频器

配置寄存器

陀螺仪配置寄存器

加速度计配置寄存器

数据寄存器

电源管理寄存器1

电源管理寄存器2

器件ID号


声明:本专栏是本人跟着B站江科大的视频的学习过程中记录下来的笔记,我之所以记录下来是为了方便自己日后复习。如果你也是跟着江科大的视频学习的,可以配套本专栏食用,如有问题可以QQ交流群:963138186

本节来研究一下MPU6050的芯片

MPU6050简介

MPU6050是一个6轴姿态传感器,可以测量芯片自身X、Y、Z轴的加速度、角速度参数,要这么多的信息是要干啥可以通过数据融合,可进一步得到姿态角或者叫做欧拉角,常应用于平衡车、飞行器等需要检测自身姿态的场景

什么是6轴姿态传感器

在现实的三维空间里只有xyz三个轴。但是这个MPU6050芯片里面有加速度计和陀螺仪两种传感器可以分别测量xyz三个轴的加速度和角速度加起来总共就是六个轴所以这个芯片是六轴姿态传感器。当然,如果芯片里再集成一个三轴的磁场传感器,测量xyz轴的磁场强度,就叫做九轴姿态传感器。如果再集成一个气压传感器,测量气压大小,就叫做十轴姿态传感器。一般气压值反映的是高度信息,海拔越高,气压越低,所以气压计是单独测量垂直地面的高度信息的。这也就是姿态传感器的一些术语,之后别人再说这个传感器是六轴,九轴,十轴,你就知道六轴就是三轴加速度和三轴角速度,九轴就是三轴加速度、三轴角速度和三轴磁场强度。十轴就是三轴加速度、三轴角速度、三轴磁场强度和一个气压强度。这个大家了解一下。

欧拉角是什么

以飞机为例,欧拉角就是飞机机身相对于初始三个轴的夹角。

飞机机头下倾或上仰这个轴的夹角,叫做俯仰Pitch。飞机机身左翻滚或者右翻滚,这个轴的夹角叫滚转Roll。飞机机身保持水平,机头向左转向,或者向右转向这个轴的夹角,叫做偏航Yaw。

简单来说欧拉角就表达了飞机此时的姿态,飞机是上仰还是下倾?飞机向左倾斜还是向右倾斜?通过欧拉角都能清晰的表示出来。如果你想做一个飞控算法,为了保持飞机姿态平稳,那么得到一个精确且稳定的欧拉角就至关重要。

但是可惜的是之前我们所说的加速度计陀螺仪磁力计任何一种传感器都不能获得精确且稳定的欧辣椒。要想获得精确且稳定的欧拉角就必须进行数据融合把这几种传感器的数据结合起来综合多种传感器的数据取长补短这样才能获得精确且稳定的欧拉角。常见的数据融合算法一般有互补滤波、卡尔曼滤波等。这就涉及到惯性导航领域里姿态解算的知识点。不过我们本节的侧重点是I2C通信,我们最终的程序现象就是把这些传感器的原始数据读出来,显示在OLED上就可以了。

姿态传感器解算出姿态角之后,就常应用于平衡车、飞行器等需要检测自身姿态的场景。对于平衡车来说,如果传感器检测的车身向前或者向后倾斜,程序就可以控制轮子进行调整,保持平衡车的平衡。对于飞行器来说,控制的轴就多一些,一般至少需要检测俯仰角和滚转角两个夹角,然后控制电机,保持飞机的平衡,这就是这个MPU6050姿态传感器的作用。

然后我们来看一下MPU6050内部的六个轴传感器的作用:

3轴加速度计(Accelerometer一般简称Accel,或者Acc,或者A):测量X、Y、Z轴的加速度

看左上面第一张图,这个图xyz轴就是一个三维的坐标系,其中横向的这个轴定义为x轴。纵向的这个轴定义为y轴,垂直于芯片的这个轴定义为z轴,这就是这个芯片对xyz轴的定义,然后在xyz轴,这个芯片内部都分别布置了一个加速度计。

什么是加速度计

看一下上面第二张图,这就是加速度计的结构图,其中水平的这个虚线是感应轴线。中间是一个具有一定质量,可以左右滑动的小滑块,然后左右各有一个弹簧顶着它,如果把这个东西拿在手上来回晃,中间这个小滑块就由左右移动,去压缩或者拉伸两边的弹簧。当滑块移动时就会带动上面的电位器滑动。这个电位器,其实就是一个分压电阻,测量电位器输出的电压就能得到小滑块所受的加速度值了。其实可以发现这个加速度计实际上就是一个弹簧测力计,根据牛顿第二定律F=ma。我们想测量这个加速度a,就可以找一个单位质量的物体,测量它所受的力F就行了。xyz三个轴分别都有这样一个测力计。

可以想象一下,这个芯片里面有六个侧力的秤,组成一个正方体。然后正方体内部放一个大小正好的单位质量小球,这个小球压在哪个侧面上,就会产生对应一个轴的数据输出。比如小球压在下面,这个面就是z轴的正值,小球压上面,这个面就是z轴的负值。对向两个面一组,一面为正值,一面为负值。正方体六个面所测的力就是三个轴的加速度值,这就是加速度计的一个直观理解。

比如把芯片静置水平放在地球上,就只有底面测力计受到小球的压力。所以此时数据输出就是xyz轴输出为0。z轴输出一个g的加速度值,如果此时芯片正处于自由落体,就是所有面都不受力。此时,数据输出就是xyz轴都为0。如果此时芯片向左倾斜放置,就是底面和左面都受力。

这时我们求一个三角函数就能得到向左的倾角西塔了。

不过这个倾角只有芯片静止的时候才是正确的,因为加速度分为重力加速度和运动加速度。如果只是芯片运动起来了,这个三角函数求得的倾角就会受运动加速度的影响。举个例子,比如你坐在汽车里,现在汽车突然向前加速,你是不是感觉椅子底面和靠背都受力?这时如果用三角函数求角度,得到的结果就是你的车停在一个斜坡上,停在斜坡上也是椅子底面和靠背都受力,但实际上,车的状态确实水平向前加速,所以仅使用加速度计求角度,只能在物体静止的时候使用,当物体运动起来时,这个角度就会受运动加速度的影响而变得不准确。

以上就是加速度计的测量原理和特征。总结一下就是加速度计具有静态稳定性不具有动态稳定性。

3轴陀螺仪传感器(Gyroscope):测量X、Y、Z轴的角速度

上面第三张图的那个传感器就是三轴陀螺仪传感器的机械模型,中间是一个有一定质量的旋转轮,外面是三个轴的平衡环。

当中间这个旋转轮高速旋转时,根据角动量守恒的原理,这个旋转轮具有保持它原有角动量的趋势,这个趋势可以保持旋转轴方向不变。当外部物体的方向转动时,内部的旋转轴方向并不会转动。这就会在平衡环连接处产生角度偏差。如果我们在连接处放一个旋转的电位器,测量电位器的电压就能得到旋转的角度了。从这里分析,陀螺仪应该是可以直接得到角度的。但是我们这个MPU6050的陀螺仪并不能直接测量角度,可能是结构的差异,或者是工艺的限制。我们这个芯片内部的陀螺仪测量的实际上是角速度而不是角度

陀螺仪测量xyz轴的角速度值分别表示了此时芯片绕x轴,绕y轴和绕z轴旋转的角速度。这里也可以用一个模型来辅助理解。

可以把这个测量角速度的陀螺仪想象成是游乐园的旋转飞椅。

中间的轴转的越快,这个椅子飞的就越远。最终我们测量一下对两个椅子飞起来的距离或者飞起来的夹角就能得到中间轴的角速度了。这就是测量角速度的陀螺仪工作原理。如果我们想通过角速度得到角度的话我们只需要对角速度进行积分即可角速度积分就是角度

和加速度计测角度一样这个角速度积分得到的角度也有局限性。就是当物体静止时角速度值会因为噪声无法完全归零。然后经过积分的不断累积这个小噪声就会导致计算出来的角度产生缓慢的漂移。也就是角速度积分得到的角度经不起时间的考验。不过这个角度无论是运动还是静止都是没问题的它不会受物体运动的影响。所以总结下来就是陀螺仪具有动态稳定性不具有静态稳定性。

这个陀螺仪是动态稳定,静态不稳定,之前加速度计是静态稳定,动态不稳定。这两种传感器的特性正好互补,所以我们取长补短,进行一下互补滤波就能融合得到静态和动态都稳定的姿态角了。这就是姿态解算的大体思路。

接下来我们来看几个MPU6050的参数。

MPU6050参数

16位ADC采集传感器的模拟信号,量化范围:-32768~32767

之前我们也了解过,这里无论是加速度计还是陀螺仪,它们的基本原理都是设计一种装置。当传感器所感应的参数变化时,这个装置能带动电位器滑动,或者装置本身的电阻可以随感应参数变化而变化。这样在外接一个电源,通过电阻分压,就能把现实世界的各种状态用电压表示出来了。

当然传感器里面肯定不是我们上面图片这样的机械结构,芯片里面都是通过电子的技术来完成各种参数的测量的,要不然也塞不到这么小的芯片里。只是我们理解的时候可以把它想象成这种机械结构,但实际上芯片里面如何用电来完成同样的功能,这就是这个厂家的机密了。

总之,电子的传感器最终也是输出一个随姿态变化而变化的电压,要想量化这个电压信号,就离不开AD转换器,所以这个芯片内部也是自带了AD转换器,可以对各个模拟产量进行量化。这个ADC是十六位的,量化输出的数据变化范围就是2的16次方。如果作为无符号数的话,就是0~65535,这里因为传感器每个轴都有正负的数据,所以这个输出结果是一个有符号,数量化范围是-32768~32767数据是十六位的会分为两个字节存储这个之后我们读取数据计时器的时候就可以看到了。

十六位有符号数的范围所对应的物理参量范围是多少?

这里就需要定义一个满量程范围。这个满量程范围就相当于我们之前学ADC的时候那个VREF参考电压一样,AD值达到最大时,对应电压是3.3V还是5V,需要有一个参考电压来指定,这里也是一样,十六位AD值达到最大时,对应的物理参量具体是多少,也是由满量程范围来决定的。在这里加速度计和陀螺仪的满量程范围都有几个选项可以选择。

加速度量程可以选择±2、±4、±8、±16(g),单位是g也就是重力加速度1个g=9.8m/(s^2)

陀螺仪满量程可以选择±250、±500、±1000、±2000(°/sec),单位是度每秒就是角速度的单位每秒旋转了多少度如果所测量的物体运动非常剧烈,就可以把满量程选择大一些,防止加速度或者角速度超出了量程。如果你所测量的物体运动比较平缓,就可以选择比较小的量程,这样测量的分辨率就会更大。

举个例子,比如你选择加速度计满量程为±16(g),当读取AD值为最大值32768时,当然实际的最大值是32767,就表示此时测量的加速度为满量程±16(g),AD值为32768的一半时就表示加速度为8g。如果选择满量程为±2g的话,此时32768就对应2g的加速度,32768的一半就对应1g的加速度。因为AD值的范围是一定的,所以满量程选的越小测量就会越细腻。

另外,AD值和加速度值是线性关系,一一对应的,由AD值求加速度就是乘一个系数就可以了,这跟我们之前学ADC的时候,由AD值求电压值是一样的道理。然后下面陀螺仪的满量程选择也是同样的操作,满量程选的越大测量范围就越广,满量程选的越小测量分辨率就越高。所以这个满量程的选择要根据实际需求来。

这个MPU6050可配置的数字低通滤波器(可以配置寄存器来选择对输出数据进行低通滤波)。如果觉得输出数据抖动太厉害,就可以加一点低通滤波,这样输出数据就会平缓一些。

可配置的时钟源和可配置的采样分频,这两个参数是配合使用的。时钟源经过这个分频器的分频,可以为AD转换和内部其他电路提供时钟,控制分频系数就会控制AD转换的快慢了。

这个芯片的I2C从机地址:1101000(AD0=0),1101001(AD0=1

AD0就是板子引出来的一个引脚,可以调节I2C从机地址的最低位。这里地址是七位的,如果像这样用二进制来表示的话,一般没啥问题。如果在程序中用十六进制表示的话,一般会有两种表示方式。

以这个1101000的地址为例,第一种就是单纯的把这七位的二进制转化为十六进制110 1000转换十六进制就是0x68。I2C通信的时序中第一个字节的高七位是从机地址,最低位是读写位。所以如果你认为0x68是从机地址的话,在发送第一个字节时,要先把0x68左移一位,即(0x68<<1),在按位或上读写位,读0写0。这是认为从机地址是0x68的操作。

但是还有另一种常见的表示方式,就是把x68左移位后的数据当做从机地址,0x68左移1位之后是0xD0,这时在实际发送第一个字节时,如果你要写,就直接把0xD0当做第一个字节。如果你要读,就把0xD0或上0x01,即0xD1当做第一个字节。这种表示方式就不需要进行左移的操作了,或者说这种表示方式是把读写位也融入到了从机地址里来。

一般比较喜欢融入读写位的这种表示方式。所以在本节程序中,MPU6050的从机地址是0xD0。

我们接着继续来看一下硬件电路。

硬件电路

这里展示的就是MPU6050模块的原理图。

其中右边这个是MPU6050的芯片,左下角是一个八针的排针,左上角是一个LDO低压差线性稳压器。

右边这个MPU6050的芯片本身的引脚是非常多的,包括时钟,I2C这些通信引脚,供电、帧同步等等,不过这里有很多引脚我们都用不到。还有一些引脚是这个芯片最小系统里的固定连接,这个最小系统一般手册里都会有抄过来就行。

然后看左下角八针的排针引出来的各引脚功能

在这里可以看到,SCL和SDA模块已经内置了两个4.7K的上拉电阻了。所以在我们接线的时候,直接把SCL和SDA接在GPIO口就行了,不需要再在外面另外接上来电阻了。

XCL、XDA这两个是芯片里面的主机I2C通信引脚设计这两个引脚是为了扩展芯片功能。之前我们说过MPU6050是一个六轴姿态传感器。但是只有加速度计和陀螺仪的六个轴融合出来的姿态角是有缺陷的。这个缺陷就是绕z轴的角度,也就是偏航角,它的漂移无法通过加速度计进行修正。这像是让你坐在车里,不看任何窗户,然后让你辨别当前车子的行驶方向。短时间内,可以通过陀螺仪得知方向的变化,从而确定变化后的行驶方向。但是时间一长,车子到处转弯,没有稳定的参考了,就肯定会迷失方向。所以这时候你就要带个指南针在身边,提供长时间的稳定偏航角进行参考来对陀螺仪感知的方向进行纠正。就是九轴姿态传感器多出的磁力计的作用。另外如果要制作无人机,需要定高飞行,这时候就还需要增加气压计,扩展为10轴提供一个高度信息的稳定参考。所以根据项目要求这个六轴传感器可能不够用需要进行扩展这个时候这个XCL、XDA就可以起作用了XCL和XDA通常就是用于外接磁力计或者气压计。当接上磁力计或气压计之后,MPU6050的主机接口可以直接访问这些扩展芯片的数据。把这些扩展芯片的数据读取到MPU6050里面,在MPU6050里面会有DMP单元进行数据融合和姿态解算。

当然,如果不需要MPU6050的解算功能的话,可以把这个磁力计或者气压计直接挂载在SCL和SDA这条总线上。因为I2C 本来就可以挂载多设备,所以把多个设备都挂载在一起也是没问题的。

然后AD0引脚是从机地址的最低位,接低电平的话,七位从机地址就是1101000,接高电平的话,七位从机地址就是1101001。这里电路中可以看到有一个电阻默认弱下拉到低电平,所以引脚悬空的话,就是低电平。如果想接高电平,就可以把AD0直接引到VCC上拉至高电平。

最后一个引脚是INT,也就是中断输出引脚,可以配置芯片内部的一些事件来触发中断引脚的输出。比如数据准备好了,I2C主机错误等。另外,芯片内部还内置了一些实用的小功能。比如自由落体检测,运动检测,零运动检测等,这些信号都可以触发INT引脚产生电平跳变。需要的话可以进行中断信号的配置。当然如果不需要的话,也可以不配置,这个引脚也不需要用。这就是这些引脚的功能描述。

然后看一下左上角的这个LDO,这部分是供电的逻辑,在手册里可以查到。这个MPU6050芯片的VDD供电是2.375-3.46V,属于3.3V供电的设备,不能直接接5V。所以为了扩大供电范围,这个模块的设计者就加了个3.3V的稳压器。输入端电压VCC_5V可以在3.3V到5V之间,然后经过3.3V的稳压器输出稳定的3.3V电压给芯片端供电。

上面的电源指示灯只要3.3V端有电,电源指示灯就会亮,所以这一块需不需要可以根据项目要求来,如果已经有了稳定的3.3V电源了,就不再需要这一部分了。

以上就是这个模块的硬件电路分析。

我们本实验使用的时候直接VCC、GND接上电,SCLSDA接上I2C 通信的GPIO就行了。

MPU6050框图

然后继续我们再看一下这个芯片的模块框图,这个图就是整个芯片的内部结构。

其中左上角是时钟系统,有时钟输入角和输出角。不过我们一般使用内部时钟。

硬件电路里clockin直接接了GND, clockout没有引出,所以这部分不需要过多关心。

然后下面这些灰色的部分就是芯片内部的传感器。

其中包括xyz轴的加速度计,xyz轴的陀螺仪。另外这个芯片还内置了一个温度传感器,要是想用它来测量温度也是没问题的。这么多传感器本质上也都相当于可变电阻,通过分压后输出模拟电压,然后通过ADC进行模数转换。转化完成之后,这些传感器的数据统一都放到数据寄存器中。我们读取数据寄存器就能得到传感器测量的值了。

这个芯片内部的转换都是全自动进行的。就类似我们之前学的AD连续转换+DMA转运,每个ADC输出,对应十六位的数据寄存器,不存在数据覆盖的问题。我们配置好转换频率之后,每个数据就自动以我们设置的频率刷新到数据寄存器,我们需要数据的时候直接来读就行了,其他的都不用管。

这每个传感器都有个自测单元,这部分是用来验证芯片好坏的。

当启动自测后,芯片内部就会模拟一个外力施加在传感器上,这个外力导致传感器数据会比平时大一些。如何进自测我们可以先使自测读取数据再失能自测读取数据两个数据相减得到的数据叫自测响应。这个自测响应芯片手册里给出来一个范围,如果自测响应在这个范围内,就说明芯片没问题。如果不在,就说明芯片可能坏了,使用的时候就要小心点。

然后下面这个东西是电荷泵或者叫充电泵。

CPOUT引脚需要外接一个电容。什么样的电容?在这个手册里有说明。电荷泵是一种升压电路,在其他地方也有出现过,比如我们用的这个OLED屏幕,里面就有电荷泵进行升压。电荷泵的升压原理大家了解一下,比如有个电池,电压是5V,然后再来个电容。电池和电容并联,电池给电容充电,充满之后,电容也相当于一个5V的电池

然后,再修改电路的接法,把电池和电容串联起来,电池5V,电容也是5V,这样输出就是十伏的电压,就把电池电压升高至两倍

不过由于这个电容电荷比较少,用一下就不行了。所以这个并联串联的切换速度要快,趁电容还没放电完,就要及时并联充电。这样一直持续并联充电串联放电,并联充电串联放电,然后后续再加一个电源滤波,就能进行平稳的升压了。这个是电荷泵的升压原理。

这里由于陀螺仪内部是需要一个高电压支持的,所以这里设计了一个电荷泵进升压。当然这个升压过程是自动的,不需要我们管了,解一下即可。

然后右边这一大块就是寄存器和通信接口部分。

中断状态寄存器interrupt status Register可以控制内部的哪些事件到中断引脚的输出;

FIFO是先入先出寄存器,可以对数据流进行缓存,我们本节暂时不用;

配置寄存器Config Register可以对内部的各个电路进行配置;

传感器寄存器Sensor Register也就是数据寄存器,存储了各个传感器的数据;

工厂校准Factory Calibration意思就是内部的传感器都进行了校准,我们不用了解;

然后右边数字运动处理器Digital Motion Processor,简称DMP,是芯片内部自带的一个姿态解算的硬件算法。配合官方的DMP库可以进行姿态解算,因为姿态结算还是比较难的,而且算法也很复杂。所以如果使用了内部的DMP进行姿态解算,姿态解算就会方便一些。当然我们本节学习I2C通信这一块暂时不涉及。

这个FSYNC是帧同步,我们用不到。

这块就是通信接口部分:

上面一部分就是从机的I2C 和SPI通信接口用于和STM32通信

下面这一部分是主机的I2C 通信接口,用于和MPU6050扩展的设备进行通信。

这里有个接口旁路选择器Serial Interface Bypass Mux,就是一个开关。如果拨到上面,辅助的I2C的引脚就和正常的Aux_CL引脚接到一起,这样两路总线就合在一起了,STM32可以控制所有设备,这时STM32就是大哥,MPU6050和这个扩展设备都是STM32的小弟。

如果拨到下面,辅助的I2C引脚就由MPU6050控制,两条I2C总线独立分开。这时STM32是MPU6050的大哥,MPU6050又是扩展设备的大哥。

如果使用的话,可以再详细研究,我们本节课程不会用到这个扩展功能。

最后下面这里是供电的部分,按照手册里的电压要求和参考电路来接线就行了。

以上这些就是这整个MPU6050芯片的结构。

接下来看一下两个手册。

PS产品说明书和RM寄存器映像手册

这个芯片有两份手册需要研究,一个是PS产品说明书,另一个是RM寄存器映像。

文档领取链接:https://pan.baidu.com/s/16EHCEkwfOb8jaOPs937siw

提取码:v02x

当我们需要了解芯片的原理参数和硬件电路的时候,就需要参考产品说明书,也就是上面PS那份文档。这里面讲的是芯片的功能概括,以及电路的大体工作流程。要想学好这个芯片,这两个手册都是要从头到尾看一遍的。

PS产品说明书

这个表给出的就是MPU6000和MPU6050的差异。

总结下来就是两点:

一是MPU6050有一个独立的逻辑电源引脚VLOGIC,可以支持供电和IO口不一样的电平等极,而MPU6000没有。

二是MPU6000,同时支持I2C和SPI通信接口,而MPU6050仅支持I2C。

其他部分基本都是一样的。

接下来看看芯片的时钟系统,这个芯片的时钟可以由这些时钟源提供:

第一个是内部晶振,可以作为系统时钟;

第二个是XYZ轴的陀螺仪,它们也都会有个晶振,因为陀螺仪内部需要高精度时钟的支持,所以陀螺仪内部也有独立的时钟,这三个时钟也可以输出,作为系统时钟;

第三个是可以通过外部的CLKIN引脚,输入32.768KHz的方波,或者19.2MHz的方波作为系统时钟。不过这个外部时钟还需要额外的电路,比较麻烦。

如果不是特殊要求的话,我们一般使用内部晶振或者内部陀螺仪的晶振,作为系统时钟

然后这些是可选的中断信号

可以配置发生表格中这些事件时,在INT引脚输出一个电平跳变,然后STM32可以用外部中断来接收这个跳变,这样中断信号就可以通过STM32的CPU了。

然后我们继续看一下这个寄存器映像的手册

RM寄存器映像

在寄存器映像这份文档上面有个总表,就是这个芯片内部所有的寄存器以及它们的地址。然后剩下的内容就是这个总表中每个寄存器以及寄存器中每一位的详细解释。

所以这个寄存器映像的手册就相当于STM32参考手册里面的寄存器描述。当我们写代码实际操作引脚的时候,寄存器描述就是必不可少的。因为寄存器描述里都是实实在在的实现细节。

但是这个表格我们不需要全都了解,简单应用的话,了解其中一部分就行了。

在这里需要了解的就是黄色标记标出来的,其他的暂时可以不看。

第一列是寄存器的地址,十六进制表示的;

第二列是寄存器的地址,十进制表示的;

第三列是寄存器的名称;

第四列是读写权限,rw代表可读可写,r代表只读。

后面其他是寄存器内的每一位的名字,每个寄存器都是八位的。

我们需要了解的是采样频率分频器、配置寄存器、陀螺仪配置寄存器、加速度计配置寄存器

 

然后下面这一大块是数据寄存器,包括加速度计xyz轴、温度传感器、陀螺仪xyz轴的数据。

-L表示低八位,_H表示高八位。

最后是电源管理寄存器1和电源管理寄存器2,WHO_AM_I我是谁,也就是器件ID号。

采样频率分频器

第一个采样频率分频器,里面的八位为一个整体,作为分频值。这个寄存器可以配置采样频率的分频系数,简单来说就是分频越小内部的AD转换就越快。数据寄存器刷新就越快反之就越慢。这里有个公式采样频率可以理解为数据刷新率等于陀螺仪输出时钟频率除(1+分频值)这个时钟,就是我们刚才说的几个时钟源:内部晶振、陀螺仪晶振和外部时钟引脚的方波,这里直接是以陀螺仪晶振作为例子的。陀螺仪时钟/这个寄存器指定的分频系数就是采样频率。下面有个注意事项,不使用低通滤波器时,陀螺仪时钟为8KHz,使用滤波器,时钟就是1000Hz。

配置寄存器

第二个是配置寄存器,内部有两部分:外部同步设置和低通滤波器配置。

这个外部同步不用可以不看。

然后是低通滤波器,配置这些位可以选择这里的各种滤波参数。这个低通滤波器可以让输出数据更加平缓配置滤波器参数越大输出数据抖动就越小。0是不使用低通滤波器,陀螺仪时钟为8KHz。之后使用了滤波器,陀螺仪时钟就是1000Hz。

然后这个最大的参数是保留位,没有用到。

陀螺仪配置寄存器

高三位是xyz轴的自测使能位,中间两位是满量程选择位,后面三位没用到。

这里有个公式,自测响应=自测使能时的数据-自测失能时的数据。我们上电后先使能自测,读取数据,在失能自测读取数据,两者相减得到自测响应。

这个手册里有自测响应的范围,如果在这个范围里,芯片就通过了自测,之后正常使用即可。

然后是满量程选择,可以选择这四种,量程越大,范围越广,量程越小分辨率越高。

接着下面是加速度计配置寄存器

加速度计配置寄存器

高三位是自测使能位,中间两位是满量程选择,最后三位是配置高通滤波器的。这个高通滤波器就是内置小功能,运动检测用到的,对数据输出没有影响,我们暂时用不到。

满量程选择:

数据寄存器

加速度计的数据寄存器,想读取数据的话,直接读取数据寄存器就行了。

这是一个十六位的有符号数,以二进制补码的方式存储。我们读出高八位和低八位,高位左移八次或上低位数据。最后再存在一个int16_t的变量里,这样就可以得到数据了。

温度传感器数据,陀螺仪数据都是一样的操作方法。

电源管理寄存器1

电源管理寄存器1,Bit7设备复位,这一位写1,所有寄存器都恢复到默认值。

Bit6睡眠模式,这一位写1,芯片睡眠,芯片不工作,进入低功耗。

Bit5循环模式这一位写1,设备进入低功耗(这个模式比较省电),过一段时间启动一次,并且唤醒的频率由下一个寄存器的这两位确定:

然Bit3温度传感器使能写1之后,禁用内部的温度传感器。

最后三位Bit2,Bit1,Bit0用来选择系统时钟来源,下面有个表

分别是内部晶振、xyz轴陀螺仪晶振、外部引脚的两个方波。和我们之前介绍的时钟源一样,一般我们选择内部晶振或者陀螺仪晶振。不过这里有句话:非常建议我们选择陀螺仪的晶振。因为陀螺仪的晶振更加精确。

电源管理寄存器2

然后下面是电源管理寄存器2,前两位刚才说过了。后面六位可以分别控制六个轴进入待机模式。如果你只需要部分轴的数据,可以让其他轴待机,这样比较省电。

器件ID号

最后一个寄存器就是ID号,这个寄存器是只读的,ID号不可修改。ID号中间这六位固定为110100。

实际上这个ID号就是这个芯片的I2C 地址它的最高位和最低位其实都是零。读出这个寄存器,值就固定为0x68。然后这里有句话,AD0引脚的值并不反映在这个寄存器上。

之前我们说过这个I2C的地址可以通过AD0引脚进行配置。但是这里的ID号的最低位是不随AD0引脚的变化而变化的,读出ID号始终都是0x68。当然这个ID号也不是非要和I2C地址一样,只是他这样设计的而已。

最后再看一下这里有句话:写的是所有的寄存器上电默认值都是0x00,除了下面这两个:107号寄存器上电默认0x40,117号寄存器上电默认0x68。

117号就是ID号默认0x68。107是电源管理寄存器1默认0x40,也就是次高位为1,这里次高位是sleep,所以这个芯片上面默认就是睡眠模式。我们在操作它之前要先记得解除睡眠,否则操作其他静止器是无效的。

本节有关MPU6050的内容到这里就差不多了,我们接下来就是实现I2C的通信,然后读写刚刚讲的这些寄存器来操控MPU6050。

QQ交流群:963138186

本篇就到这里,下篇继续!欢迎点击下方订阅本专栏↓↓↓

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;