从MPU6050看传感器原始数据的处理方式-位运算

乐活   2024-12-29 19:21   内蒙古  

嵌入式里面最难的是什么?我想不是初始化,也不是一个逻辑,而是使用位运算来处理数据。

还有什么?对寄存器的设置,某一位,连着好几个,等等的。

我以前一直不知道这个寄存器的概念到底在哪里?

直到,昨天看了一晚上的数字电路的教程,救命,原来这么多内容这么系统,科班出生可能就这点好了,虽然没学会,但是也是系统的学到了知识。

看的这个版本,一板一眼的,硬死了

其实这个描述也极其的少,让我再补充一点吧!

一个寄存器可以看作是一个由多个触发器组成的存储单元。每个触发器可以存储一位二进制数据(0或1)。

寄存器的位数决定了它能存储数据的范围。例如,一个8位寄存器可以存储0到255之间的整数。

寄存器 是计算机处理器内部用来临时存储数据的存储单元。你可以把它想象成计算机大脑中的一个小小抽屉,用来存放一些常用的数据,比如要进行运算的数字、指令的地址等等。

  1. 高速存储: 寄存器的存取速度非常快,远快于内存。这是因为寄存器距离CPU核心非常近,数据传输的路径短,延迟小。

  2. 临时存储: 寄存器用来存储CPU正在处理的数据,比如正在执行的指令、运算中的数据等。

  3. 控制单元: 一些寄存器还用于控制CPU的工作状态,比如程序计数器(PC)用来记录下一条指令的地址。


寄存器最本真的含义可能就是寄存两个字了

就是放一些东西

根据寄存器的用途,可以分为以下几种:

  1. 通用寄存器: 可以用来存储各种类型的数据,如整数、浮点数、地址等。

  2. 专用寄存器: 有特定的用途,如程序计数器(PC)、指令寄存器(IR)、栈指针寄存器(SP)等。


OK~我们来看一个人人皆知的器件MPU6050:

6个ADC的数据存到这个传感器寄存器里面,接着到IIC里面,传出去。

以及这个器件也可以在级联一个IIC的输入,Bypass IIC-旁路IIC

这个就是需要读取的地方,可以看着连在一起

来看一个ACC的

重力加速度的参数范围

3个16位来描述

好,我偷的

接下来看代码:

不管如何设置,我们最终就要获得这6个轴的数据

在代码中:

(MPU6050_Raw_Data[x] << 8) | MPU6050_Raw_Data[y]) 

的位运算用于将从MPU6050读取的两字节数据组合成一个16位的有符号整数值。

这是因为MPU6050的加速度计和陀螺仪数据是以16位的格式存储的,每个测量值分为高字节和低字节,分别存储在两个连续的寄存器中。

 (MPU6050_Raw_Data[x] << 8)将高字节左移8位。将高字节放到16位数据的高8位位置。


箭头就是移动方向,往高处放,挪8下。

假设高字节 MPU6050_Raw_Data[x] = 0x1A,二进制为 00011010。左移 8 位后,结果为 00011010 00000000,即 0x1A00

16位数据 = (高字节 << 8) | 低字节

<< 8 (左移操作)将高字节的值左移8位,为低字节腾出位置。

将高字节放到16位整数的高8位。高字节 0x1A 左移 8 位后:0x1A << 8 = 0x1A00

<< 就是移动的意思,就好像移动格子一样,把靠左的东西移动到右边。现在就是16位的格子,满了8个,右边还剩8个,怎么办呢?就是或运算吧。

| MPU6050_Raw_Data[y]通过按位或操作,将低字节合并到高字节后面。

组合高字节和低字节形成完整的16位数据。移动了

假设低字节 MPU6050_Raw_Data[y] = 0x2B,二进制为 00101011高字节左移后的结果为 0x1A00,低字节为 0x002B按位或操作:0x1A00 | 0x002B = 0x1A2B

| (按位或操作),将低字节合并到高字节之后。将高字节和低字节拼接成一个完整的16位数据。


高字节结果 0x1A00 和低字节 0x002B 进行按位或操作:0x1A00 | 0x002B = 0x1A2B

组合后的16位值是一个有符号整数在读取时,需要根据最高位(符号位,bit 15)判断正负。

左移 (<<) 和按位或 (|) 是位操作中常用的组合,用于拼接高低字节。

  1. 置位:将指定位置为 1。通过 | 运算保证其他位不变。
  2. 清位:将指定位清为 0。使用 ~ 生成掩码,结合 & 清除目标位。
  3. 翻转位:通过 ^ 运算改变目标位的状态。
  4. 读取位:通过右移和按位与,提取目标位的值。

云深之无迹
纵是相见,亦如不见,潇湘泪雨,执念何苦。
 最新文章