任务介绍
Make Blocks第三期选择的任务是设计一款IMU模块,可实现至少三轴的数据检测,例如加速度计、陀螺仪、磁力计等,本次是在上一版的基础上进行升级,上一版的扩展板只有一个实时时钟,这一次把IMU模块内容加进去,本次选择的是ST的一款IMU运动传感器。
设计思路
目前的要求是设计一款IMU模块,由于想要和前面的模块可以关联上,这次我们通过在CubeMX中找到对应的IIC接口,然后在这个基础上进行的,使用的依然是和之前兼容的结构,选择一款三轴或者六轴的传感器都是挺方便的。
为了和之前的模块能够关联这次是在上一次的基础上进行的增加,增加的就是目前的三轴/六轴传感器,接口依然是满足LaunchPad接口需求的,使用两个2*10的排母进行外接。
设计框图如下:
功能介绍
本次设计的是一个六轴传感器,通过IIC接口进行通信控制,可以输出accelData和gyroData数据。
硬件介绍
本次设计的扩展模块主要增加的是ST的LSM6DSV16XTR,LSM6DSV16XTR是意法半导体(ST)推出的一款高性能、低功耗的6轴惯性测量单元(IMU),集成了3轴数字加速度计和3轴数字陀螺仪,专为高端应用场景设计。该芯片采用三通道架构,支持用户界面(UI)、电子防抖(EIS)和光学防抖(OIS)三路独立数据处理,每路均配备专用配置、处理及滤波功能,确保多任务场景下的性能优化。其核心优势在于低功耗设计与嵌入式智能功能的结合,在组合高性能模式下功耗仅0.65mA,实现“常开”体验,适合可穿戴设备等对续航要求高的场景。技术参数方面,LSM6DSV16XTR提供多量程选择,加速度计量程为±2/±4/±8/±16g,陀螺仪则支持±125/±250/±500/±1000/±2000/±4000dps,满足不同精度需求。接口协议兼容SPI、I²C及MIPI I3C® v1.1,辅以专用SPI用于OIS数据输出,确保与主处理器数据同步。芯片内置4.5KB智能FIFO,支持标准中断(如自由落体、唤醒、6D/4D方向检测等),并集成低功耗传感器融合算法(SFLP),可直接输出旋转矢量(四元数)、重力矢量及陀螺仪零偏,简化算法开发。
原理图和PCB模块介绍

原理图

PCB
本次在上一版的基础上增加了IMU模块,重点就是让各部分能够都集中在一块,本次设计的IMU模块主要是使用的是IIC的接口,并引出了一个INT状态输出,有助于我们后期调试的时候快速采集状态变化,及时响应数据。

实物图
软件调试
软件方面的调试工作主要是为了验证模块功能是否正常,这里我们选用最便捷的arduino来进行,加载的是SparkFun_LSM6DSV16X的库,确实很方便,驱动代码如下:
#include "SparkFun_LSM6DSV16X.h"
#include <Wire.h>
SparkFun_LSM6DSV16X myLSM;
// Structs for X,Y,Z data
sfe_lsm_data_t accelData;
sfe_lsm_data_t gyroData;
void setup()
{
Wire.begin();
Serial.begin(115200);
while (!Serial)
{
}
if (!myLSM.begin(LSM6DSV16X_ADDRESS_LOW))
{
Serial.println("Did not begin, check your wiring and/or I2C address!");
while (1)
;
}
// Reset the device to default settings. This if helpful is you're doing multiple
// uploads testing different settings.
myLSM.deviceReset();
// Wait for it to finish reseting
while (!myLSM.getDeviceReset())
{
delay(1);
}
Serial.println("Board has been Reset.");
Serial.println("Applying settings.");
// Accelerometer and Gyroscope registers will not be updated
// until read.
myLSM.enableBlockDataUpdate();
// Set the output data rate and precision of the accelerometer
myLSM.setAccelDataRate(LSM6DSV16X_ODR_AT_7Hz5);
myLSM.setAccelFullScale(LSM6DSV16X_16g);
// Set the output data rate and precision of the gyroscope
myLSM.setGyroDataRate(LSM6DSV16X_ODR_AT_15Hz);
myLSM.setGyroFullScale(LSM6DSV16X_2000dps);
// Enable filter settling.
myLSM.enableFilterSettling();
// Turn on the accelerometer's filter and apply settings.
myLSM.enableAccelLP2Filter();
myLSM.setAccelLP2Bandwidth(LSM6DSV16X_XL_STRONG);
// Turn on the gyroscope's filter and apply settings.
myLSM.enableGyroLP1Filter();
myLSM.setGyroLP1Bandwidth(LSM6DSV16X_GY_ULTRA_LIGHT);
Serial.println("Ready.");
}
void loop()
{
// Check if both gyroscope and accelerometer data is available.
if (myLSM.checkStatus())
{
myLSM.getAccel(&accelData);
myLSM.getGyro(&gyroData);
Serial.print("Accelerometer: ");
Serial.print("X: ");
Serial.print(accelData.xData);
Serial.print(" ");
Serial.print("Y: ");
Serial.print(accelData.yData);
Serial.print(" ");
Serial.print("Z: ");
Serial.print(accelData.zData);
Serial.println(" ");
Serial.print("Gyroscope: ");
Serial.print("X: ");
Serial.print(gyroData.xData);
Serial.print(" ");
Serial.print("Y: ");
Serial.print(gyroData.yData);
Serial.print(" ");
Serial.print("Z: ");
Serial.print(gyroData.zData);
Serial.println(" ");
}
delay(100);
}
运行效果
心得体会
本次通过最便捷的方式进行了一下IMU模块的功能验证,主要也是验证硬件是否可行,IMU传感器们基本上都是LGA封装的,有一定使用难度,不过接口相对来说还是比较简单的,感谢论坛和得捷对本次活动的大力支持,不断的让工程师接触更多的新知识。