0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

陀螺仪LSM6DSV16X与AI集成(6)----检测自由落体

嵌入式单片机MCU开发 来源:嵌入式单片机MCU开发 作者:嵌入式单片机MCU开 2024-05-17 15:12 次阅读

概述

本文介绍如何初始化传感器并配置其参数,以便在检测到自由落体事件时发送通知。

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

视频教学

[https://www.bilibili.com/video/BV1yi421o7Jr/]

样品申请

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

源码下载

[https://download.csdn.net/download/qq_24312945/88947607]

生成STM32CUBEMX

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

串口配置

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

配置串口。

IIC配置

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

CS和SA0设置

串口重定向

打开魔术棒,勾选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/lsm6dsv16x-pid/tree/main]

初始换管脚

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

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

printf("123123123");
  lsm6dsv16x_reset_t rst;
  stmdev_ctx_t dev_ctx;
  /* Initialize mems driver interface */
  dev_ctx.write_reg = platform_write;
  dev_ctx.read_reg = platform_read;
  dev_ctx.handle = &SENSOR_BUS;


  HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET);
  HAL_GPIO_WritePin(SA0_GPIO_Port, SA0_Pin, GPIO_PIN_RESET);

获取ID

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

lsm6dsv16x_device_id_get为获取函数。

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

/* Wait sensor boot time */
  platform_delay(BOOT_TIME);
  /* Check device ID */
  lsm6dsv16x_device_id_get(&dev_ctx, &whoamI);
    printf("LSM6DSV16X_ID=0x%x,whoamI=0x%x",LSM6DSV16X_ID,whoamI);
  if (whoamI != LSM6DSV16X_ID)
    while (1);

复位操作

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

lsm6dsv16x_reset_set为重置函数。

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

/* Restore default configuration */
  lsm6dsv16x_reset_set(&dev_ctx, LSM6DSV16X_RESTORE_CTRL_REGS);
  do {
    lsm6dsv16x_reset_get(&dev_ctx, &rst);
  } while (rst != LSM6DSV16X_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 */
  lsm6dsv16x_block_data_update_set(&dev_ctx, PROPERTY_ENABLE);

寄存器地址自动递增

IF_INC (Register Address Auto-Increment):
当使用串行接口(如I²C, MIPI I3C, 或 SPI)进行多字节访问时,此位用于自动增加寄存器地址。默认值是1(启用),这样在连续读取多个寄存器时,地址会自动递增

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

/* Enable register address automatically incremented during a multiple byte
  access with a serial interface. */
  lsm6dsv16x_auto_increment_set(&dev_ctx, PROPERTY_ENABLE) ;

关闭FIFO

可以通过FIFO_CTRL4 (0Ah)关闭FIFO模式。

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

/* FIFO mode selection */
    lsm6dsv16x_fifo_mode_set(&dev_ctx, LSM6DSV16X_BYPASS_MODE);

设置量程

加速度量程可以通过CTRL8 (17h)的CTRL8 (17h)设置。

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

/* Full scale selection. */
    lsm6dsv16x_xl_full_scale_set(&dev_ctx, LSM6DSV16X_2g);

关闭角速度量程

陀螺仪的输出数据率选择可以通过CTRL2 (11h) 陀螺仪控制寄存器进行配置。由于不需要用到陀螺仪数据,所以可以关闭。

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

/* Output data rate selection - power down. */
    lsm6dsv16x_gy_data_rate_set(&dev_ctx, LSM6DSV16X_ODR_OFF);

输出数据设置

输出数据率范围从1.875 Hz到7.68 kHz不等,允许用户根据应用的需求来调整加速度计的性能和功耗。

CTRL1 (10h) 加速度计控制寄存器的配置选项。

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

/* Output data rate selection. */
    lsm6dsv16x_xl_data_rate_set(&dev_ctx, LSM6DSV16X_ODR_AT_120Hz);

设置自由落体功能的持续时间

WAKE_UP_DUR (5Ch) 寄存器用于设置自由落体、唤醒和睡眠模式功能的持续时间。具体字段如下:
FF_DUR_5:与自由落体持续时间事件相关。完整的自由落体配置需要参考 FREE_FALL 寄存器。
WAKE_DUR [1:0]:定义唤醒事件的持续时间,默认值为00。
SLEEP_DUR [3:0]:定义进入睡眠模式前的持续时间,默认值为0000。

FREE_FALL (5Dh) 寄存器用于设置自由落体功能的持续时间和阈值。具体字段如下:
FF_DUR [4:0]:定义自由落体事件的持续时间,需要与 WAKE_UP_DUR 寄存器的 FF_DUR_5 位一起配置以设置完整的持续时间。
FF_THS [2:0]:定义自由落体检测的阈值,默认值为000。

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

/*  Set free fall duration.*/
    lsm6dsv16x_ff_time_windows_set(&dev_ctx, 0x06);

中断设置

MD1_CFG (5Eh) 这个寄存器用于配置哪些功能的中断信号会被路由到 INT1 引脚。每个位的设置决定了特定事件是否会触发 INT1 引脚的中断。具体功能如下:

INT1_SLEEP_CHANGE:活动/静止状态变化的中断事件路由到 INT1。
INT1_SINGLE_TAP:单次敲击识别的中断事件路由到 INT1。
INT1_WU:唤醒事件的中断路由到 INT1。
INT1_FF:自由落体事件的中断路由到 INT1。
INT1_DOUBLE_TAP:双次敲击识别的中断事件路由到 INT1。
INT1_6D:6D(方向改变)事件的中断路由到 INT1。
INT1_EMB_FUNC:嵌入式功能事件的中断路由到 INT1。
INT1_SHUB:传感器集线器通信结束的中断路由到 INT1。
每个功能旁边的 0 和 1 表示该功能的中断是否被禁用 (0) 或启用 (1)。默认值是 0,表示中断被禁用。如果将相应位设置为 1,则当相应的事件发生时,INT1 引脚将触发中断。

通过这个寄存器,开发者可以根据需要配置传感器,以确定在发生如敲击、唤醒、自由落体或方向改变等事件时是否生成中断信号,从而允许外部微控制器处理器相应地响应这些事件。

FUNCTIONS_ENABLE(50h)这个寄存器用于控制不同的中断功能是否启用。具体功能包括:

INTERRUPTS_ENABLE:启用或禁用基本中断(6D/4D定向、自由落体、唤醒、敲击、活动/静止)。默认值为0,表示中断禁用。 TIMESTAMP_EN:启用或禁用时间戳计数器。如果启用,时间戳计数器的值可以在TIMESTAMP0(40h)、TIMESTAMP1(41h)和TIMESTAMP3(43h)寄存器中读取。默认值为0,表示禁用。 DIS_RST_LIR_ALL_INT:当此位设置为1时,读取ALL_INT_SRC(1Dh)寄存器不会重置锁存的中断信号。这在读取状态寄存器之前不重置某些状态标志时很有用。默认值为0。 INACT_EN [1:0]:启用活动/静止(睡眠)功能。根据设置,这可以配置加速度计进入不同的低功耗模式,并通过INACTIVITY_DUR(54h)寄存器选择加速度计的输出数据速率(ODR)。陀螺仪的配置也可能相应变化,例如进入睡眠模式或关闭电源模式。

这个寄存器让用户可以根据应用需求,灵活地选择哪些中断事件应该被监控,以及加速度计和陀螺仪的功耗管理策略。这些设置对于优化设备电池寿命和确保及时响应传感器事件非常重要。

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

/* Enable free fall event on either INT1 or INT2 pin */
    lsm6dsv16x_md1_cfg_t val1;
    lsm6dsv16x_functions_enable_t functions_enable;

    lsm6dsv16x_read_reg(&dev_ctx, LSM6DSV16X_MD1_CFG, (uint8_t *)&val1, 1);
    val1.int1_ff = PROPERTY_ENABLE;
    lsm6dsv16x_write_reg(&dev_ctx, LSM6DSV16X_MD1_CFG, (uint8_t *)&val1, 1);

    lsm6dsv16x_read_reg(&dev_ctx, LSM6DSV16X_FUNCTIONS_ENABLE, (uint8_t *)&functions_enable, 1);
    functions_enable.interrupts_enable = PROPERTY_ENABLE;
    lsm6dsv16x_write_reg(&dev_ctx, LSM6DSV16X_FUNCTIONS_ENABLE, (uint8_t *)&functions_enable, 1);

获取所有中断源的状态

可以通过ALL_INT_SRC (1Dh)寄存器的FF_IA判断是否产生自由落体事件。

/* wait forever (6D event handle in irq handler) */
        lsm6dsv16x_all_sources_t status;
        if(HAL_GPIO_ReadPin(INT1_GPIO_Port,INT1_Pin)==0)
        {
            /* Read output only if new xl value is available */
            lsm6dsv16x_all_sources_get(&dev_ctx, &status);
            if (status.free_fall) {
                printf("Free Fall Detected!n");
            }            


        }

演示

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 陀螺仪
    +关注

    关注

    44

    文章

    741

    浏览量

    97814
  • AI
    AI
    +关注

    关注

    87

    文章

    27061

    浏览量

    264786
  • stm32cubemx
    +关注

    关注

    5

    文章

    269

    浏览量

    14484
收藏 人收藏

    评论

    相关推荐

    陀螺仪LSM6DSV16XAI集成(1)----轮询获取陀螺仪数据

    本文将介绍如何使用 LSM6DSV16X 传感器来读取数据。主要步骤包括初始化传感器接口、验证设备ID、配置传感器的数据输出率和滤波器,以及通过轮询方式持续读取加速度、角速率和温度数据。读取到的数据
    的头像 发表于 12-18 10:49 614次阅读
    <b class='flag-5'>陀螺仪</b><b class='flag-5'>LSM6DSV16X</b>与<b class='flag-5'>AI</b><b class='flag-5'>集成</b>(1)----轮询获取<b class='flag-5'>陀螺仪</b>数据

    陀螺仪LSM6DSV16XAI集成(2)----姿态解算

    LSM6DSV16X包含三轴陀螺仪与三轴加速度计。
    的头像 发表于 12-18 10:51 842次阅读
    <b class='flag-5'>陀螺仪</b><b class='flag-5'>LSM6DSV16X</b>与<b class='flag-5'>AI</b><b class='flag-5'>集成</b>(2)----姿态解算

    陀螺仪LSM6DSV16XAI集成(3)----读取融合算法输出的四元数

    LSM6DSV16X 特性涉及到的是一种低功耗的传感器融合算法(Sensor Fusion Low Power, SFLP). 低功耗传感器融合(SFLP)算法:
    的头像 发表于 12-18 10:53 676次阅读
    <b class='flag-5'>陀螺仪</b><b class='flag-5'>LSM6DSV16X</b>与<b class='flag-5'>AI</b><b class='flag-5'>集成</b>(3)----读取融合算法输出的四元数

    ADXL362自由落体检测异常,结果与阈值设定不符是怎么回事?

    基本准确; 但自由落体检测功能一直难以实现。设置阈值远小于1g时仍然能触发。 按照datasheet上建议的步骤为: 1. 写入0x96(150个代码)到寄存器0x23:将自由落体
    发表于 12-29 08:23

    请问MPU6050做自由落体时速度数据是怎么反应?

    现在做的产品是利用陀螺仪做一个开关,在掉落时做自由落体,当作关闭。第一次接触6050,不太懂,如果做自由落体时,是不是应该六个壁面都没受到压力,加速度计采样回来的数据都是零么?
    发表于 05-17 00:34

    供应LSM6DSLTR LSM6DSL 传感器 LSM6DSMTR LSM6DSM

    LSM6DSL / LSM6DSM 高效率 6 轴 MEMS 传感器模块。STMicro 的 LSM6DSL 和 LSM6DSM 采用创新型
    发表于 07-15 11:46

    请问LSM6DSV32XLSM6DSO32X是同一个封装吗?

    LSM6DSV32XLSM6DSO32X是同一个封装吗?
    发表于 12-14 07:19

    LSM6DSO中的ID无法检测自由落体示例代码是什么原因呢

    可以获得 LSM6DSO 的 ID,所以我认为 I2C 接口工作正常,我尝试做一些自由落体测试(从我手中掉落)但是 FF_IA在 WAKE_UP_SRC 中保持为 0),因此无法检测自由落体
    发表于 12-19 07:42

    lsm6dsl寄存器自由落体检测位未设置怎么办呢

    DSH_write_reg(LSM6DSL_ACC_GYRO_FREE_FALL,0x33);/* 启用自由落体事件 */LIS6DSH_write_reg(
    发表于 12-21 06:23

    求助,是否有在LSM6DSV16X中使用传感器融合低功耗算法的示例

    你好我想知道是否有在 LSM6DSV16X 中使用传感器融合低功耗算法的示例。我想检索当前的 Heading、Pitch 和 Roll 信息。或者我也很高兴有一个例子解释如何从 SFLP 中获取四元
    发表于 02-03 09:12

    LSM6DS3的应用笔记

    /±4/±8/±16 g,且角速率范围为±125/±245/±500/±1000/±2000 dps。经过配置,LSM6DS3 可利用硬件识别出的自由落体事件、6D 方向、单击和双击感
    发表于 09-13 08:23

    LSM6DSO的应用笔记

    本文档旨在提供 ST LSM6DSO iNEMO 六轴惯性传感器模块相关的使用信息和应用提示。LSM6DSO 是系统级封装的 3D 数字加速度计和 3D 数字陀螺仪,具有数字 I²C、SPI
    发表于 09-13 08:05

    ST LSM6DSV16X iNEMO惯性模块相关的使用信息和应用提示

    AN5763,LSM6DSV16X是一款ST的3 轴加速度计和 3 轴陀螺仪LSM6DSV16X 是系统级封装的 3 轴数字加速度计和 3 轴数字陀螺仪,具有数字 I²C、SPI
    发表于 08-31 11:12 0次下载

    意法半导体推出一款LSM6DSV32X 6轴惯性模块(IMU)

    意法半导体的LSM6DSV32X 6轴惯性模块(IMU)集成一个满量程32g的大加速度计和一个满量程4000度每秒(dps)的陀螺仪,可测量高强度的运动和撞击,包括自由落体高度估算。
    的头像 发表于 05-09 10:35 257次阅读

    意法半导体发布LSM6DSV32X 6轴惯性模块

    意法半导体近日发布了其最新的LSM6DSV32X 6轴惯性模块(IMU),该模块集成了高性能的加速度计和陀螺仪。加速度计的最大量程达到32g,而陀螺仪则具备高达4000度每秒(dps)
    的头像 发表于 05-13 09:59 197次阅读