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

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

3天内不再提示

三轴加速度计LIS2DW12开发(2)----基于中断信号获取加速度数据

嵌入式单片机MCU开发 来源:嵌入式单片机MCU开发 作者:嵌入式单片机MCU开 2023-12-18 10:46 次阅读

概述

本文将介绍实时获取和处理加速度数据。程序的核心流程包括初始化硬件接口、配置加速度计的参数,以及通过轮询检查中断信号来不断读取加速度数据。

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

在这里插入图片描述

视频教学

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

样品申请

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

源码下载

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

生成STM32CUBEMX

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

在这里插入图片描述

串口配置

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

在这里插入图片描述
配置串口。

在这里插入图片描述

IIC配置

在这里插入图片描述
配置IIC为快速模式,速度为400k。
在这里插入图片描述

CS和SA0设置

在这里插入图片描述

INT1设置

数据准备完毕可以通过INT1获取中断信号。
在这里插入图片描述

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

在这里插入图片描述

配置如下所示。
在这里插入图片描述

串口重定向

打开魔术棒,勾选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);

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);

开启INT1中断

设置中断通知方式。LIS2DW12_INT_LATCHED 表明使用锁存型中断,意味着中断信号会保持激活状态,直到被读取或者清除。
在这里插入图片描述

lis2dw12_int_notification_set(&dev_ctx, LIS2DW12_INT_LATCHED);

设置中断引脚的极性。LIS2DW12_ACTIVE_LOW 指示中断引脚在激活时是低电平。
在这里插入图片描述

lis2dw12_pin_polarity_set(&dev_ctx, LIS2DW12_ACTIVE_LOW);

读取 INT1 引脚的当前中断路由配置到 ctrl4_int1_pad 结构体中,(CTRL4_INT1_PAD_CTRL, 地址为 0x23h)这个寄存器用于配置加速度计的中断1引脚(INT1)的行为。
INT1_6D: 当设置为1时,6D定位识别的中断会被路由到INT1引脚。
INT1_SINGLE_TAP: 单击识别中断的启用/禁用。
INT1_WU: 唤醒识别中断的启用/禁用。
INT1_FF: 自由落体识别中断的启用/禁用。
INT1_TAP: 双击识别中断的启用/禁用。
INT1_DIFF5: FIFO满识别中断的启用/禁用。
INT1_FTH: FIFO阈值中断的启用/禁用。
INT1_DRDY: 数据就绪(Data-Ready)中断的启用/禁用。

在这里插入图片描述

需要将INT1_DRDY置为1。
然后再将数据写入到(CTRL4_INT1_PAD_CTRL, 地址为 0x23h)这个寄存器钟。

lis2dw12_pin_int1_route_get(&dev_ctx, &ctrl4_int1_pad);
  ctrl4_int1_pad.int1_drdy = PROPERTY_ENABLE;
  lis2dw12_pin_int1_route_set(&dev_ctx, &ctrl4_int1_pad);

设置传感器的量程

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(&dev_ctx, LIS2DW12_ODR_DIV_10);设置过滤器的带宽。LIS2DW12_ODR_DIV_10 表明带宽设置为输出数据率(ODR)的十分之一。

配置电源模式

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

设置输出数据速率

lis2dw12_data_rate_set(&dev_ctx, LIS2DW12_XL_SET_SW_TRIG);设置加速度计的数据输出速率。LIS2DW12_XL_SET_SW_TRIG 可能表示使用软件触发来设置数据输出速率。

/* Wait sensor boot time */
  platform_delay(BOOT_TIME);
  /* Check device ID */
  lis2dw12_device_id_get(&dev_ctx, &whoamI);

  if (whoamI != LIS2DW12_ID)
    while (1) {
      /* manage here device not found */
    }

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

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

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

  lis2dw12_int_notification_set(&dev_ctx, LIS2DW12_INT_LATCHED);
  lis2dw12_pin_polarity_set(&dev_ctx, LIS2DW12_ACTIVE_LOW);
  lis2dw12_pin_int1_route_get(&dev_ctx, &ctrl4_int1_pad);
  ctrl4_int1_pad.int1_drdy = PROPERTY_ENABLE;
  lis2dw12_pin_int1_route_set(&dev_ctx, &ctrl4_int1_pad);
  /* Set full scale */
  lis2dw12_full_scale_set(&dev_ctx, LIS2DW12_2g);
  /* Configure filtering chain accelerometer */
  lis2dw12_filter_path_set(&dev_ctx, LIS2DW12_LPF_ON_OUT);
  lis2dw12_filter_bandwidth_set(&dev_ctx, LIS2DW12_ODR_DIV_10);
  /* Configure power mode and Output Data Rate */
  lis2dw12_power_mode_set(&dev_ctx, LIS2DW12_CONT_LOW_PWR_12bit);
  lis2dw12_data_rate_set(&dev_ctx, LIS2DW12_XL_SET_SW_TRIG);

中断判断加速度数据状态

通过判断INT1管脚来判断数据是否准备完毕。
如果电平为低电平说明加速度数据已经准备完毕。

数据在28h-2Dh中。
在这里插入图片描述

在这里插入图片描述
加速度数据首先以原始格式(通常是整数)读取,然后需要转换为更有意义的单位,如毫重力(mg)。这里的转换函数 lis2dw12_from_fs2_to_mg() 根据加速度计的量程(这里假设为±2g)将原始数据转换为毫重力单位。
acceleration_mg[0] = lis2dw12_from_fs2_to_mg(data_raw_acceleration[0]); 等三行代码分别转换 X、Y、Z 轴的加速度数据。

在这里插入图片描述

● LIS2DW12 加速度计通常会有一个固定的位分辨率,比如 16 位(即输出值是一个 16 位的整数)。这意味着加速度计可以输出的不同值的总数是 2^16=65536。这些值均匀地分布在 -2g 到 +2g 的范围内。
● 因此,这个范围(4g 或者 4000 mg)被分成了 65536 个步长。
● 每个步长的大小是 4000 mg/65536≈0.061 mg/LSB
所以,函数中的乘法 ((float_t)lsb) * 0.061f 是将原始的整数值转换为以毫重力(mg)为单位的加速度值。这个转换对于将加速度计的原始读数转换为实际的物理测量值是必需的。

/* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	/* polling on DRDY signal */
    if (GPIO_PIN_RESET == HAL_GPIO_ReadPin(INT1_GPIO_Port, INT1_Pin)) {
      /* Read acceleration data */
      memset(data_raw_acceleration, 0x00, 3 * sizeof(int16_t));
      lis2dw12_acceleration_raw_get(&dev_ctx, data_raw_acceleration);
      acceleration_mg[0] = lis2dw12_from_fs2_lp1_to_mg(
                             data_raw_acceleration[0]);
      acceleration_mg[1] = lis2dw12_from_fs2_lp1_to_mg(
                             data_raw_acceleration[1]);
      acceleration_mg[2] = lis2dw12_from_fs2_lp1_to_mg(
                             data_raw_acceleration[2]);		
		
      lis2dw12_data_rate_set(&dev_ctx, LIS2DW12_XL_SET_SW_TRIG);
			printf("Acceleration [mg]:X=%4.2ftY=%4.2ftZ=%4.2frn",acceleration_mg[0], acceleration_mg[1], acceleration_mg[2]);

    }		
		
    /* USER CODE END WHILE */

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

演示

在这里插入图片描述

审核编辑:汤梓红

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

    关注

    128

    文章

    3734

    浏览量

    188680
  • 三轴加速度计

    关注

    1

    文章

    20

    浏览量

    13283
  • 三轴磁力计
    +关注

    关注

    0

    文章

    7

    浏览量

    8342
  • stm32cubemx
    +关注

    关注

    5

    文章

    260

    浏览量

    14447
收藏 人收藏

    评论

    相关推荐

    加速度计加速度计的使用区别?

    有个问题请教一下:在静态测量的情况下,两加速度计在测得X、Y上的加速度后,是不是就可以根据这两个值和重力加速度g算出Z
    发表于 12-29 06:06

    MSP430F5508对LIS2DH12加速度计的驱动设计

    MSP430F5508对LIS2DH12加速度计的驱动设计,见附件
    发表于 09-23 10:46

    USB微机电加速度计

    电压放大器的加速度传感器,IEPE是压电集成电路的缩写。因为加速度传感器产生的电量很小,因此传感器产生的电信号容易受到噪声干扰,需要用灵敏的电子器件对其进行放大和信号调理。网络分析仪
    发表于 07-10 11:09

    请问两加速度计加速度计的使用区别是什么?

    有个问题请教一下:在静态测量的情况下,两加速度计在测得X、Y上的加速度后,是不是就可以根据这两个值和重力加速度g算出Z
    发表于 08-08 09:12

    加速度计的技术规格详解

    忽略不计。封装对齐误差:加速度计检测与封装参考的夹角(参加图2)。 "输入对齐"是此误差的另一种术语。 封装对齐误差的单位为"度"。
    发表于 10-18 10:47

    加速度计读数问题

    你好, 我正在使用带有STM(stm32l432kb)控制器的STM加速度计LIS2DE12)。从加速度计获取读数时,它会持续提供随机值。即使它在稳定的位置显示虚假价值。在某些方面
    发表于 04-03 13:15

    2476-100加速度计

    `SDI的高级型号2470和2476高性能MEMS可变电容式加速度计坚固耐用,即插即用适用于各种苛刻要求的测量设备应用程序。两种型号的性能均优于在零至中频应用中使用的温度经历大的或快速的温度变化
    发表于 05-27 19:18

    2460-010加速度计

    `SDI的2460和2466型低成本MEMS可变电容加速度计是坚固的即插即用测量设备,适用于各种苛刻的应用程序。两种型号在零到中等方面都出类拔萃频率商业和工业应用,特别是在可靠的情况下性能,极低
    发表于 05-28 14:41

    设计具有成本效益的加速度计

    板)获取加速度数据的示例,但只有少数项目足以用于地震环境或建筑监测。谈到 MEMS 加速度计传感器,我们可以找到非常好的用于地震目的的 MEMS 传感器,但它们非常昂贵(注意你可以以相同的价格购买专业
    发表于 08-23 06:20

    LIS2DW12定向位问题求解

    您好,我们正在使用加速度计 LIS2DW12。根据数据表中的图表。如果加速度计处于这种状态,我们会看到 zlzh 方向位升高了吗?
    发表于 01-03 09:35

    是否可以使用LIS2DW12加速度计进行倾斜角度检测呢?

    我正在使用 LIS2DW12 加速度计进行倾斜角度检测是否可以如图所示检测两个方向的倾斜角度(A和B)并在唤醒中断模式下触发中断事件?在 6d 方向模式下是可能的,但我需要唤醒
    发表于 01-05 07:01

    关于LIS2HH12TR读加速度计的问题求解

    大家好: 我在使用LIS2HH12: 3 “pico”加速度计时遇到了 读数不准的问题,请大家看一下。 首先我的应用场景:安装在设备上,FPGA通过IIC时刻读出当前的位置,不会有突发的振动
    发表于 08-07 14:45

    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> 3D数字<b class='flag-5'>加速度计</b>应用笔记

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

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