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

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

3天内不再提示

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

嵌入式单片机MCU开发 来源:嵌入式单片机MCU开发 2026-06-07 13:53 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

概述

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

需要样片的可以加群申请:615061293 。

视频教学

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

样品申请

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

源码下载

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

硬件准备

首先需要准备一个开发板,这里我准备的是自己绘制的开发板,需要的可以进行申请。

主控为STM32H503CB,加速度计为LIS2DW12。

参考程序

[https://github.com/CoreMaker-lab/STM32H503_LIS2DW12]

[https://gitee.com/CoreMaker/STM32H503_LIS2DW12]

生成STM32CUBEMX

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

串口配置

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

配置串口,速率为115200。

IIC配置

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

CS和SA0设置

INT1设置

数据准备完毕可以通过INT1获取中断信号

INT1接入PB1,需要配置PB1为输入模式。

配置如下所示。

ICASHE

修改堆栈

若无法正常运行需要修改优化等级。

串口重定向

打开魔术棒,勾选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为高电平。

HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET);
  HAL_GPIO_WritePin(SA0_GPIO_Port, SA0_Pin, GPIO_PIN_SET);
    HAL_Delay(100);

获取ID

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

lis2dw12_device_id_get为获取函数。

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

/* Initialize mems driver interface */
  stmdev_ctx_t dev_ctx;
  dev_ctx.write_reg = platform_write;
  dev_ctx.read_reg = platform_read;
  dev_ctx.mdelay = platform_delay;
  dev_ctx.handle = &SENSOR_BUS;
  /* Initialize platform specific hardware */
//  platform_init();
  /* 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);

BDU设置

在很多传感器中,数据通常被存储在输出寄存器中,这些寄存器分为两部分:MSB和LSB。这两部分共同表示一个完整的数据值。例如,在一个加速度计中,MSB和LSB可能共同表示一个加速度的测量值。 连续更新模式(BDU = '0'):在默认模式下,输出寄存器的值会持续不断地被更新。这意味着在你读取MSB和LSB的时候,寄存器中的数据可能会因为新的测量数据而更新。这可能导致一个问题:当你读取MSB时,如果寄存器更新了,接下来读取的LSB可能就是新的测量值的一部分,而不是与MSB相对应的值。这样,你得到的就是一个“拼凑”的数据,它可能无法准确代表任何实际的测量时刻。 块数据更新(BDU)模式(BDU = '1'):当激活BDU功能时,输出寄存器中的内容不会在读取MSB和LSB之间更新。这就意味着一旦开始读取数据(无论是先读MSB还是LSB),寄存器中的那一组数据就被“锁定”,直到两部分都被读取完毕。这样可以确保你读取的MSB和LSB是同一测量时刻的数据,避免了读取到代表不同采样时刻的数据。 简而言之,BDU位的作用是确保在读取数据时,输出寄存器的内容保持稳定,从而避免读取到拼凑或错误的数据。这对于需要高精度和稳定性的应用尤为重要。 可以向CTRL2 (21h)的BDU寄存器写入1进行开启。

/* Enable Block Data Update */
  lis2dw12_block_data_update_set(&dev_ctx, PROPERTY_ENABLE);

设置传感器的量程

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)的四分之一。

/* Configure filtering chain
   * Accelerometer - filter path / bandwidth
   */
  lis2dw12_filter_path_set(&dev_ctx, LIS2DW12_LPF_ON_OUT);
  lis2dw12_filter_bandwidth_set(&dev_ctx, LIS2DW12_ODR_DIV_4);

配置电源模式

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

/* Configure power mode */
  lis2dw12_power_mode_set(&dev_ctx,
                          LIS2DW12_CONT_LOW_PWR_LOW_NOISE_12bit)

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

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

/* Set wake-up duration
   * Wake up duration event 1LSb = 1 / ODR
   */
  lis2dw12_wkup_dur_set(&dev_ctx, 2);

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

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

/* Set sleep duration
   * Duration to go in sleep mode (1 LSb = 512 / ODR)
   */
  lis2dw12_act_sleep_dur_set(&dev_ctx, 2);

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

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

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

/* Set Activity wake-up threshold
   * Threshold for wake-up 1 LSB = FS_XL / 64
   */
  lis2dw12_wkup_threshold_set(&dev_ctx, 2);

配置唤醒中断函数

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

    if (all_source.wake_up_src.wu_ia) {
      printf("Activity Detectedrn");
    }
        HAL_Delay(10);            
    /* USER CODE END WHILE */

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

演示

在这里插入图片描述

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

    关注

    5222

    文章

    21244

    浏览量

    348895
  • 寄存器
    +关注

    关注

    31

    文章

    5647

    浏览量

    133769
  • 加速度计
    +关注

    关注

    6

    文章

    855

    浏览量

    48926
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

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

    检测活动和静止状态主要用途是在嵌入式应用中实时监控加速度计活动
    的头像 发表于 12-18 10:47 2985次阅读
    三轴<b class='flag-5'>加速度计</b><b class='flag-5'>LIS2DW12</b><b class='flag-5'>开发</b>(<b class='flag-5'>3</b>)----<b class='flag-5'>检测</b><b class='flag-5'>活动</b><b class='flag-5'>和静止</b><b class='flag-5'>状态</b>

    e2studio开发三轴加速度计LIS2DW12(4)----测量倾斜度

    本文将介绍如何驱动和利用LIS2DW12三轴加速度计的倾斜检测理论和倾斜角测量方法。一般来说,这里描述的程序也可以应用于三轴模拟或数字加速度计,这取决于它们各自的规格。
    的头像 发表于 05-17 15:00 3266次阅读
    e<b class='flag-5'>2</b>studio<b class='flag-5'>开发</b>三轴<b class='flag-5'>加速度计</b><b class='flag-5'>LIS2DW12</b>(4)----测量倾斜度

    e2studio开发三轴加速度计LIS2DW12(1)----轮询获取加速度数据

    本文将介绍如何驱动和利用LIS2DW12传感器,实现精确的运动感应功能。 IS2DW12是一款高性能、超低功耗的三轴线性加速度计,属于“femto”系列,利用了成熟的微机械加速度计
    的头像 发表于 08-09 14:54 3457次阅读
    e<b class='flag-5'>2</b>studio<b class='flag-5'>开发</b>三轴<b class='flag-5'>加速度计</b><b class='flag-5'>LIS2DW12</b>(1)----轮询获取<b class='flag-5'>加速度</b>数据

    三轴加速度计LIS2DW12开发(1)----轮询获取加速度数据

    概述 本文将介绍如何驱动和利用LIS2DW12传感器,实现精确的运动感应功能。 IS2DW12是一款高性能、超低功耗的三轴线性加速度计,属于“femto”系列,利用了成熟的微机械加速度计
    发表于 07-02 15:52

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

    , LIS2DW12_XL_ODR_200Hz); 检测活动状态 可以不断地检查 LIS2DW12 加速
    发表于 07-02 15:55

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

    不断地检查 LIS2DW12 加速度计状态,以确定是否检测活动静止(无
    发表于 07-09 20:29

    加速度计LIS2DW12开发(1)----轮询获取加速度数据

    /92879989 硬件准备 首先需要准备一个开发板,这里我准备的是自己绘制的开发板,需要的可以进行申请。 主控为STM32H503CB,加速度计LIS2DW12。 参考程序 ht
    发表于 07-10 01:34

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

    ;dev_ctx, LIS2DW12_XL_ODR_200Hz); 检测活动状态 可以不断地检查 LIS2DW12
    发表于 07-10 01:37

    加速度计LIS2DW12开发(4)----测量倾斜度

    概述 本文将介绍如何驱动和利用LIS2DW12三轴加速度计的倾斜检测理论和倾斜角测量方法。一般来说,这里描述的程序也可以应用于三轴模拟或数字加速度计,这取决于它们各自的规格。 需要样片
    发表于 07-10 01:38

    LIS2DW12的应用笔记

    本文档旨在提供 ST 的 LIS2DW12 运动传感器相关的使用信息和应用提示。LIS2DW12 是系统级封装的 3D 数字加速度计,具有数字 I²C/SPI 串口标准输出,在高分辨率
    发表于 09-13 06:58

    LIS2DW12 3D数字加速度计应用笔记

    电子发烧友网站提供《LIS2DW12 3D数字加速度计应用笔记.pdf》资料免费下载
    发表于 07-31 09:40 1次下载
    <b class='flag-5'>LIS2DW12</b> <b class='flag-5'>3</b>D数字<b class='flag-5'>加速度计</b>应用笔记

    e2studio开发三轴加速度计LIS2DW12(1)----轮询获取加速度数据

    本文将介绍如何驱动和利用LIS2DW12传感器,实现精确的运动感应功能。 IS2DW12是一款高性能、超低功耗的三轴线性加速度计,属于“femto”系列,利用了成熟的微机械加速度计
    的头像 发表于 01-09 16:21 2604次阅读
    e<b class='flag-5'>2</b>studio<b class='flag-5'>开发</b>三轴<b class='flag-5'>加速度计</b><b class='flag-5'>LIS2DW12</b>(1)----轮询获取<b class='flag-5'>加速度</b>数据

    三轴加速度计LIS2DW12开发(4)----测量倾斜度

    本文将介绍如何驱动和利用LIS2DW12三轴加速度计的倾斜检测理论和倾斜角测量方法。一般来说,这里描述的程序也可以应用于三轴模拟或数字加速度计,这取决于它们各自的规格。
    的头像 发表于 05-16 17:18 4216次阅读
    三轴<b class='flag-5'>加速度计</b><b class='flag-5'>LIS2DW12</b><b class='flag-5'>开发</b>(4)----测量倾斜度

    e2studio开发三轴加速度计LIS2DW12(4)----测量倾斜度

    本文将介绍如何驱动和利用LIS2DW12三轴加速度计的倾斜检测理论和倾斜角测量方法。一般来说,这里描述的程序也可以应用于三轴模拟或数字加速度计,这取决于它们各自的规格。
    的头像 发表于 08-09 16:00 3217次阅读
    e<b class='flag-5'>2</b>studio<b class='flag-5'>开发</b>三轴<b class='flag-5'>加速度计</b><b class='flag-5'>LIS2DW12</b>(4)----测量倾斜度

    加速度计LIS2DW12开发(1)----轮询获取加速度数据

    本文将介绍如何驱动和利用LIS2DW12传感器,实现精确的运动感应功能。 LIS2DW12是一款高性能、超低功耗的三轴线性加速度计,属于“femto”系列,利用了成熟的微机械加速度计
    的头像 发表于 06-02 10:43 3172次阅读
    <b class='flag-5'>加速度计</b><b class='flag-5'>LIS2DW12</b><b class='flag-5'>开发</b>(1)----轮询获取<b class='flag-5'>加速度</b>数据