当前位置: 首页 > article >正文

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

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

  • 概述
  • 视频教学
  • 样品申请
  • 源码下载
  • 生成STM32CUBEMX
  • 串口配置
  • IIC配置
  • CS和SA0设置
  • INT1设置
  • 串口重定向
  • 参考程序
  • 初始换管脚
  • 获取ID
  • 复位操作
  • BDU设置
  • 开启INT1中断
  • 设置传感器的量程
  • 配置过滤器链
  • 配置电源模式
  • 设置输出数据速率
  • 中断判断加速度数据状态
  • 演示

概述

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

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

在这里插入图片描述

视频教学

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

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

样品申请

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.2f\tY=%4.2f\tZ=%4.2f\r\n",acceleration_mg[0], acceleration_mg[1], acceleration_mg[2]);

    }		
		
    /* USER CODE END WHILE */

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

演示

在这里插入图片描述


http://www.kler.cn/a/159289.html

相关文章:

  • Spring:bean的配置
  • Spring Boot 中 Druid 连接池与多数据源切换的方法
  • Easyui ComboBox 数据加载完成之后过滤数据
  • java算法性能调优:详尽探讨时间复杂度与空间复杂度的分析与优化“
  • 深入探索 TypeScript:从基础到高级特性
  • Android 项目依赖库无法找到的解决方案
  • 统信UOS_麒麟KYLINOS上安装特定版本python
  • MVC、MVP、MVVM模式的区别
  • std::move
  • C++h弧度转成角度
  • 备战春招——12.05算法
  • IntelRealSense深度相机D455在ROS1运行中的消息内容
  • Linux定时循环备份指定文件或文件夹,每月永久备份留1份
  • Linux基础命令(测试相关)
  • Qt篇——QChartView实现鼠标滚轮缩放、鼠标拖拽平移、鼠标双击重置缩放平移、曲线点击显示坐标
  • 【Polar靶场WEB签到】
  • ES通过抽样agg聚合性能提升3-5倍
  • 【算法思考记录】力扣2477. 到达首都的最少油耗【JavaScript,深度优先搜索】
  • flink运行报Exception in thread “main“ java.lang.IllegalStateException
  • Linux 基础知识整理(三)
  • 【开源】基于Vue.js的公司货物订单管理系统
  • Android Studio的笔记--三元表达式、布尔运算符、与() 或(||) 非(!)
  • 一、技术体系结构
  • 圈子社交系统:打破时间与空间的限制。APP小程序H5三端源码交付,支持二开!
  • Python:可以做什么?
  • Go中的延时执行魔法:深入浅出defer用法