三轴加速度计LIS2DW12开发(3)----检测活动和静止状态

107 篇文章 56 订阅
63 篇文章 3 订阅

概述

检测活动和静止状态主要用途是在嵌入式应用中实时监控加速度计的活动状态,例如在可穿戴设备、智能手机或安全系统中检测用户的动作或设备的位置变化。通过设置不同的阈值和时长,可以精确地确定何时设备处于静止状态,何时发生了活动,从而触发相应的操作或警报。

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

在这里插入图片描述

视频教学

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

三轴加速度计LIS2DW12开发(3)----检测活动和静止状态

样品申请

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

源码下载

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

生成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/lis2dw12-pid

初始换管脚

由于需要向LIS2DW12_I2C_ADD_H写入以及为IIC模式。
在这里插入图片描述

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

	stmdev_ctx_t dev_ctx;
	lis2dw12_reg_t int_route;
  dev_ctx.write_reg = platform_write;
  dev_ctx.read_reg = platform_read;
  dev_ctx.handle = &SENSOR_BUS;

  HAL_GPIO_WritePin(GPIOC, CS_Pin, GPIO_PIN_SET);
  HAL_GPIO_WritePin(GPIOC, SA0_Pin, GPIO_PIN_SET);

获取ID

我们可以向WHO_AM_I (0Fh)获取固定值,判断是否为0x44。
在这里插入图片描述

lis2dw12_device_id_get为获取函数。
在这里插入图片描述

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

  /* Wait sensor boot time */
  platform_delay(BOOT_TIME);
  /* Check device ID */
  lis2dw12_device_id_get(&dev_ctx, &whoamI);
	printf("LIS2DW12_ID=0x%x,whoamI=0x%x",LIS2DW12_ID,whoamI);
  if (whoamI != LIS2DW12_ID)
    while (1) {
      /* manage here device not found */
    }

复位操作

可以向CTRL2 (21h)的SOFT_RESET寄存器写入1进行复位。

在这里插入图片描述
lis2dw12_reset_set为重置函数。

在这里插入图片描述

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

  /* Restore default configuration */
  lis2dw12_reset_set(&dev_ctx, PROPERTY_ENABLE);

  do {
    lis2dw12_reset_get(&dev_ctx, &rst);
  } while (rst);

设置传感器的量程

FS[1:0] - 全量程选择:这两个位用于设置传感器的量程。量程决定了传感器可以测量的最大加速度值。例如,量程可以设置为±2g、±4g、±8g或±16g。这允许用户根据应用的特定需求调整传感器的灵敏度。
在这里插入图片描述

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

  /* Set full scale */
  lis2dw12_full_scale_set(&dev_ctx, LIS2DW12_2g);

配置过滤器链

lis2dw12_filter_path_set(&dev_ctx, LIS2DW12_LPF_ON_OUT);:设置加速度计输出的过滤器路径。这里选择了输出上的低通滤波器(LPF),用于去除高频噪声。
lis2dw12_filter_bandwidth_set:设置加速度计的滤波带宽,LIS2DW12_ODR_DIV_4 表示滤波器的截止频率为输出数据率(ODR)的四分之一。

配置电源模式

lis2dw12_power_mode_set(&dev_ctx, LIS2DW12_CONT_LOW_PWR_12bit);配置电源模式。这里设置为连续低功耗模式,且以 12 位分辨率运行。

设置加速度计的唤醒持续时间

lis2dw12_wkup_dur_set:设置加速度计的唤醒持续时间,此处设置为“2”,具体的时间取决于输出数据率(ODR)的倒数。

在这里插入图片描述

设置进入睡眠模式前的持续时间

lis2dw12_act_sleep_dur_set:设置进入睡眠模式前的持续时间,单位为输出数据率(ODR)的512分之一秒。

在这里插入图片描述

设置唤醒加速度计所需的活动阈值

如果设备由于静止或处于静止状态而进入睡眠模式,并且随后它检测到超过WAKE_UP_THS (34h)中设置的阈值的运动,它将从静止状态过渡到唤醒状态。这意味着它将重新开始更积极地监测运动。

在这里插入图片描述

lis2dw12_wkup_threshold_set:设置唤醒加速度计所需的活动阈值,这里设置为“2”,每个 LSB(最低有效位)等于全量程的1/64。

在这里插入图片描述

配置唤醒中断函数

lis2dw12_wkup_feed_data_set:配置唤醒中断函数所使用的数据类型。活动/静止功能可以使用高通滤波或偏移输出来确定设备的状态。这可以通过CTRL7 (3Fh)中的USR_OFF_ON_OUT位来配置。

在这里插入图片描述

在这里插入图片描述

  /* Data sent to wake-up interrupt function */
  lis2dw12_wkup_feed_data_set(&dev_ctx, LIS2DW12_HP_FEED);

加速度计检测活动或静止的模式

lis2dw12_act_mode_set:设置加速度计检测活动或静止的模式,LIS2DW12_DETECT_ACT_INACT 用于配置设备以检测活动或静止状态。
这些检测功能的阈值和持续时间可以通过两个控制寄存器进行配置:
WAKE_UP_THS (34h) 用于设置唤醒的阈值水平。
WAKE_UP_DUR (35h) 用于设置唤醒和静止状态的持续时间。

在这里插入图片描述

在WAKE_UP_THS (34h)中设置SLEEP_ON位以启用静止状态检测。

在这里插入图片描述

在这里插入图片描述

  /* Config activity / inactivity or stationary / motion detection */
  lis2dw12_act_mode_set(&dev_ctx, LIS2DW12_DETECT_ACT_INACT);

启用唤醒中断

lis2dw12_pin_int1_route_get 和 lis2dw12_pin_int1_route_set:这两个函数配合使用来获取和设置中断路由配置。首先获取当前的中断路由配置,然后启用唤醒中断(int1_wu),最后将配置写回加速度计。

在这里插入图片描述

  /* Enable activity detection interrupt */
  lis2dw12_pin_int1_route_get(&dev_ctx, &int_route.ctrl4_int1_pad_ctrl);
  int_route.ctrl4_int1_pad_ctrl.int1_wu = PROPERTY_ENABLE;
  lis2dw12_pin_int1_route_set(&dev_ctx, &int_route.ctrl4_int1_pad_ctrl);

设置输出数据速率

设置加速度计的数据输出速率,LIS2DW12_XL_ODR_200Hz 表示每秒输出200个数据点。

  /* Set Output Data Rate */
  lis2dw12_data_rate_set(&dev_ctx, LIS2DW12_XL_ODR_200Hz);	

检测活动状态

可以不断地检查 LIS2DW12 加速度计的状态,以确定是否检测到活动或静止(无活动)事件。
sleep_state_ia 位,如果该位被设置(通常表示检测到静止状态)。
wu_ia 位,如果该位被设置(通常表示检测到活动状态)。
在这里插入图片描述

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
		
    lis2dw12_all_sources_t all_source;
    /* Read status register */
    lis2dw12_all_sources_get(&dev_ctx, &all_source);

    /* Check if Activity/Inactivity events */
    if (all_source.wake_up_src.sleep_state_ia) 
		{		
      printf("Inactivity Detected\r\n");
    }

    if (all_source.wake_up_src.wu_ia) {
      printf("Activity Detected\r\n");
    }		

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

演示

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

记帖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值