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 |
| SDO1 | BMI088 输出加速度数据 |
| SDO2 | BMI088 输出角速度数据 |
| 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)

SPI 的时序规定了不同的工作模式,如下表所示:
| 工作模式 | 配置值 | 模式 |
|---|---|---|
| CPOL 空闲时钟电平 | 0 | 时钟空闲时为低电平 |
| 1 | 时钟空闲时为高电平 | |
| CPHA 边沿采样位置 | 0 | 第一个边沿采样数据 |
| 1 | 第二个边沿采样数据 |

当主设备和从设备通信时,双方内部同时使用一个移位寄存器进行数据的存储和发送,每当主设备(从设备)完成一位发送的同时,移位寄存器进行一位的移位,并将接收到的数据存储入移位产生的新空间内,这样双方就可以同步同时的完成数据收发
时钟极性 CKP/Clock Polarity
除了配置串行时钟速率(频率)外,SPI主设备还需要配置时钟极性。
根据硬件制造商的命名规则不同,时钟极性通常写为CKP或CPOL。时钟极性和相位共同决定读取数据的方式,比如信号上升沿读取数据还是信号下降沿读取数据;
CKP可以配置为1或0。这意味着您可以根据需要将时钟的默认状态(IDLE)设置为高或低。极性反转可以通过简单的逻辑逆变器实现。您必须参考设备的数据手册才能正确设置CKP和CKE。
CKP = 0:时钟空闲IDLE为低电平0;CKP = 1:时钟空闲IDLE为高电平1;
时钟相位 CKE /Clock Phase (Edge)
除配置串行时钟速率和极性外,SPI主设备还应配置时钟相位(或边沿)。根据硬件制造商的不同,时钟相位通常写为CKE或CPHA;
顾名思义,时钟相位/边沿,也就是采集数据时是在时钟信号的具体相位或者边沿;
CKE = 0:在时钟信号SCK的第一个跳变沿采样;CKE = 1:在时钟信号SCK的第二个跳变沿采样;
下图总结了所有时钟配置组合,并突出显示了实际采样数据的时刻;
其中黑色线为采样数据的时刻; 蓝色线为SCK时钟信号;


通信过程
SPI 的通信过程如下:
主设备将要进行通讯的从设备的 SS/CS 片选拉低,(选中要通信的设备,其他未被选中的从设备不参与此次通信)
主设备通过 SCK 向从设备提供同步通讯所需要的时钟信号,
主设备通过 MOSI 向从设备发送 8 位数据,同时通过 MISO 接收从设备发来的 8位数据。
通信结束,主设备拉高 SS/CS 片选。
SPI 在 cubeMX 中的配置
- 首先在 Connectivity 标签页下选中 SPI1,进入 SPI1 的配置页面
- 在 Mode 页面中,将模式选择为 Full-Duplex Master,即让 stm32 工作在全双工 SPI下,作为主机使用,将硬件片选信号 Hardware NSS Signal 设为 Disable
- 在 configuration 页面中,进行如下配置:

| 参数 | 功能 |
|---|---|
| Frame Format | 设置 SPI 帧格式,可选 Motorola(摩托罗拉)格式和TI(德州仪器)格式 |
| Data Size | 一帧中的数据长度,一般选为 8bit |
| First Bit | 发送时先发最高位 MSB 还是最低位 LSB |
| Prescaler | 总线分频值,设置 SPI 的通讯时钟频率 |
| Clock Polarity & Clock Phase | 用于设置 SPI 的时序功能 |
| CRC Calculation | CRC 校验计算功能 |
| NSS Signal Type | 片选信号类型 |
在 cube 中,可以再 Connectivity 中找到 SPI 的外设,将模式选择为全双工的主节点,片选信号的模式我们选择为软件修改的形式,即需要在程序中自行调用函数拉高或者拉低引脚的电平。时钟的分频值我们选择为16,需要使得通信的波特率低于从设备允许的最高波特率。同时 SPI 中还需要设置时钟极性以及相位,总共有4中情况。
以上部分的设置均要根据从设备的情况设置。
References
robomaster C型板教程文档