lsm6ds3tr-c驱动-使用FIFO模式

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

使用lsm6ds3tr-c的内置FIFO模式读取加速度计数据
MCU:NRF52832
接口:I²C


一、芯片手册

FIFO中可以存储的数据种类包括:
三轴陀螺仪;三轴加速度计;外部传感器数据;步数;时间戳;温度
在这里插入图片描述

可选择的触发信号
加速度计或者陀螺仪数据就绪信号;外部传感器数据就绪信号;步数触发信号
在这里插入图片描述

五种模式
FIFO mode:满了就停了,不往里面写了
Continuous-to-FIFO mode:满了会自动丢掉旧数据
(别的模式没研究)
在这里插入图片描述

二、FIFO模式寄存器配置

FIFO控制相关寄存器

FIFO_CTRL1FIFO_CTRL2配置FIFIO中断触发阈值,样本数量到达所设阈值之后,触发中断,在INT1或者INT2引脚上产生中断信号,MCU收到中断信号做相应的处理。
FIFO_CTRL3 FIFO_CTRL4 FIFO_CTRL5配置FIFO模式、样本抽取参数、FIFO ODR等。

中断引脚配置
INT1_CTRL INT2_CTRL配置两个中断引脚被哪种事件触发。

在这里插入图片描述
在这里插入图片描述

FIFO状态和FIFO数据读取
在读取FIFO数据前,需要先读取FIFO_STATUS1FIFO_STATUS2来获取FIFO中可读的样本数量。

在这里插入图片描述

三、FIFO数据读取

1.寄存器定义

/*------------------------------------------------------------------------------
 Section: Macro Definitions
 ------------------------------------------------------------------------------*/	

#define LSM6DS3_WHO_AM_I                0X0F // 能读出ID,根据芯片不同而不同,可能是0x69,也或许是0x6a
#define LSM6DS3_CTRL1_XL                0X10 // 线性加速度传感器控制寄存器1 (r/w)。
/*  bit7						~						  bit0
	ODR_XL3 ODR_XL2 ODR_XL1 ODR_XL0 FS_XL1 FS_XL0 BW_XL1 BW_XL0
	其中:ODR_XL3 ODR_XL2 ODR_XL1 ODR_XL0 输出数据速率和电源模式选择
	FS_XL1 FS_XL0:ACC满量程选择
	BW_XL1 BW_XL0:抗混叠滤波器带宽选择。
*/
#define LSM6DS3_CTRL2_G                 0X11
/*  bit7						~			   bit0
	ODR_G3  ODR_G2 ODR_G1 ODR_G0 FS_G1  FS_G0 FS_125
	其中:ODR_G3  ODR_G2 ODR_G1 ODR_G0:陀螺仪输出速率选择
	FS_G1  FS_G0:陀螺仪满量程选择
	FS_125:陀螺仪满量程为125dps;	
*/
#define LSM6DS3_CTRL3_C                 0X12
/*  bit7						~			   bit0
	BooT BDU H_LACTIVE PP_OD SIM IF_INC BLE SW_RESET
	BooT:重启内存里的内容
	BDU:更新块数据
	H_LACTIVE:中断活跃水平
	PP_OD:INT1和INT2衬垫上的推拉/开式排水选择。
	SIM:SPI Serial interface mode select
	IF_INC:寄存器地址在进行串行多字节访问时自动增加
	BLE:大/小端数据选择
	SW_RESET:软件复位
*/
#define LSM6DS3_CTRL4_C                 0X13
/*  bit7						~			   bit0
	XL_BW_SCAL_ODR:加速度计带宽的选择;
	SLEEP_G:陀螺仪睡眠模式使能;
	INT2_on_INT1:所有中断信号在INT1上可用
	FIFO_TEMP_EN:使能稳如数据作为4th FIFO数据设置
	DRDY_MASK:数据读掩码使能;
	I2C_disable:disable i2c接口
	0
	STOP_ON_FTH:启用FIFO阈值级别使用;
*/
#define LSM6DS3_CTRL5_C                 0X14
/*
	ROUNDING2 ROUNDING1 ROUNDING0 0 ST1_G  ST0_G ST1_XL ST0_XL
	ROUNDING2 ROUNDING1 ROUNDING0:从输出寄存器中读取循环突发模式(舍入)。
	ST1_G  ST0_G:角速率传感器自检使能。
	ST1_XL ST0_XL:线性加速度传感器自检使能。
*/

#define LSM6DS3_CTRL6_C                 0X15
/*
	角速率传感器控制寄存器
	TRIG_EN LVLen LVL2_EN XL_HM_MODE 0 0 0 0
	TRIG_EN:陀螺仪数据边缘敏感触发启用。
	LVLen:陀螺仪数据电平敏感触发启用。
	LVL2_EN:陀螺仪电平敏感锁存使能。
	XL_HM_MODE:加速计高性能工作模式禁用.
*/
#define LSM6DS3_CTRL7_G                 0X16
/*
	角速率传感器控制寄存器7
	G_HM_MODE HP_G_EN HPCF_G1 HPCF_G0 HP_G_RST ROUNDING_STATUE 0 0
	G_HM_MODE:陀螺仪的高性能工作模式禁用
	HP_G_EN:陀螺数字高通滤波器使能。只有当陀螺仪处于HP模式时,才启用过滤器。
	HPCF_G1 HPCF_G0:陀螺仪高通滤波器截止频率选择。
	HP_G_RST:陀螺数字HP滤波器复位
	ROUNDING_STATUE:源寄存器四舍五入功能使能在1E,53,1B	
*/
#define LSM6DS3_CTRL8_XL                0X17
/*
	线性加速度传感器控制寄存器8 (r/w)。
	LPF2_XL_EN	HPCF_XL1 HPCF_XL0 0 0 HP_SLOPE_XL_EN 0 LOW_PASS_ON_6D
	LPF2_XL_EN: 加速度计低通滤波器LPF2选择。
	HPCF_XL1 HPCF_XL0:加速度计斜率滤波器和高通滤波器配置和截止设置。
		见表68。它还用于选择LPF2滤波器的截止频率,如表69所示。通过将CTRL8XL (17h)的LOW PASS ON 6D位设置为1,这种低通滤波器也可以用于6D/4D功能。
	HP_SLOPE_XL_EN:加速度计斜率滤波器/高通滤波器选择。
	LOW_PASS_ON_6D:低通滤波器对6D功能的选择。
*/
#define LSM6DS3_CTRL9_XL                0X18
/*
	0 0 Zen_XL Yen_XL Xen_XL SOFT_EN 0 0
	Zen_XL:加速计z轴输出启用。
	Yen_XL:加速计y轴输出启用。
	Xen_XL:加速计x轴输出启用.
	SOFT_EN:启用磁强计软铁校正算法
*/
#define LSM6DS3_CTRL10_C                0X19
/*
	0 0 Zen_G Yen_G Xen_G FUNC_EN FEDO_RST_STEP SIGN_MOTION_EN
	Zen_G:陀螺偏航轴(Z)输出使能。
	Yen_G:陀螺滚轴(Y)输出使能。
	Xen_G:陀螺螺距轴(X)输出使能。
	FUNC_EN:启用嵌入式功能(计步器、倾斜、显著运动、传感器轮毂和熨烫)和加速度计HP和LPF2滤波器
		(参见图6)。默认值:0
	FEDO_RST_STEP:重置计步器步长计数器。
	SIGN_MOTION_EN:使能重要运动功能
*/

//i2c master config register
#define LSM6DS3_MASTER_CONFIG           0X1A

//interrupts register
#define LSM6DS3_WAKE_UP_SRC             0X1B
/*
	0 0 FF_IA SLEEP_STATE_IA WU_IA X_WU Y_WU Z_WU
	FF_IA:自由落体时间检测状态
	SLEEP_STATE_IA:睡眠时间状态
	WU_IA:唤醒时间检测状态
	X_WU:x轴上的唤醒事件检测状态。
	Y_WU: y轴上的唤醒事件检测状态。
	Z_WU: z轴上的唤醒事件检测状态。
*/
#define LSM6DS3_TAP_SRC                 0X1C
/*
	0 TAP_IA SIGLE_TAP DOUBLE_TAP TAP_SIGN X_TAP Y_TAP Z_TAP
	TAP_IA:轻击事件检测状态
	SIGLE_TAP:单击事件检测状态
	DOUBLE_TAP:双击事件检测状态
	TAP_SIGN:轻击事件检测到的加速标志。
	X_TAP Y_TAP Z_TAP:点击x/y/z轴上的事件检测状态
*/
#define LSM6DS3_D6D_SRC                 0X1D
/*
	纵向、横向、面朝上和面朝下源寄存器(r)
	0 D6D_IA ZH ZL YH YL XH XL 
	D6D_IA:激活中断以改变位置纵向,横向,正面向上,正面向下。
	ZH: Z轴高事件(高于阈值)
	ZL:Z轴低事件(低于阈值)
	...
*/
//status data register
#define LSM6DS3_STATUS_REG              0X1E
/*
	- - - - - TDE GDA XLDA
	TDE:温度可用的新数据
	GDA:陀螺仪可用的新数据
	XLDA:加速度计可用的新数据
*/
#define LSM6DS3_TAP_CFG					0x58
#define LSM6DS3_TAP_THS_6D				0x59
#define LSM6DS3_WAKE_UP_THS	        	0x5B
#define LSM6DS3_WAKE_UP_DUR				0x5C
#define LSM6DS3_MD1_CFG					0x5E

//temperature output data register
#define LSM6DS3_OUT_TEMP_L              0X20
#define LSM6DS3_OUT_TEMP_H              0X21
/*温度数据输出寄存器(r)。L寄存器和H寄存器一起表示一个16位的字。*/

//gyroscope output register
#define LSM6DS3_OUTX_L_G                0X22
#define LSM6DS3_OUTX_H_G                0X23
#define LSM6DS3_OUTY_L_G                0X24
#define LSM6DS3_OUTY_H_G                0X25
#define LSM6DS3_OUTZ_L_G                0X26
#define LSM6DS3_OUTZ_H_G                0X27

//acc output register
#define LSM6DS3_OUTX_L_XL               0X28
#define LSM6DS3_OUTX_H_XL               0X29
#define LSM6DS3_OUTY_L_XL               0X2A
#define LSM6DS3_OUTY_H_XL               0X2B
#define LSM6DS3_OUTZ_L_XL               0X2C
#define LSM6DS3_OUTZ_H_XL               0X2D

#define LSM6DS3_INT1_CTRL				0X0D
#define LSM6DS3_INT2_CTRL				0X0E

//FIFO register
#define FIFO_CTRL_1						0x06
#define FIFO_CTRL_2						0x07
#define FIFO_CTRL_3						0x08
#define FIFO_CTRL_4						0x09
#define FIFO_CTRL_5						0x0A

#define	LSM6DS3_FIFO_STATUS_1			0x3A
#define	LSM6DS3_FIFO_STATUS_2			0x3B
#define	LSM6DS3_FIFO_STATUS_3			0x3C
#define	LSM6DS3_FIFO_STATUS_4			0x3D

#define FIFO_DATA_OUT_L					0x3E
#define FIFO_DATA_OUT_H					0x3F

/*
	Write INT1_CTRL = 01h // Acc Data Ready interrupt on INT1
	Write INT1_CTRL = 02h // Gyro Data Ready interrupt on INT1
*/

#define LSM6DS3_SlaveAddress			0x6a
#define LSM6DS3_DeviceID				0x6a

2.初始化

acc采样率使用26Hz;只往FIFO中写入acc数据;FIFO中断触发阈值为:78(即26 * 3 = 78个int16_t类型的数据);实测相当于1s触发一次中断。

/**
 * @brief      初始化陀螺仪和加速度传感器
 */
static void Lsm6ds3_Init(void)
{
	uint8_t whoAmI = Lsm6ds3_ReadByte(LSM6DS3_WHO_AM_I);
	
	// SEGGER_RTT_printf(0, "Lsm6ds3_Init[G-SensorId] -> 0x%x  \r\n", whoAmI);
	if(whoAmI != LSM6DS3_DeviceID)
	{
		SEGGER_RTT_printf(0, "read who am i failed!  0x%02x\r\n", whoAmI);
		return;
	}
	// reset
	Lsm6ds3_WriteByte(LSM6DS3_CTRL3_C, 0x01);
	vTaskDelay(5);

	// 加速度计26HZ, 2g量程。
	Lsm6ds3_WriteByte(LSM6DS3_CTRL1_XL, 0x20);

	//Block Data update, Interrupt output active low, Little Endian
	Lsm6ds3_WriteByte(LSM6DS3_CTRL3_C, 0x64);

	//FIFO Continuous mode, If the FIFO is full, the new sample overwrites the older one.
	Lsm6ds3_WriteByte(FIFO_CTRL_5, 0x16);	//FIFO Continuous mode 
	// Lsm6ds3_WriteByte(FIFO_CTRL_5, 0x11);	//FIFO mode

	//Accelerometer FIFO decimation setting 0x02:Decimation with factor 2
	Lsm6ds3_WriteByte(FIFO_CTRL_3, 0x01);	//no Decimation

	// 使能加速度计x,y,z轴 DEN
	Lsm6ds3_WriteByte(LSM6DS3_CTRL9_XL, 0xE0);

	//set FIFO threshold
	Lsm6ds3_WriteByte(FIFO_CTRL_1, 0x4E);

	// enable accelerometer int1	
	Lsm6ds3_WriteByte(LSM6DS3_INT1_CTRL, 0x08);

	//disable high-performance mode
	Lsm6ds3_WriteByte(LSM6DS3_CTRL7_G, 0x80);
	Lsm6ds3_WriteByte(LSM6DS3_CTRL6_C, 0x10);
}

3.FIFO数据读取

/**
 ******************************************************************************
 * @brief	Lsm6ds3_ReadAccelerationRaw_FIFO
 ******************************************************************************
 */
static uint16_t Lsm6ds3_ReadAccelerationRaw_FIFO(int16_t *pbuf)
{
	uint16_t count;
	uint8_t buf[156];
	//uint8_t msb, lsb;
	
	count = Lsm6ds3_Read_FIFO_Count();

	if(NULL != pbuf)
	{
		for (int i = 0; i < count; i++)
		{
			Lsm6ds3_ReadMultiple(FIFO_DATA_OUT_L, FIFO_DATA_OUT_H, &buf[i * 2]);
			//lsb = Lsm6ds3_ReadByte(FIFO_DATA_OUT_L);
			//msb = Lsm6ds3_ReadByte(FIFO_DATA_OUT_H);
			//pbuf[i] = (msb << 8) | lsb;
		}

		memcpy(pbuf, buf, sizeof(buf));
	}
		
	return count;
}

总结

暂时只用到acc三轴加速度计的数据,没有用到陀螺仪数据和6D功能。
如果FIFO中需要读取多种数据类型,需要注意数据存放的顺序和数据结构,并增加FIFO数据解析功能。

参考博客:https://blog.csdn.net/qq_37482894/article/details/124212145

能力有限,研究不深
欢迎交流讨论
个人邮箱:imxyp9x@163.com

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
你可以使用以下的Python代码来创建一个Minio上传图片的工具类: ```python from minio import Minio from minio.error import ResponseError class MinioUploader: def __init__(self, endpoint, access_key, secret_key, bucket_name): self.endpoint = endpoint self.access_key = access_key self.secret_key = secret_key self.bucket_name = bucket_name def upload_image(self, file_path, object_name): try: minio_client = Minio(self.endpoint, access_key=self.access_key, secret_key=self.secret_key, secure=False) # 检查bucket是否存在,不存在则创建 if not minio_client.bucket_exists(self.bucket_name): minio_client.make_bucket(self.bucket_name) # 上传图片 minio_client.fput_object(self.bucket_name, object_name, file_path) return True, "Image uploaded successfully" except ResponseError as err: return False, f"Error uploading image: {err}" ``` 使用时,你需要提供Minio服务的endpoint、access_key、secret_key以及bucket_name。然后,你可以调用`upload_image`方法来上传图片。该方法接收两个参数:`file_path`表示本地图片文件的路径,`object_name`表示在Minio中保存的对象名称。 以下是一个使用示例: ```python minio_uploader = MinioUploader(endpoint='minio.example.com', access_key='your-access-key', secret_key='your-secret-key', bucket_name='your-bucket-name') success, message = minio_uploader.upload_image('/path/to/image.jpg', 'image.jpg') if success: print(message) else: print(f"Error: {message}") ``` 请确保已经安装了`minio`库,可以使用`pip install minio`来进行安装。此外,根据你实际的Minio配置,需要修改代码中的相关参数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值