陀螺仪LSM6DSV80X开发.1--轮询获取陀螺仪数据概述视频教学样品申请源码下载硬件准备参考程序所有功能生成STM32CUBEMX串口配置通信模式管脚定义IIC通信模式速率IIC配置CS和SA0设置ICASHE修改堆栈串口重定向参考程序初始换管脚获取ID复位操作BDU设置设置低量程加速度速率设置高量程加速度速率设置角速度量程速率设置低量程加速度量程设置高量程加速度量程设置角速度量程配置滤波器轮询读取数据主程序演示概述LSM6DSV80X 是可穿戴技术领域的一项突破。它能够处理高低加速度值并结合其高能效和先进的处理能力使其成为任何希望获取数据进行深入分析并在排球、足球、网球、拳击或爆发力跳跃等运动的高强度冲击和追踪活动中取得更佳表现的人士的理想之选。这款 IMU 是一套适用于可穿戴设备、高强度冲击和活动追踪的综合解决方案兼具精准度、集成度和效率。LSM6DSV80X 是世界上第一款将高重力80 g和低重力能力结合在单一封装中的 IMU集成了先进的功能边缘处理和传感器融合并为运动可穿戴设备的跟踪和高强度冲击检测提供一致的性能和有价值的数据。最近在弄ST的课程需要样片的可以加群申请615061293 。该设备支持边缘 AI利用有限状态机 (FSM) 进行可配置运动跟踪利用机器学习核心 (MLC) 进行情境感知并为可穿戴应用提供可导出的 AI 功能。LSM6DSV80X 支持自适应自配置 (ASC) 功能该功能允许根据特定运动模式的检测或基于 MLC 中配置的特定决策树的输出实时自动重新配置设备而无需主机处理器的任何干预。视频教学https://www.bilibili.com/video/BV1kJhizPECK/陀螺仪LSM6DSV80X开发(1)----轮询获取陀螺仪数据样品申请https://www.wjx.top/vm/OhcKxJk.aspx#源码下载https://download.csdn.net/download/qq_24312945/92884602硬件准备首先需要准备一个开发板这里我准备的是自己绘制的开发板需要的可以进行申请。主控为STM32H503CB陀螺仪为LSM6DSV80X磁力计为LIS2MDL。参考程序https://github.com/CoreMaker-lab/LSM6DSV80Xhttps://gitee.com/CoreMaker/LSM6DSV80X所有功能● 专用独立陀螺仪、低重力和高重力加速度计通道以及数据处理● 智能 FIFO 高达 4.5 KB● 双加速度计通道○ 低重力通道±2/±4/±8/±16 g 满量程○ 高 g 通道 ±32/±64/±80 g 满量程● ±250/±500/±1000/±2000/±4000 dps 满量程● SPI / I²C MIPI I3C ® v1.1 串行接口带主处理器数据同步● 可编程有限状态机用于高 g 和低 g 加速度计、陀螺仪和外部传感器数据处理高速率 960 Hz● 具有可导出功能和适用于 AI 应用程序的过滤器的机器学习核心● 嵌入式自适应自配置ASC● 嵌入式传感器融合低功耗SFLP算法● 嵌入式温度传感器● 独立 I/O 供应○ I²C电压范围1.62 V至3.6 V○ SPI/MIPI I3C®扩展电压范围1.08 V 至 3.6 V● 电源电流○ 组合高性能模式下 6 轴配置 0.67 mA○ 9 轴配置 0.80 mA 组合高性能模式● 紧凑尺寸2.5 毫米 x 3 毫米 x 0.83 毫米● 符合 ECOPACK 和 RoHS 标准生成STM32CUBEMX用STM32CUBEMX生成例程这里使用MCU为STM32H503CB。配置时钟树配置时钟为250M。串口配置查看原理图PA9和PA10设置为开发板的串口。配置串口速率为2000000。通信模式对于LSM6DSV80X可以使用SPI或者IIC进行通讯。最小系统图如下所示。在CS管脚为1的时候为IIC模式。本文使用的板子原理图如下所示。管脚定义IIC通信模式在在使用IIC通讯模式的时候SA0是用来控制IIC的地址位的。对于IIC的地址可以通过TA0引脚修改。TA0引脚可以用来修改设备地址的最低有效位。如果TA0引脚连接到电源电压LSb最低有效位为’1’地址1101011b否则如果TA0引脚连接到地线LSb的值为’0’地址1101010b。接口如下所示。主要使用的管脚为CS、SCL、SDA、SA0。速率该模块支持的速度为普通模式(100k)和快速模式(400k)。IIC配置LSM6DSV80X最大IIC通讯速率为1M配置IIC速度为400kCS和SA0设置由于还有一个磁力计需要把该CS也使能。ICASHE修改堆栈串口重定向打开魔术棒勾选MicroLIB在main.c中添加头文件若不添加会出现 identifier “FILE” is undefined报错。/* USER CODE BEGIN Includes */#includestdio.h/* USER CODE END Includes */函数声明和串口重定向/* USER CODE BEGIN PFP */intfputc(intch,FILE*f){HAL_UART_Transmit(huart1,(uint8_t*)ch,1,0xFFFF);returnch;}/* USER CODE END PFP */参考程序https://github.com/STMicroelectronics/lsm6dsv80x-pid初始换管脚由于需要向LSM6DSV80X_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);lsm6dsv80x_reset_trst;stmdev_ctx_tdev_ctx;// 累加器和计数器用于计算均值double_tlowg_xl_sum[3],hg_xl_sum[3],gyro_sum[3],temp_sum;uint16_tlowg_xl_cnt0,hg_xl_cnt0,gyro_cnt0,temp_cnt0;/* Initialize mems driver interface */dev_ctx.write_regplatform_write;dev_ctx.read_regplatform_read;dev_ctx.mdelayplatform_delay;dev_ctx.handleSENSOR_BUS;/* Init test platform */// platform_init();/* Wait sensor boot time */platform_delay(BOOT_TIME);获取ID可以向WHO_AM_I (0Fh)获取固定值判断是否为0x73。lsm6dsv80x_device_id_get为获取函数。对应的获取ID驱动程序,如下所示。/* Check device ID */lsm6dsv80x_device_id_get(dev_ctx,whoamI);printf(LSM6DSV80X_ID0x%x,whoamI0x%x,LSM6DSV80X_ID,whoamI);if(whoamI!LSM6DSV80X_ID)while(1);复位操作可以向CTRL3 (12h)的SW_RESET寄存器写入1进行复位。lsm6dsv80x_reset_set为重置函数。对应的驱动程序,如下所示。/* Restore default configuration */lsm6dsv80x_reset_set(dev_ctx,LSM6DSV80X_RESTORE_CTRL_REGS);do{lsm6dsv80x_reset_get(dev_ctx,rst);}while(rst!LSM6DSV80X_READY);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 */lsm6dsv80x_block_data_update_set(dev_ctx,PROPERTY_ENABLE);设置低量程加速度速率低量程加速度速率可以通过CTRL1 (10h)设置加速度速率。设置加速度速率可以使用如下函数。// 设置量程与输出数据速率lsm6dsv80x_xl_data_rate_set(dev_ctx,LSM6DSV80X_ODR_AT_60Hz);设置高量程加速度速率高量程加速度速率可以通过CTRL1_XL_HG (4Eh)设置高量程加速度速率。设置高量程加速度速率可以使用如下函数。lsm6dsv80x_hg_xl_data_rate_set(dev_ctx,LSM6DSV80X_HG_XL_ODR_AT_960Hz,1);设置角速度量程速率角速度量程可以通过CTRL2 (11h)设置高量程加速度速率。设置角速度速率可以使用如下函数。lsm6dsv80x_gy_data_rate_set(dev_ctx,LSM6DSV80X_ODR_AT_120Hz);设置低量程加速度量程低量程加速度量程可以通过CTRL8 (17h)设置。设置加速度量程可以使用如下函数。/* Set full scale */lsm6dsv80x_xl_full_scale_set(dev_ctx,LSM6DSV80X_2g);设置高量程加速度量程高量程加速度量程可以通过CTRL1_XL_HG (4Eh)设置。设置高量程加速度量程可以使用如下函数。lsm6dsv80x_hg_xl_full_scale_set(dev_ctx,LSM6DSV80X_80g);需要注意的是高量程加速度的精度问题。设置角速度量程角速度量程可以通过CTRL6 (15h)设置。设置角速度量程量程可以使用如下函数。lsm6dsv80x_gy_full_scale_set(dev_ctx,LSM6DSV80X_2000dps);配置滤波器/* Configure filtering chain */filt_settling_mask.drdyPROPERTY_ENABLE;filt_settling_mask.irq_xlPROPERTY_ENABLE;filt_settling_mask.irq_gPROPERTY_ENABLE;lsm6dsv80x_filt_settling_mask_set(dev_ctx,filt_settling_mask);lsm6dsv80x_filt_gy_lp1_set(dev_ctx,PROPERTY_ENABLE);lsm6dsv80x_filt_gy_lp1_bandwidth_set(dev_ctx,LSM6DSV80X_GY_ULTRA_LIGHT);lsm6dsv80x_filt_xl_lp2_set(dev_ctx,PROPERTY_ENABLE);lsm6dsv80x_filt_xl_lp2_bandwidth_set(dev_ctx,LSM6DSV80X_XL_STRONG);lowg_xl_sum[0]lowg_xl_sum[1]lowg_xl_sum[2]0.0;hg_xl_sum[0]hg_xl_sum[1]hg_xl_sum[2]0.0;gyro_sum[0]gyro_sum[1]gyro_sum[2]0.0;temp_sum0.0;轮询读取数据进入一个无限循环不断检查是否有新的数据加速度、角速率、温度可用。对于每种类型的数据加速度、角速率、温度如果有新数据就读取原始数据转换为对应的单位毫克、毫度每秒、摄氏度并通过串行输出打印。对于数据是否准备好可以访问STATUS_REG (1Eh)进行判断。lsm6dsv80x_data_ready_tdrdy;/* Read output only if new xl value is available */lsm6dsv80x_flag_data_ready_get(dev_ctx,drdy);对于低量程加速度数据可以通过28-2D进行获取。对于高量程加速度数据可以通过34-39进行获取。对于角速度数据可以通过22-27进行获取。对于温度数据可以通过20-21进行获取。主程序/* Infinite loop *//* USER CODE BEGIN WHILE */while(1){lsm6dsv80x_data_ready_tdrdy;/* Read output only if new xl value is available */lsm6dsv80x_flag_data_ready_get(dev_ctx,drdy);// 低g加速度数据if(drdy.drdy_xl){/* Read acceleration field data */memset(data_raw_motion,0x00,3*sizeof(int16_t));lsm6dsv80x_acceleration_raw_get(dev_ctx,data_raw_motion);acceleration_mg[0]lsm6dsv80x_from_fs2_to_mg(data_raw_motion[0]);acceleration_mg[1]lsm6dsv80x_from_fs2_to_mg(data_raw_motion[1]);acceleration_mg[2]lsm6dsv80x_from_fs2_to_mg(data_raw_motion[2]);lowg_xl_sum[0]acceleration_mg[0];lowg_xl_sum[1]acceleration_mg[1];lowg_xl_sum[2]acceleration_mg[2];lowg_xl_cnt;}// 高g加速度数据if(drdy.drdy_hgxl){/* Read acceleration field data */memset(data_raw_motion,0x00,3*sizeof(int16_t));lsm6dsv80x_hg_acceleration_raw_get(dev_ctx,data_raw_motion);acceleration_mg[0]lsm6dsv80x_from_fs80_to_mg(data_raw_motion[0]);acceleration_mg[1]lsm6dsv80x_from_fs80_to_mg(data_raw_motion[1]);acceleration_mg[2]lsm6dsv80x_from_fs80_to_mg(data_raw_motion[2]);hg_xl_sum[0]acceleration_mg[0];hg_xl_sum[1]acceleration_mg[1];hg_xl_sum[2]acceleration_mg[2];hg_xl_cnt;}// 陀螺仪数据/* Read output only if new xl value is available */if(drdy.drdy_gy){/* Read angular rate field data */memset(data_raw_motion,0x00,3*sizeof(int16_t));lsm6dsv80x_angular_rate_raw_get(dev_ctx,data_raw_motion);angular_rate_mdps[0]lsm6dsv80x_from_fs2000_to_mdps(data_raw_motion[0]);angular_rate_mdps[1]lsm6dsv80x_from_fs2000_to_mdps(data_raw_motion[1]);angular_rate_mdps[2]lsm6dsv80x_from_fs2000_to_mdps(data_raw_motion[2]);gyro_sum[0]angular_rate_mdps[0];gyro_sum[1]angular_rate_mdps[1];gyro_sum[2]angular_rate_mdps[2];gyro_cnt;}if(drdy.drdy_temp){/* Read temperature data */memset(data_raw_temperature,0x00,sizeof(int16_t));lsm6dsv80x_temperature_raw_get(dev_ctx,data_raw_temperature);temperature_degClsm6dsv80x_from_lsb_to_celsius(data_raw_temperature);temp_sumtemperature_degC;temp_cnt;}if(lowg_xl_cntCNT_FOR_OUTPUT){/* print media low-g xl data */acceleration_mg[0]lowg_xl_sum[0]/lowg_xl_cnt;acceleration_mg[1]lowg_xl_sum[1]/lowg_xl_cnt;acceleration_mg[2]lowg_xl_sum[2]/lowg_xl_cnt;printf(lg xl (media of %d samples) [mg]:%4.2f\t%4.2f\t%4.2f\r\n,lowg_xl_cnt,acceleration_mg[0],acceleration_mg[1],acceleration_mg[2]);lowg_xl_sum[0]lowg_xl_sum[1]lowg_xl_sum[2]0.0;lowg_xl_cnt0;/* print media high-g xl data */acceleration_mg[0]hg_xl_sum[0]/hg_xl_cnt;acceleration_mg[1]hg_xl_sum[1]/hg_xl_cnt;acceleration_mg[2]hg_xl_sum[2]/hg_xl_cnt;printf(hg xl (media of %d samples) [mg]:%4.2f\t%4.2f\t%4.2f\r\n,hg_xl_cnt,acceleration_mg[0],acceleration_mg[1],acceleration_mg[2]);hg_xl_sum[0]hg_xl_sum[1]hg_xl_sum[2]0.0;hg_xl_cnt0;/* print media gyro data */angular_rate_mdps[0]gyro_sum[0]/gyro_cnt;angular_rate_mdps[1]gyro_sum[1]/gyro_cnt;angular_rate_mdps[2]gyro_sum[2]/gyro_cnt;printf(gyro (media of %d samples) [mdps]:%4.2f\t%4.2f\t%4.2f\r\n,gyro_cnt,angular_rate_mdps[0],angular_rate_mdps[1],angular_rate_mdps[2]);gyro_sum[0]gyro_sum[1]gyro_sum[2]0.0;gyro_cnt0;/* print media temperature data */temperature_degCtemp_sum/temp_cnt;printf(Temperature (media of %d samples) [degC]:%6.2f\r\n\r\n,temp_cnt,temperature_degC);temp_cnt0;temp_sum0.0;}/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */演示
陀螺仪LSM6DSV80X开发(1)----轮询获取陀螺仪数据
发布时间:2026/5/20 5:06:05
陀螺仪LSM6DSV80X开发.1--轮询获取陀螺仪数据概述视频教学样品申请源码下载硬件准备参考程序所有功能生成STM32CUBEMX串口配置通信模式管脚定义IIC通信模式速率IIC配置CS和SA0设置ICASHE修改堆栈串口重定向参考程序初始换管脚获取ID复位操作BDU设置设置低量程加速度速率设置高量程加速度速率设置角速度量程速率设置低量程加速度量程设置高量程加速度量程设置角速度量程配置滤波器轮询读取数据主程序演示概述LSM6DSV80X 是可穿戴技术领域的一项突破。它能够处理高低加速度值并结合其高能效和先进的处理能力使其成为任何希望获取数据进行深入分析并在排球、足球、网球、拳击或爆发力跳跃等运动的高强度冲击和追踪活动中取得更佳表现的人士的理想之选。这款 IMU 是一套适用于可穿戴设备、高强度冲击和活动追踪的综合解决方案兼具精准度、集成度和效率。LSM6DSV80X 是世界上第一款将高重力80 g和低重力能力结合在单一封装中的 IMU集成了先进的功能边缘处理和传感器融合并为运动可穿戴设备的跟踪和高强度冲击检测提供一致的性能和有价值的数据。最近在弄ST的课程需要样片的可以加群申请615061293 。该设备支持边缘 AI利用有限状态机 (FSM) 进行可配置运动跟踪利用机器学习核心 (MLC) 进行情境感知并为可穿戴应用提供可导出的 AI 功能。LSM6DSV80X 支持自适应自配置 (ASC) 功能该功能允许根据特定运动模式的检测或基于 MLC 中配置的特定决策树的输出实时自动重新配置设备而无需主机处理器的任何干预。视频教学https://www.bilibili.com/video/BV1kJhizPECK/陀螺仪LSM6DSV80X开发(1)----轮询获取陀螺仪数据样品申请https://www.wjx.top/vm/OhcKxJk.aspx#源码下载https://download.csdn.net/download/qq_24312945/92884602硬件准备首先需要准备一个开发板这里我准备的是自己绘制的开发板需要的可以进行申请。主控为STM32H503CB陀螺仪为LSM6DSV80X磁力计为LIS2MDL。参考程序https://github.com/CoreMaker-lab/LSM6DSV80Xhttps://gitee.com/CoreMaker/LSM6DSV80X所有功能● 专用独立陀螺仪、低重力和高重力加速度计通道以及数据处理● 智能 FIFO 高达 4.5 KB● 双加速度计通道○ 低重力通道±2/±4/±8/±16 g 满量程○ 高 g 通道 ±32/±64/±80 g 满量程● ±250/±500/±1000/±2000/±4000 dps 满量程● SPI / I²C MIPI I3C ® v1.1 串行接口带主处理器数据同步● 可编程有限状态机用于高 g 和低 g 加速度计、陀螺仪和外部传感器数据处理高速率 960 Hz● 具有可导出功能和适用于 AI 应用程序的过滤器的机器学习核心● 嵌入式自适应自配置ASC● 嵌入式传感器融合低功耗SFLP算法● 嵌入式温度传感器● 独立 I/O 供应○ I²C电压范围1.62 V至3.6 V○ SPI/MIPI I3C®扩展电压范围1.08 V 至 3.6 V● 电源电流○ 组合高性能模式下 6 轴配置 0.67 mA○ 9 轴配置 0.80 mA 组合高性能模式● 紧凑尺寸2.5 毫米 x 3 毫米 x 0.83 毫米● 符合 ECOPACK 和 RoHS 标准生成STM32CUBEMX用STM32CUBEMX生成例程这里使用MCU为STM32H503CB。配置时钟树配置时钟为250M。串口配置查看原理图PA9和PA10设置为开发板的串口。配置串口速率为2000000。通信模式对于LSM6DSV80X可以使用SPI或者IIC进行通讯。最小系统图如下所示。在CS管脚为1的时候为IIC模式。本文使用的板子原理图如下所示。管脚定义IIC通信模式在在使用IIC通讯模式的时候SA0是用来控制IIC的地址位的。对于IIC的地址可以通过TA0引脚修改。TA0引脚可以用来修改设备地址的最低有效位。如果TA0引脚连接到电源电压LSb最低有效位为’1’地址1101011b否则如果TA0引脚连接到地线LSb的值为’0’地址1101010b。接口如下所示。主要使用的管脚为CS、SCL、SDA、SA0。速率该模块支持的速度为普通模式(100k)和快速模式(400k)。IIC配置LSM6DSV80X最大IIC通讯速率为1M配置IIC速度为400kCS和SA0设置由于还有一个磁力计需要把该CS也使能。ICASHE修改堆栈串口重定向打开魔术棒勾选MicroLIB在main.c中添加头文件若不添加会出现 identifier “FILE” is undefined报错。/* USER CODE BEGIN Includes */#includestdio.h/* USER CODE END Includes */函数声明和串口重定向/* USER CODE BEGIN PFP */intfputc(intch,FILE*f){HAL_UART_Transmit(huart1,(uint8_t*)ch,1,0xFFFF);returnch;}/* USER CODE END PFP */参考程序https://github.com/STMicroelectronics/lsm6dsv80x-pid初始换管脚由于需要向LSM6DSV80X_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);lsm6dsv80x_reset_trst;stmdev_ctx_tdev_ctx;// 累加器和计数器用于计算均值double_tlowg_xl_sum[3],hg_xl_sum[3],gyro_sum[3],temp_sum;uint16_tlowg_xl_cnt0,hg_xl_cnt0,gyro_cnt0,temp_cnt0;/* Initialize mems driver interface */dev_ctx.write_regplatform_write;dev_ctx.read_regplatform_read;dev_ctx.mdelayplatform_delay;dev_ctx.handleSENSOR_BUS;/* Init test platform */// platform_init();/* Wait sensor boot time */platform_delay(BOOT_TIME);获取ID可以向WHO_AM_I (0Fh)获取固定值判断是否为0x73。lsm6dsv80x_device_id_get为获取函数。对应的获取ID驱动程序,如下所示。/* Check device ID */lsm6dsv80x_device_id_get(dev_ctx,whoamI);printf(LSM6DSV80X_ID0x%x,whoamI0x%x,LSM6DSV80X_ID,whoamI);if(whoamI!LSM6DSV80X_ID)while(1);复位操作可以向CTRL3 (12h)的SW_RESET寄存器写入1进行复位。lsm6dsv80x_reset_set为重置函数。对应的驱动程序,如下所示。/* Restore default configuration */lsm6dsv80x_reset_set(dev_ctx,LSM6DSV80X_RESTORE_CTRL_REGS);do{lsm6dsv80x_reset_get(dev_ctx,rst);}while(rst!LSM6DSV80X_READY);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 */lsm6dsv80x_block_data_update_set(dev_ctx,PROPERTY_ENABLE);设置低量程加速度速率低量程加速度速率可以通过CTRL1 (10h)设置加速度速率。设置加速度速率可以使用如下函数。// 设置量程与输出数据速率lsm6dsv80x_xl_data_rate_set(dev_ctx,LSM6DSV80X_ODR_AT_60Hz);设置高量程加速度速率高量程加速度速率可以通过CTRL1_XL_HG (4Eh)设置高量程加速度速率。设置高量程加速度速率可以使用如下函数。lsm6dsv80x_hg_xl_data_rate_set(dev_ctx,LSM6DSV80X_HG_XL_ODR_AT_960Hz,1);设置角速度量程速率角速度量程可以通过CTRL2 (11h)设置高量程加速度速率。设置角速度速率可以使用如下函数。lsm6dsv80x_gy_data_rate_set(dev_ctx,LSM6DSV80X_ODR_AT_120Hz);设置低量程加速度量程低量程加速度量程可以通过CTRL8 (17h)设置。设置加速度量程可以使用如下函数。/* Set full scale */lsm6dsv80x_xl_full_scale_set(dev_ctx,LSM6DSV80X_2g);设置高量程加速度量程高量程加速度量程可以通过CTRL1_XL_HG (4Eh)设置。设置高量程加速度量程可以使用如下函数。lsm6dsv80x_hg_xl_full_scale_set(dev_ctx,LSM6DSV80X_80g);需要注意的是高量程加速度的精度问题。设置角速度量程角速度量程可以通过CTRL6 (15h)设置。设置角速度量程量程可以使用如下函数。lsm6dsv80x_gy_full_scale_set(dev_ctx,LSM6DSV80X_2000dps);配置滤波器/* Configure filtering chain */filt_settling_mask.drdyPROPERTY_ENABLE;filt_settling_mask.irq_xlPROPERTY_ENABLE;filt_settling_mask.irq_gPROPERTY_ENABLE;lsm6dsv80x_filt_settling_mask_set(dev_ctx,filt_settling_mask);lsm6dsv80x_filt_gy_lp1_set(dev_ctx,PROPERTY_ENABLE);lsm6dsv80x_filt_gy_lp1_bandwidth_set(dev_ctx,LSM6DSV80X_GY_ULTRA_LIGHT);lsm6dsv80x_filt_xl_lp2_set(dev_ctx,PROPERTY_ENABLE);lsm6dsv80x_filt_xl_lp2_bandwidth_set(dev_ctx,LSM6DSV80X_XL_STRONG);lowg_xl_sum[0]lowg_xl_sum[1]lowg_xl_sum[2]0.0;hg_xl_sum[0]hg_xl_sum[1]hg_xl_sum[2]0.0;gyro_sum[0]gyro_sum[1]gyro_sum[2]0.0;temp_sum0.0;轮询读取数据进入一个无限循环不断检查是否有新的数据加速度、角速率、温度可用。对于每种类型的数据加速度、角速率、温度如果有新数据就读取原始数据转换为对应的单位毫克、毫度每秒、摄氏度并通过串行输出打印。对于数据是否准备好可以访问STATUS_REG (1Eh)进行判断。lsm6dsv80x_data_ready_tdrdy;/* Read output only if new xl value is available */lsm6dsv80x_flag_data_ready_get(dev_ctx,drdy);对于低量程加速度数据可以通过28-2D进行获取。对于高量程加速度数据可以通过34-39进行获取。对于角速度数据可以通过22-27进行获取。对于温度数据可以通过20-21进行获取。主程序/* Infinite loop *//* USER CODE BEGIN WHILE */while(1){lsm6dsv80x_data_ready_tdrdy;/* Read output only if new xl value is available */lsm6dsv80x_flag_data_ready_get(dev_ctx,drdy);// 低g加速度数据if(drdy.drdy_xl){/* Read acceleration field data */memset(data_raw_motion,0x00,3*sizeof(int16_t));lsm6dsv80x_acceleration_raw_get(dev_ctx,data_raw_motion);acceleration_mg[0]lsm6dsv80x_from_fs2_to_mg(data_raw_motion[0]);acceleration_mg[1]lsm6dsv80x_from_fs2_to_mg(data_raw_motion[1]);acceleration_mg[2]lsm6dsv80x_from_fs2_to_mg(data_raw_motion[2]);lowg_xl_sum[0]acceleration_mg[0];lowg_xl_sum[1]acceleration_mg[1];lowg_xl_sum[2]acceleration_mg[2];lowg_xl_cnt;}// 高g加速度数据if(drdy.drdy_hgxl){/* Read acceleration field data */memset(data_raw_motion,0x00,3*sizeof(int16_t));lsm6dsv80x_hg_acceleration_raw_get(dev_ctx,data_raw_motion);acceleration_mg[0]lsm6dsv80x_from_fs80_to_mg(data_raw_motion[0]);acceleration_mg[1]lsm6dsv80x_from_fs80_to_mg(data_raw_motion[1]);acceleration_mg[2]lsm6dsv80x_from_fs80_to_mg(data_raw_motion[2]);hg_xl_sum[0]acceleration_mg[0];hg_xl_sum[1]acceleration_mg[1];hg_xl_sum[2]acceleration_mg[2];hg_xl_cnt;}// 陀螺仪数据/* Read output only if new xl value is available */if(drdy.drdy_gy){/* Read angular rate field data */memset(data_raw_motion,0x00,3*sizeof(int16_t));lsm6dsv80x_angular_rate_raw_get(dev_ctx,data_raw_motion);angular_rate_mdps[0]lsm6dsv80x_from_fs2000_to_mdps(data_raw_motion[0]);angular_rate_mdps[1]lsm6dsv80x_from_fs2000_to_mdps(data_raw_motion[1]);angular_rate_mdps[2]lsm6dsv80x_from_fs2000_to_mdps(data_raw_motion[2]);gyro_sum[0]angular_rate_mdps[0];gyro_sum[1]angular_rate_mdps[1];gyro_sum[2]angular_rate_mdps[2];gyro_cnt;}if(drdy.drdy_temp){/* Read temperature data */memset(data_raw_temperature,0x00,sizeof(int16_t));lsm6dsv80x_temperature_raw_get(dev_ctx,data_raw_temperature);temperature_degClsm6dsv80x_from_lsb_to_celsius(data_raw_temperature);temp_sumtemperature_degC;temp_cnt;}if(lowg_xl_cntCNT_FOR_OUTPUT){/* print media low-g xl data */acceleration_mg[0]lowg_xl_sum[0]/lowg_xl_cnt;acceleration_mg[1]lowg_xl_sum[1]/lowg_xl_cnt;acceleration_mg[2]lowg_xl_sum[2]/lowg_xl_cnt;printf(lg xl (media of %d samples) [mg]:%4.2f\t%4.2f\t%4.2f\r\n,lowg_xl_cnt,acceleration_mg[0],acceleration_mg[1],acceleration_mg[2]);lowg_xl_sum[0]lowg_xl_sum[1]lowg_xl_sum[2]0.0;lowg_xl_cnt0;/* print media high-g xl data */acceleration_mg[0]hg_xl_sum[0]/hg_xl_cnt;acceleration_mg[1]hg_xl_sum[1]/hg_xl_cnt;acceleration_mg[2]hg_xl_sum[2]/hg_xl_cnt;printf(hg xl (media of %d samples) [mg]:%4.2f\t%4.2f\t%4.2f\r\n,hg_xl_cnt,acceleration_mg[0],acceleration_mg[1],acceleration_mg[2]);hg_xl_sum[0]hg_xl_sum[1]hg_xl_sum[2]0.0;hg_xl_cnt0;/* print media gyro data */angular_rate_mdps[0]gyro_sum[0]/gyro_cnt;angular_rate_mdps[1]gyro_sum[1]/gyro_cnt;angular_rate_mdps[2]gyro_sum[2]/gyro_cnt;printf(gyro (media of %d samples) [mdps]:%4.2f\t%4.2f\t%4.2f\r\n,gyro_cnt,angular_rate_mdps[0],angular_rate_mdps[1],angular_rate_mdps[2]);gyro_sum[0]gyro_sum[1]gyro_sum[2]0.0;gyro_cnt0;/* print media temperature data */temperature_degCtemp_sum/temp_cnt;printf(Temperature (media of %d samples) [degC]:%6.2f\r\n\r\n,temp_cnt,temperature_degC);temp_cnt0;temp_sum0.0;}/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */演示