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

描述

概述

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

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

mems

视频教学

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

样品申请

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

源码下载

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

生成STM32CUBEMX

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

mems

串口配置

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

mems
配置串口。

mems

IIC配置

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

CS和SA0设置

mems

串口重定向

打开魔术棒,勾选MicroLIB

mems

在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模式。
mems

所以使能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。
mems

lis2dw12_device_id_get为获取函数。
mems

对应的获取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进行复位。

mems
lis2dw12_reset_set为重置函数。

mems

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

/* 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。这允许用户根据应用的特定需求调整传感器的灵敏度。
mems

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

/* 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)的倒数。

mems

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

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

mems

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

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

mems

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

mems

配置唤醒中断函数

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

mems

mems

/* 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) 用于设置唤醒和静止状态的持续时间。

mems

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

mems

mems

/* 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),最后将配置写回加速度计。

mems

/* 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 位,如果该位被设置(通常表示检测到活动状态)。
mems

/* 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 Detectedrn");
    }

    if (all_source.wake_up_src.wu_ia) {
      printf("Activity Detectedrn");
    }		

    /* USER CODE END WHILE */

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

演示

mems

审核编辑:汤梓红

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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分