🚀write in front🚀
🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝💬本系列哔哩哔哩江科大STM32的视频为主以及自己的总结梳理📚
🚀Projeet source code🚀
💾工程代码放在了本人的Gitee仓库:iPickCan (iPickCan) - Gitee.com
引用:
STM32入门教程-2023版 细致讲解 中文字幕_哔哩哔哩_bilibili
Keil5 MDK版 下载与安装教程(STM32单片机编程软件)_mdk528-CSDN博客
STM32之Keil5 MDK的安装与下载_keil5下载程序到单片机stm32-CSDN博客
0. 江协科技/江科大-STM32入门教程-各章节详细笔记-查阅传送门-STM32标准库开发_江协科技stm32笔记-CSDN博客
【STM32】江科大STM32学习笔记汇总(已完结)_stm32江科大笔记-CSDN博客
江科大STM32学习笔记(上)_stm32博客-CSDN博客
STM32学习笔记一(基于标准库学习)_电平输出推免-CSDN博客
STM32 MCU学习资源-CSDN博客
stm32学习笔记-作者: Vera工程师养成记
stem32江科大自学笔记-CSDN博客
术语:
英文缩写 | 描述 |
GPIO:General Purpose Input Onuput | 通用输入输出 |
AFIO:Alternate Function Input Output | 复用输入输出 |
AO:Analog Output | 模拟输出 |
DO:Digital Output | 数字输出 |
内部时钟源 CK_INT:Clock Internal | 内部时钟源 |
外部时钟源 ETR:External Trigger | 时钟源 External 触发 |
外部时钟源 ETR:External Trigger mode 1 | 外部时钟源 External 触发 时钟模式1 |
外部时钟源 ETR:External Trigger mode 2 | 外部时钟源 External 触发 时钟模式2 |
外部时钟源 ITRx:Internal Trigger inputs | 外部时钟源,ITRx (Internal trigger inputs)内部触发输入 |
外部时钟源 TIx:exTernal Input pin | 外部时钟源 TIx (external input pin)外部输入引脚 |
CCR:Capture/Comapre Register | 捕获/比较寄存器 |
OC:Output Compare | 输出比较 |
IC:Input Capture | 输入捕获 |
TI1FP1:TI1 Filter Polarity 1 | Extern Input 1 Filter Polarity 1,外部输入1滤波极性1 |
TI1FP2:TI1 Filter Polarity 2 | Extern Input 1 Filter Polarity 2,外部输入1滤波极性2 |
DMA:Direct Memory Access | 直接存储器存取 |
正文:
0. 概述
从 2024/06/12 定下计划开始学习下江协科技STM32课程,接下来将会按照哔站上江协科技STM32的教学视频来学习入门STM32 开发,本文是视频教程 P2 STM32简介一讲的笔记。
1.🚚MP6050
本节来研究一下MPU6050的芯片
2.🚚MPU6050简介
MPU6050是一个6轴姿态传感器,可以测量芯片自身X、Y、Z轴的加速度、角速度参数,要这么多轴的信息是要干啥?可以通过数据融合,可进一步得到姿态角(或者叫做欧拉角),常应用于平衡车、飞行器等需要检测自身姿态的场景。
什么是6轴姿态传感器?
什么是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的参数。
3.🚚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。
我们接着继续来看一下硬件电路。
4.🚚硬件电路
这里展示的就是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单元进行数据融合和姿态解算。