0%

stm32进阶(1)

Main Takeaway

Following robomaster C型板教程文档来进一步学习stm32

陀螺仪模块以及加速度计模块是常用传感器,用于姿态解算以及云台速度环控制。 本文介绍了 BMI088 六轴 IMU 模块,以及如何通过 SPI 协议对其进行驱动并读取数据。

前言

现在我们是在MEMS时代。现在我们是在MEMS时代。

  • 微的:因为所有尺寸都在千分尺范围内
  • 电:因为我们在里面有电极来制造电容器,它们形成了电气系统
  • 机械:我们的质量和弹簧形成了机械系统
  • 系统:它们一起组成一个系统,服务于一个特定的目的,在我们的例子中是测量加速度。

BMI088传感器

BMI088 传感器是一个六轴惯性测量单元 (IMU),能够应用于机器人上的姿态解算,该款 6 轴传感器在 3 x 4.5 x 0.95mm³小尺寸 LGA 封装中集成了 16 位 ADC 精度的三轴陀螺仪和三轴加速度计

对于IMU的科普可以看看这篇文章:

IMU传感器,你所需要知道的全部 - 知乎 (zhihu.com)

陀螺仪

陀螺仪是测量角速度的传感器,是 IMU 的重要组成部分。陀螺仪能测量在三个正交方向上旋转的角速度,也可以用于估算在三个方向上的旋转角度。

陀螺仪有许多种类,不同的陀螺仪一般基于不同的工作原理,能够达到的精度也不一样,市场上最常用的微机电(MEMS)陀螺仪的基本原理是利用旋转时产生的科里奥利力引发电容的变化,从而将旋转的角速度转化为电信号。

加速度计

加速度计能够测量三个正交方向上的加速度。 MEMS 加速度计原理是利用加速度变化使内部质量块产生的力发生变化,从而改变电容大小,转化为电信号。

当物体静止时,加速度计测量重力加速度在三个正交方向上的分量,配合陀螺仪的角速度信息可以解算出物体的空间位姿

协议

BMI088 支持 SPI 协议和 I2C 协议,通过 PS 引脚(pin select)的电平状态决定是 SPI 协议或者 I2C 协议,

  • PS接GND:使用SPI模式
  • PS接VDD:使用IIC模式

当 BMI088 使用 SPI 协议时,各个管脚的功能可见下表:

管脚功能
CSB1, CSB2连接 SPI 片选信号线,低电平有效; CSB1 用于选中加速度计, CSB2用于选中陀螺仪。
PS模式选择引脚,连接低电平时 BMI088 工作于 SPI 模式
SCK连接 SPI 时钟线
SDI数据输入 BMI088
SDO1BMI088 输出加速度数据
SDO2BMI088 输出角速度数据
INT1, INT2发送加速度数据时产生中断信号
INT3, INT4发送角速度数据时产生中断信号

寄存器

BMI088 中包含了用于控制陀螺仪,加速度计以及通讯接口的控制寄存器,存储传感器数据的数据寄存器以及存储传感器 ID 的寄存器

当要进行通讯时,首先读取 ID 寄存器,确认 ID 正确之后,先往控制寄存器中写入数据,设置传感器的工作状态,然后再从数据寄存器中进行数据的读取。

为了验证加速度计和陀螺仪工作正常,需要读取它们各自的 ID 寄存器, ID 寄存器内存有特定的 ID 值,用户可以将读取到的寄存器值和标准 ID 值进行对比。

数据读取

1
BMI088_accel_read_muli_reg();

读取加速度数据时,首先通过BMI088_accel_read_muli_reg 函数,片选信号选中加速度计然后用 SPI 将加速度计数据寄存器中的数据读入 buf 中,按照高八位和低八位完成数据的拼接。

1
BMI088_gyro_read_muli_reg();

读取角速度数据时,首先通过 BMI088_gyro_read_muli_reg 函数,片选信号选中陀螺仪,然后用 SPI 将角速度计的 ID 和数据寄存器中的数据读入 buf。检测 ID 正确后,将数据按照高八位和低八位进行拼接

其中 BMI088_accel_read_muli_reg 和 BMI088_gyro_read_muli_reg 调用了 HAL 库的 SPI通信函数 HAL_SPI_TransmitReceive

Tips:进行数据拼接的时候记得查看BMI088寄存器的介绍

陀螺仪数据处理(BMI088)_lilei668的博客-CSDN博客

SPI协议

SPI协议详解(图文并茂+超详细) - 知乎 (zhihu.com)

简介

SPI 协议是摩托罗拉公司开发的一种高速的,全双工,同步的通信总线,使用四根线进行通信,具有简单易用,通讯速度高的特点。 SPI 总线上可以挂载多个设备,这些设备被区分成主设备(Master)和从设备(Slave),主设备通过时钟线和片选线对从设备进行控制。

SPI 协议所使用到的引脚及其功能见下表:

名称功能
SCK (Serial Clock)SPI 是一种同步通信总线协议, 主设备通过 SCK 向各个从设备提供时钟信号
SDI (Serial Data Input) /MISO (Master In Slave Out)SPI 的数据线之一,传输方向为从设备发出数据,主设备接收
SDO (Serial Data Output) /MOSI (Master Out Slave In)SPI 的数据线之一,传输方向为主设备发出数据,从设备接收
SS (Slave Select) /CS (Chip Select)SPI 的片选线,主设备通过片选线控制从设备的工作状态,选中需要通信的目标

原理

使用 SPI 进行通信时,各个设备的时钟引脚一起挂载在 SCK 线上,主设备的输入和各个从设备的输出连接 MISO/SDI,主设备的输出和各个从设备的输入连接 MOSI/SDO,同时主设备的 GPIO 口连接各个从设备的 CS

Tips:片选信号CS(chip select),SS(Slave Select)

image-20230911163450466

SPI 的时序规定了不同的工作模式,如下表所示:

工作模式配置值模式
CPOL 空闲时钟电平0时钟空闲时为低电平
1时钟空闲时为高电平
CPHA 边沿采样位置0第一个边沿采样数据
1第二个边沿采样数据
image-20230911163747659

当主设备和从设备通信时,双方内部同时使用一个移位寄存器进行数据的存储和发送,每当主设备(从设备)完成一位发送的同时,移位寄存器进行一位的移位,并将接收到的数据存储入移位产生的新空间内,这样双方就可以同步同时的完成数据收发

时钟极性 CKP/Clock Polarity

除了配置串行时钟速率(频率)外,SPI主设备还需要配置时钟极性

根据硬件制造商的命名规则不同,时钟极性通常写为CKPCPOL。时钟极性和相位共同决定读取数据的方式,比如信号上升沿读取数据还是信号下降沿读取数据;

CKP可以配置为1或0。这意味着您可以根据需要将时钟的默认状态(IDLE)设置为高或低。极性反转可以通过简单的逻辑逆变器实现。您必须参考设备的数据手册才能正确设置CKP和CKE。

  • CKP = 0:时钟空闲IDLE为低电平 0
  • CKP = 1:时钟空闲IDLE为高电平1

时钟相位 CKE /Clock Phase (Edge)

除配置串行时钟速率和极性外,SPI主设备还应配置时钟相位(或边沿)。根据硬件制造商的不同,时钟相位通常写为CKECPHA

顾名思义,时钟相位/边沿,也就是采集数据时是在时钟信号的具体相位或者边沿;

  • CKE = 0:在时钟信号SCK的第一个跳变沿采样;
  • CKE = 1:在时钟信号SCK的第二个跳变沿采样;

下图总结了所有时钟配置组合,并突出显示了实际采样数据的时刻;

其中黑色线为采样数据的时刻; 蓝色线为SCK时钟信号;

img
image-20231022113718449

通信过程

SPI 的通信过程如下:

  1. 主设备将要进行通讯的从设备的 SS/CS 片选拉低,(选中要通信的设备,其他未被选中的从设备不参与此次通信)

  2. 主设备通过 SCK 向从设备提供同步通讯所需要的时钟信号,

  3. 主设备通过 MOSI 向从设备发送 8 位数据,同时通过 MISO 接收从设备发来的 8位数据。

  4. 通信结束,主设备拉高 SS/CS 片选。

SPI 在 cubeMX 中的配置

  1. 首先在 Connectivity 标签页下选中 SPI1,进入 SPI1 的配置页面
  2. 在 Mode 页面中,将模式选择为 Full-Duplex Master,即让 stm32 工作在全双工 SPI下,作为主机使用,将硬件片选信号 Hardware NSS Signal 设为 Disable
  3. 在 configuration 页面中,进行如下配置:
image-20230911142659163
参数功能
Frame Format设置 SPI 帧格式,可选 Motorola(摩托罗拉)格式和TI(德州仪器)格式
Data Size一帧中的数据长度,一般选为 8bit
First Bit发送时先发最高位 MSB 还是最低位 LSB
Prescaler总线分频值,设置 SPI 的通讯时钟频率
Clock Polarity & Clock Phase用于设置 SPI 的时序功能
CRC CalculationCRC 校验计算功能
NSS Signal Type片选信号类型

在 cube 中,可以再 Connectivity 中找到 SPI 的外设,将模式选择为全双工的主节点,片选信号的模式我们选择为软件修改的形式,即需要在程序中自行调用函数拉高或者拉低引脚的电平。时钟的分频值我们选择为16,需要使得通信的波特率低于从设备允许的最高波特率。同时 SPI 中还需要设置时钟极性以及相位,总共有4中情况。

以上部分的设置均要根据从设备的情况设置。

References