鄂尔多斯建设招投标网站,网站怎么做qq登录,网站效果图确认表,ppt免费下载驱动LSM6DS3TR-C实现高效运动检测与数据采集.6--FIFO数据读取与配置 概述视频教学样品申请源码下载主要内容生成STM32CUBEMX串口配置IIC配置CS和SA0设置ICASHE修改堆栈串口重定向参考驱动程序FIFO参考程序初始化管脚获取ID复位操作设置量程BDU设置设置速率FIFO读取程序设置FIFO… 驱动LSM6DS3TR-C实现高效运动检测与数据采集.6--FIFO数据读取与配置 概述视频教学样品申请源码下载主要内容生成STM32CUBEMX串口配置IIC配置CS和SA0设置ICASHE修改堆栈串口重定向参考驱动程序FIFO参考程序初始化管脚获取ID复位操作设置量程BDU设置设置速率FIFO读取程序设置FIFO水印使用流模式使用流模式有以下优点启用时间戳计数功能设置时间戳写入FIFO设置时间戳分辨率FIFO存储时间戳设置设置FIFO速率初始化获取FIFO数据演示 概述
LSM6DS3TR-C是STMicroelectronics公司推出的iNEMO惯性模块集成了三轴加速度计和三轴陀螺仪具备低功耗、强大的运动检测功能。该传感器支持多种操作模式并内置FIFO缓冲区用于批量处理和存储传感器数据。 FIFOFirst In First Out缓冲区在数据采集和处理过程中起着至关重要的作用。本文将介绍如何在LSM6DS3TR-C传感器中配置和读取FIFO数据包括配置FIFO模式、设置数据速率和读取存储的数据。
最近在弄ST和瑞萨RA的课程需要样片的可以加群申请615061293 。 视频教学
https://www.bilibili.com/video/BV1mS421d7eM/ 驱动LSM6DS3TR-C实现高效运动检测与数据采集(6)----FIFO数据读取与配置 样品申请
https://www.wjx.top/vm/OhcKxJk.aspx#
源码下载
https://download.csdn.net/download/qq_24312945/89504804
主要内容
初始化LSM6DSV16X传感器并检查其设备ID恢复传感器默认配置并设置必要的参数配置FIFO模式和水印阈值设置加速度计和陀螺仪的数据速率连续读取FIFO中的传感器数据并解析输出
LSM6DS3TR-C支持多种FIFO模式包括 ● Bypass模式直接从寄存器读取数据不使用FIFO。 ● FIFO模式数据写入FIFO直到缓冲区满为止。 ● Continuous模式数据连续写入FIFO新的数据会覆盖旧数据。 ● Continuous-to-FIFO模式初始阶段为连续模式当特定条件满足时切换为FIFO模式。 ● Bypass-to-Continuous模式初始阶段为Bypass模式当特定条件满足时切换为连续模式。
生成STM32CUBEMX
用STM32CUBEMX生成例程这里使用MCU为STM32H503CB。 配置时钟树配置时钟为250M。
串口配置
查看原理图PA9和PA10设置为开发板的串口。 配置串口速率为2000000。 IIC配置 LSM6DS3TR-C最大IIC通讯速率为400k。
配置IIC速度为400k CS和SA0设置 由于还有一个磁力计需要把该CS也使能。 ICASHE 修改堆栈 串口重定向
打开魔术棒勾选MicroLIB 在main.c中添加头文件若不添加会出现 identifier “FILE” is undefined报错。
/* USER CODE BEGIN Includes */
#include stdio.h
/* USER CODE END Includes */函数声明和串口重定向
/* USER CODE BEGIN PFP */
int fputc(int ch, FILE *f){HAL_UART_Transmit(huart1 , (uint8_t *)ch, 1, 0xFFFF);return ch;
}
/* USER CODE END PFP */参考驱动程序
https://github.com/STMicroelectronics/lsm6ds3tr-c-pid
FIFO参考程序
https://github.com/STMicroelectronics/STMems_Standard_C_drivers/blob/master/lsm6ds3_STdC/examples/lsm6ds3_multi_read_fifo_simple.c
初始化管脚
由于需要向LSM6DS3TR_C_I2C_ADD_L写入以及为IIC模式。 所以使能CS为高电平配置为IIC模式。 配置SA0为低电平。 printf(HELLO!\n);HAL_GPIO_WritePin(CS1_GPIO_Port, CS1_Pin, GPIO_PIN_SET);HAL_GPIO_WritePin(SA0_GPIO_Port, SA0_Pin, GPIO_PIN_RESET);HAL_GPIO_WritePin(CS2_GPIO_Port, CS2_Pin, GPIO_PIN_SET);HAL_Delay(100);/* Initialize mems driver interface */stmdev_ctx_t dev_ctx;dev_ctx.write_reg platform_write;dev_ctx.read_reg platform_read;dev_ctx.mdelay platform_delay;dev_ctx.handle SENSOR_BUS;/* Init test platform */
// platform_init();/* Wait sensor boot time */platform_delay(BOOT_TIME);获取ID
可以向WHO_AM_I (0Fh)获取固定值判断是否为0x6A
lsm6ds3tr_c_device_id_get为获取函数。 对应的获取ID驱动程序,如下所示。 /* Check device ID */whoamI 0;lsm6ds3tr_c_device_id_get(dev_ctx, whoamI);printf(LSM6DS3TR-C_ID0x%x,whoamI0x%x,LSM6DS3TR_C_ID,whoamI);if ( whoamI ! LSM6DS3TR_C_ID )while (1); /*manage here device not found */复位操作
可以向CTRL3 (12h)的SW_RESET寄存器写入1进行复位。 lsm6ds3tr_c_reset_set为重置函数。 对应的驱动程序,如下所示。 /* Restore default configuration */lsm6ds3tr_c_reset_set(dev_ctx, PROPERTY_ENABLE);do {lsm6ds3tr_c_reset_get(dev_ctx, rst);} while (rst);设置量程
设置加速度量程可以配置CTRL1_XL (10h)寄存器的FS_XLFS_XL [1:0]可以设置量程。 设置角速度量程可以配置CTRL2_G (11h)寄存器的FS_GFS_G [1:0]可以设置量程。 /* Set full scale */lsm6ds3tr_c_xl_full_scale_set(dev_ctx, LSM6DS3TR_C_2g);lsm6ds3tr_c_gy_full_scale_set(dev_ctx, LSM6DS3TR_C_2000dps);BDU设置
在很多传感器中数据通常被存储在输出寄存器中这些寄存器分为两部分MSB和LSB。这两部分共同表示一个完整的数据值。例如在一个加速度计中MSB和LSB可能共同表示一个加速度的测量值。 连续更新模式BDU ‘0’在默认模式下输出寄存器的值会持续不断地被更新。这意味着在你读取MSB和LSB的时候寄存器中的数据可能会因为新的测量数据而更新。这可能导致一个问题当你读取MSB时如果寄存器更新了接下来读取的LSB可能就是新的测量值的一部分而不是与MSB相对应的值。这样你得到的就是一个“拼凑”的数据它可能无法准确代表任何实际的测量时刻。 块数据更新BDU模式BDU ‘1’当激活BDU功能时输出寄存器中的内容不会在读取MSB和LSB之间更新。这就意味着一旦开始读取数据无论是先读MSB还是LSB寄存器中的那一组数据就被“锁定”直到两部分都被读取完毕。这样可以确保你读取的MSB和LSB是同一测量时刻的数据避免了读取到代表不同采样时刻的数据。 简而言之BDU位的作用是确保在读取数据时输出寄存器的内容保持稳定从而避免读取到拼凑或错误的数据。这对于需要高精度和稳定性的应用尤为重要。 可以向CTRL3 (12h)的BDU寄存器写入1进行开启。 对应的驱动程序,如下所示。 /* Enable Block Data Update */lsm6ds3tr_c_block_data_update_set(dev_ctx, PROPERTY_ENABLE);设置速率
设置加速度速率可以配置CTRL1_XL (10h)寄存器ODR_XL [3:0]可以设置速率。 设置角速度速率可以配置CTRL2_G (11h))寄存器ODR_G [3:0]可以设置速率。 /* Set XL and Gyro Output Data Rate:* in this example we set 12.5 Hz for Accelerometer and* 12.5 Hz for Gyroscope*/lsm6ds3tr_c_xl_data_rate_set(dev_ctx, LSM6DS3TR_C_XL_ODR_26Hz);lsm6ds3tr_c_gy_data_rate_set(dev_ctx, LSM6DS3TR_C_GY_ODR_26Hz);FIFO读取程序
FIFO中的数据组织如下
第1组FIFO数据陀螺仪数据第2组FIFO数据加速度计数据第3组FIFO数据外部传感器数据第4组FIFO数据外部传感器数据或步数计和时间戳信息或温度传感器数据
文档中提到每个数据集由6个字节组成 ● 陀螺仪数据6字节 ● 加速度计数据6字节 ● 外部传感器数据6字节 ● 步数计和时间戳信息6字节包含时间戳
设置FIFO水印
FIFO水印阈值的配置在寄存器FIFO_CTRL1和FIFO_CTRL2中具体的设置如下 ● FIFO_CTRL1寄存器0x06h: ○ 包含低8位的水印阈值FTH_[7:0]每一位代表2个字节1个字的FIFO数据。 ● FIFO_CTRL2寄存器0x07h: ○ 包含高3位的水印阈值FTH_[10:8]与FIFO_CTRL1一起使用时可以设置更高的水印阈值。 在LSM6DS3TR-C传感器中FIFO的最小分辨率是1个最低有效位LSB对应于2个字节1个字。这意味着每次写入FIFO的数据块的最小单位是2个字节。 当配置FIFO时用户需要确保所设置的水印阈值和读取操作符合这个最小分辨率。例如如果设置了水印阈值为2410这意味着当FIFO中存储了2410*2个字节的数据时就会触发相应的水印事件如中断。根据这个最小分辨率每个数据块的大小是2个字节因此240个数据块相当于480个数据。 /* Set FIFO watermark to a multiple of a pattern* in this example we set watermark to 10 pattern* which means ten sequence of:* (GYRO XL) 12 bytes* (external sensortimestamp) 12 bytes*/ lsm6ds3tr_c_int1_route_t int_1_reg;uint16_t pattern_len 24; // 每个数据集由6个字节组成,4*624每个数据块的大小是2个字节lsm6ds3tr_c_fifo_watermark_set(dev_ctx, 10 * pattern_len);使用流模式
FIFO模式的设置在寄存器FIFO_CTRL5中具体的设置如下 ● FIFO_MODE_[2:0]: 控制FIFO的工作模式。 ○ 000: Bypass模式FIFO禁用。 ○ 001: FIFO模式当FIFO满时停止收集数据。 ○ 011: 连续模式直到触发器解除然后切换为FIFO模式。 ○ 100: Bypass模式直到触发器解除然后切换为连续模式。 ○ 110: 连续模式如果FIFO满新样本会覆盖旧样本。 使用流模式有以下优点
持续数据采集适用于需要连续监控的场景如运动跟踪和实时监控应用。 数据最新性始终获取到最新的数据避免数据滞后。 无需等待FIFO清空当FIFO填满时新数据自动覆盖旧数据无需手动清空FIFO。 /* Set FIFO mode to Stream mode */lsm6ds3tr_c_fifo_mode_set(dev_ctx, LSM6DS3TR_C_STREAM_MODE);
// /* Enable FIFO watermark interrupt generation on INT1 pin */
// lsm6ds3tr_c_pin_int1_route_get(dev_ctx, int_1_reg);
// int_1_reg.int1_fth PROPERTY_ENABLE;
// lsm6ds3tr_c_pin_int1_route_set(dev_ctx, int_1_reg);启用时间戳计数功能
通过设置 CTRL10_C 寄存器中的 timer_en 和 func_en 位来启用 LSM6DS3TR-C 传感器的时间戳计数功能。时间戳计数功能允许传感器记录事件发生的时间便于时间同步和数据记录分析。 /* Enable timestamp and add it to FIFO */lsm6ds3tr_c_timestamp_set(dev_ctx, PROPERTY_ENABLE);设置时间戳写入FIFO
LSM6DS3TR-C传感器的时间戳批处理速率、温度数据批处理速率、增强的EIS陀螺仪输出批处理以及FIFO的工作模式。这些配置确保传感器数据能够以适当的速率和模式进行批处理和存储以满足不同的应用需求。
FIFO_CTRL2寄存器中timer_pedo_fifo_en位用于控制是否将步数计数器和时间戳数据作为第四个FIFO数据集。具体含义如下 ● 0: 禁用步数计数器和时间戳数据作为第四个FIFO数据集。 ○ 当timer_pedo_fifo_en位设置为0时步数计数器和时间戳数据不会被存储在FIFO中。 ● 1: 启用步数计数器和时间戳数据作为第四个FIFO数据集。 ○ 当timer_pedo_fifo_en位设置为1时步数计数器和时间戳数据将被存储在FIFO中作为第四个数据集。 lsm6ds3tr_c_fifo_pedo_and_timestamp_batch_set(dev_ctx,PROPERTY_ENABLE);设置时间戳分辨率
将 WAKE_UP_DUR 寄存器中的 TIMER_HR 位设置为特定的值以改变时间戳寄存器的分辨率。 时间戳数据为24位的大小。 /* Set the timestamp resolution to 25 μs (TIMER_HR bit in WAKE_UP_DUR register) */lsm6ds3tr_c_timestamp_res_set(dev_ctx, LSM6DS3TR_C_LSB_25us);FIFO存储时间戳设置
通过配置FIFO_CTRL4寄存器中的DEC_DS4_FIFO[2:0]字段来选择第4组FIFO数据集的降采样因子。 lsm6ds3tr_c_fifo_dataset_3_batch_set(dev_ctx, LSM6DS3TR_C_FIFO_DS3_NO_DEC); //FIFO_CTRL4 (09h)-DEC_DS4_FIFO[2:0]lsm6ds3tr_c_fifo_dataset_4_batch_set(dev_ctx, LSM6DS3TR_C_FIFO_DS4_NO_DEC);通过设置FIFO_CTRL2寄存器中的TIMER_PEDO_FIFO_EN和TIMER_PEDO_FIFO_DRDY位来启用和配置步数计数和时间戳数据存储。 // 启用时间戳写入FIFO第四数据集//FIFO_CTRL2 (07h)-TIMER_PEDO_FIFO_ENlsm6ds3tr_c_fifo_pedo_and_timestamp_batch_set(dev_ctx, PROPERTY_ENABLE); 设置FIFO速率
LSM6DS3TR-C传感器的FIFO控制寄存器3FIFO_CTRL3的内容该寄存器用于选择陀螺仪和加速度计数据写入FIFO的批处理数据速率BDRBatch Data Rate。以下是详细描述 FIFO_CTRL3寄存器地址09h,该寄存器包含两个主要字段 ● DEC_FIFO_GYRO [2:0]选择陀螺仪数据的批处理速率。 ● DEC_FIFO_XL [2:0]选择加速度计数据的批处理速率。 FIFO_CTRL3寄存器的DEC_FIFO_XL字段用于设置加速度计数据的FIFO去采样率具体配置如下 ● DEC_FIFO_XL [2:0]: 加速度计FIFO去采样率设置。 ○ 000: 加速度计传感器不在FIFO中。 ○ 001: 不进行去采样。 ○ 010: 去采样因子为2。 ○ 011: 去采样因子为3。 ○ 100: 去采样因子为4。 ○ 101: 去采样因子为8。 ○ 110: 去采样因子为16。 ○ 111: 去采样因子为32。 001表示“不进行去采样”即加速度计数据写入FIFO的速率与加速度计的输出数据速率ODR相同。因此如果DEC_FIFO_XL的值设置为001则加速度计数据的FIFO写入速率直接等于加速度计的ODR。 /* Set FIFO batch XL/Gyro ODR to 12.5Hz */lsm6ds3tr_c_fifo_xl_batch_set(dev_ctx,LSM6DS3TR_C_FIFO_XL_NO_DEC);lsm6ds3tr_c_fifo_gy_batch_set(dev_ctx,LSM6DS3TR_C_FIFO_GY_NO_DEC);设置FIFO数据可以通过FIFO_CTRL5 寄存器可以配置传感器的 FIFO 模式和数据输出速率以满足不同应用的需求。 /* Set ODR FIFO */lsm6ds3tr_c_fifo_data_rate_set(dev_ctx, LSM6DS3TR_C_FIFO_26Hz);初始化 /* USER CODE BEGIN 2 */printf(HELLO!\n);HAL_GPIO_WritePin(CS1_GPIO_Port, CS1_Pin, GPIO_PIN_SET);HAL_GPIO_WritePin(SA0_GPIO_Port, SA0_Pin, GPIO_PIN_RESET);HAL_GPIO_WritePin(CS2_GPIO_Port, CS2_Pin, GPIO_PIN_SET);HAL_Delay(100);/* Initialize mems driver interface */stmdev_ctx_t dev_ctx;dev_ctx.write_reg platform_write;dev_ctx.read_reg platform_read;dev_ctx.mdelay platform_delay;dev_ctx.handle SENSOR_BUS;/* Init test platform */
// platform_init();/* Wait sensor boot time */platform_delay(BOOT_TIME);/* Check device ID */whoamI 0;lsm6ds3tr_c_device_id_get(dev_ctx, whoamI);printf(LSM6DS3TR-C_ID0x%x,whoamI0x%x,LSM6DS3TR_C_ID,whoamI);if ( whoamI ! LSM6DS3TR_C_ID )while (1); /*manage here device not found *//* Restore default configuration */lsm6ds3tr_c_reset_set(dev_ctx, PROPERTY_ENABLE);do {lsm6ds3tr_c_reset_get(dev_ctx, rst);} while (rst);/* 设置加速度计和陀螺仪的满量程范围 */lsm6ds3tr_c_xl_full_scale_set(dev_ctx, LSM6DS3TR_C_2g);lsm6ds3tr_c_gy_full_scale_set(dev_ctx, LSM6DS3TR_C_2000dps);/* 启用块数据更新BDU当FIFO支持时 */lsm6ds3tr_c_block_data_update_set(dev_ctx, PROPERTY_ENABLE);/* 设置加速度计和陀螺仪的输出数据速率* 在本例中我们将加速度计和陀螺仪的速率设置为26 Hz*/lsm6ds3tr_c_xl_data_rate_set(dev_ctx, LSM6DS3TR_C_XL_ODR_26Hz);lsm6ds3tr_c_gy_data_rate_set(dev_ctx, LSM6DS3TR_C_GY_ODR_26Hz);/* 设置FIFO水印为模式的倍数* 在本例中我们将水印设置为10个模式* 这意味着10个序列* (陀螺仪 加速度计) 12字节* (外部传感器 时间戳) 12字节*/lsm6ds3tr_c_int1_route_t int_1_reg;uint16_t pattern_len 24; // 每个数据集由6个字节组成,4*624lsm6ds3tr_c_fifo_watermark_set(dev_ctx, 10 * pattern_len);/* 将FIFO模式设置为流模式 *///FIFO_CTRL5(0x0A)-STREAM_MODElsm6ds3tr_c_fifo_mode_set(dev_ctx, LSM6DS3TR_C_STREAM_MODE);/* 启用时间戳并将其添加到FIFO *///CTRL10_C (19h)-TIMER_ENlsm6ds3tr_c_timestamp_set(dev_ctx, PROPERTY_ENABLE);//CTRL10_C (19h)-PEDO_EN lsm6ds3tr_c_pedo_sens_set(dev_ctx, PROPERTY_ENABLE); // 根据需求配置步数计数/* 将时间戳分辨率设置为25 μs (WAKE_UP_DUR寄存器中的TIMER_HR位) *///WAKE_UP_DUR (5Ch)-TIMER_HRlsm6ds3tr_c_timestamp_res_set(dev_ctx, LSM6DS3TR_C_LSB_25us);//设置第3数据集Dataset 3的降采样因子lsm6ds3tr_c_fifo_dataset_3_batch_set(dev_ctx, LSM6DS3TR_C_FIFO_DS3_NO_DEC); //设置第4数据集Dataset 4的降采样因子//FIFO_CTRL4 (09h)-DEC_DS4_FIFO[2:0]lsm6ds3tr_c_fifo_dataset_4_batch_set(dev_ctx, LSM6DS3TR_C_FIFO_DS4_NO_DEC);// 启用时间戳写入FIFO第四数据集//FIFO_CTRL2 (07h)-TIMER_PEDO_FIFO_ENlsm6ds3tr_c_fifo_pedo_and_timestamp_batch_set(dev_ctx, PROPERTY_ENABLE); /* 设置FIFO传感器的降采样因子 */lsm6ds3tr_c_fifo_xl_batch_set(dev_ctx, LSM6DS3TR_C_FIFO_XL_NO_DEC);lsm6ds3tr_c_fifo_gy_batch_set(dev_ctx, LSM6DS3TR_C_FIFO_GY_NO_DEC);/* 设置FIFO的输出数据速率 *///FIFO_CTRL5 (0Ah)lsm6ds3tr_c_fifo_data_rate_set(dev_ctx, LSM6DS3TR_C_FIFO_26Hz);/* USER CODE END 2 */获取FIFO数据
当对FIFO输出寄存器FIFO_DATA_OUT_L (3Eh)和FIFO_DATA_OUT_H (3Fh)进行多次读取操作时舍入功能会自动启用。 对LSM6DS3TR-C传感器的配置并从FIFO中读取加速度、角速度、时间戳和外部传感器数据。 /* Infinite loop *//* USER CODE BEGIN WHILE */while (1){uint16_t num 0,num10;uint16_t num_pattern 0;uint8_t waterm 0;/* 读取LSM6DS3TR-C的水印标志 */lsm6ds3tr_c_fifo_wtm_flag_get(dev_ctx, waterm); if (waterm) {/* 读取FIFO中的字数 */lsm6ds3tr_c_fifo_data_level_get(dev_ctx, num);num_pattern num / 24*2;printf(num%d\n,num);while (num_pattern-- 0) {printf (num1%d\n,num1);num1;/* 根据传感器的ODR配置FIFO模式由以下样本序列组成GYRO, XL 外部传感器 时间戳*/lsm6ds3tr_c_fifo_raw_data_get(dev_ctx,data_raw_angular_rate.u8bit,3 * sizeof(int16_t));angular_rate_mdps[0] lsm6ds3tr_c_from_fs2000dps_to_mdps(data_raw_angular_rate.i16bit[0]);angular_rate_mdps[1] lsm6ds3tr_c_from_fs2000dps_to_mdps(data_raw_angular_rate.i16bit[1]);angular_rate_mdps[2] lsm6ds3tr_c_from_fs2000dps_to_mdps(data_raw_angular_rate.i16bit[2]);printf(Angular rate [mdps]:%4.2f\t%4.2f\t%4.2f\r\n,angular_rate_mdps[0], angular_rate_mdps[1], angular_rate_mdps[2]);lsm6ds3tr_c_fifo_raw_data_get(dev_ctx,data_raw_acceleration.u8bit,3 * sizeof(int16_t));acceleration_mg[0] lsm6ds3tr_c_from_fs2g_to_mg(data_raw_acceleration.i16bit[0]);acceleration_mg[1] lsm6ds3tr_c_from_fs2g_to_mg(data_raw_acceleration.i16bit[1]);acceleration_mg[2] lsm6ds3tr_c_from_fs2g_to_mg(data_raw_acceleration.i16bit[2]);printf(Acc [mg]:%4.2f\t%4.2f\t%4.2f\r\n,acceleration_mg[0], acceleration_mg[1], acceleration_mg[2]);//外部传感器数据 lsm6ds3tr_c_fifo_raw_data_get(dev_ctx,data_raw_none.u8bit,3 * sizeof(int16_t)); // 打印外部传感器数据printf(External sensor data: %02x %02x %02x %02x %02x %02x\r\n,data_raw_none.u8bit[0], data_raw_none.u8bit[1], data_raw_none.u8bit[2],data_raw_none.u8bit[3], data_raw_none.u8bit[4], data_raw_none.u8bit[5]);/* 读取时间戳数据 */uint32_t timestamp0;lsm6ds3tr_c_fifo_raw_data_get(dev_ctx,data_raw_Timestamp.u8bit,3*sizeof(int16_t));//for(int i0;i6;i){printf(t[%d]%d ,i,data_raw_Timestamp.u8bit[i]);}timestamp(data_raw_Timestamp.u8bit[1]16)|(data_raw_Timestamp.u8bit[0]8)|(data_raw_Timestamp.u8bit[3]);printf(Timestamp: %u\r\n, timestamp); }} /* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */演示
实际测试如下所示数据为20个数据。 加速度速率为26Hz角速度速率为26Hz。 时间戳速率26Hz为38.46ms。 下图中的2个时间戳数据为5825473和58239315825473-58239311542*25us38.550ms