当前位置:首页|资讯

陀螺仪LSM6DSV16X与AI集成(1)----轮询获取陀螺仪数据

作者:记帖发布时间:2024-09-30

概述

本文将介绍如何使用 LSM6DSV16X 传感器来读取数据。主要步骤包括初始化传感器接口、验证设备ID、配置传感器的数据输出率和滤波器,以及通过轮询方式持续读取加速度、角速率和温度数据。读取到的数据会被转换为适当的单位并通过串行通信输出。这个代码是一个很好的起点,用于了解如何操作 LSM6DSV16X 传感器并获取其数据。

最近在弄ST和瑞萨RA的课程,需要样片的可以加群申请:615061293 。

视频教学

https://www.bilibili.com/video/BV1RC4y1y75J/


样品申请

https://www.wjx.top/vm/OhcKxJk.aspx#

源码下载

https://download.csdn.net/download/qq_24312945/88594487

通信模式

对于LSM6DSV16X,可以使用SPI或者IIC进行通讯。 

最小系统图如下所示。 

在CS管脚为1的时候,为IIC模式 

本文使用的板子原理图如下所示。 

管脚定义

IIC通信模式

在使用IIC通讯模式的时候,SA0是用来控制IIC的地址位的。 

对于IIC的地址,可以通过SDO/SA0引脚修改。SDO/SA0引脚可以用来修改设备地址的最低有效位。如果SDO/SA0引脚连接到电源电压,LSb(最低有效位)为'1'(地址1101011b);否则,如果SDO/SA0引脚连接到地线,LSb的值为'0'(地址1101010b)。

IIC接口如下所示。 主要使用的管脚为CS、SCL、SDA、SA0。 

速率

该模块支持的速度为普通模式(100k)和快速模式(400k)。 

生成STM32CUBEMX

用STM32CUBEMX生成例程,这里使用MCU为STM32WB55RG。 配置时钟树,配置时钟为32M。

串口配置

查看原理图,PB6和PB7设置为开发板的串口。

 配置串口。

IIC配置

 配置IIC为快速模式,速度为400k。 

CS和SA0设置

串口重定向

打开魔术棒,勾选MicroLIB

在main.c中,添加头文件,若不添加会出现 identifier "FILE" is undefined报错。


函数声明和串口重定向:


参考程序

https://github.com/STMicroelectronics/lsm6dsv16x-pid/tree/main


初始换管脚

由于需要向LSM6DSV16X_I2C_ADD_L写入以及为IIC模式。 

所以使能CS为高电平,配置为IIC模式。 配置SA0为高电平。



获取ID

可以向WHO_AM_I (0Fh)获取固定值,判断是否为0x70。

lsm6dsv16x_device_id_get为获取函数。

对应的获取ID驱动程序,如下所示。


复位操作

可以向CTRL3 (12h)的SW_RESET寄存器写入1进行复位。 

lsm6dsv16x_reset_set为重置函数。 

对应的驱动程序,如下所示。



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进行开启。




对应的驱动程序,如下所示。



设置量程和速率

速率可以通过CTRL1 (10h)设置加速度速率和CTRL2 (11h)进行设置角速度速率。

 设置加速度量程可以通过CTRL8 (17h)进行设置。 设置角速度量程可以通过CTRL6 (15h)进行设置。

 

设置加速度和角速度的量程和速率可以使用如下函数。



配置过滤链




轮询读取数据

进入一个无限循环,不断检查是否有新的数据(加速度、角速率、温度)可用。 对于每种类型的数据(加速度、角速率、温度),如果有新数据,就读取原始数据,转换为对应的单位(毫克、毫度每秒、摄氏度),并通过串行输出打印。

对于数据是否准备好,可以访问STATUS_REG (1Eh)进行判断。 



对于加速度数据,可以通过28-2D进行获取。 

 

 加速度数据首先以原始格式(通常是整数)读取,然后需要转换为更有意义的单位,如毫重力(mg)。这里的转换函数 lsm6dsv16x_from_fs2_to_mg() 根据加速度计的量程(这里假设为±2g)将原始数据转换为毫重力单位。 


acceleration_mg[0] = lsm6dsv16x_from_fs2_to_mg(data_raw_acceleration[0]); 等三行代码分别转换 X、Y、Z 轴的加速度数据。

● LSM6DSV16X 加速度计通常会有一个固定的位分辨率,比如 16 位(即输出值是一个 16 位的整数)。这意味着加速度计可以输出的不同值的总数是 2^16=65536。这些值均匀地分布在 -2g 到 +2g 的范围内。 

● 因此,这个范围(4g 或者 4000 mg)被分成了 65536 个步长。 

● 每个步长的大小是 4000 mg/65536≈0.061 mg/LSB 


所以,函数中的乘法 ((float_t)lsb) * 0.061f 是将原始的整数值转换为以毫重力(mg)为单位的加速度值。这个转换对于将加速度计的原始读数转换为实际的物理测量值是必需的。



对于角速度数据,可以通过22-2D进行获取。

 

在 LSM6DSV16X 传感器中,函数 lsm6dsv16x_from_fs2000_to_mdps(int16_t lsb) 用于将原始的传感器数据(以最小可分辨位(Least Significant Bit,简称 LSB)为单位)转换为以毫度每秒(mdps)为单位的角速度值。这里的 70.0f 是一个转换因子,用于从原始数据单位转换到实际的物理单位。 


具体来说,这个转换因子是基于传感器的灵敏度或比例因子。对于 LSM6DSV16X 传感器,当设置为 ±2000 dps (度每秒) 的满量程时,每个 LSB 代表的角速度值为 70 mdps。




对于温度数据,可以通过20-21进行获取。


主程序


演示








Copyright © 2024 aigcdaily.cn  北京智识时代科技有限公司  版权所有  京ICP备2023006237号-1