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

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

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

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

概述

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

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

在这里插入图片描述

视频教学

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

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

样品申请

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

源码下载

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

开启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_8g);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_4);:设置过滤器的带宽。这里的设置是将输出数据率(ODR)除以4,进一步决定了滤波器的截止频率。

配置电源模式

lis2dw12_power_mode_set(&dev_ctx, LIS2DW12_HIGH_PERFORMANCE);:这个调用设置加速度计的电源模式为高性能模式。这通常意味着更高的功耗,但提供更精确的测量。

设置输出数据速率

lis2dw12_data_rate_set(&dev_ctx, LIS2DW12_XL_ODR_25Hz);:设置加速度计的输出数据速率为每秒25次。输出数据速率决定了传感器多久采集一次数据,并影响数据的实时性和功耗。

  /* USER CODE BEGIN 2 */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);	/* 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 */}/* 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_cs_mode_set(&dev_ctx, LIS2DW12_PULL_UP_DISCONNECT);//lis2dw12_i2c_interface_set(&dev_ctx, LIS2DW12_I2C_DISABLE);//lis2dw12_spi_mode_set(&dev_ctx, LIS2DW12_SPI_3_WIRE);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);/* USER CODE END 2 */

中断判断加速度数据状态

通过判断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]:%4.2f\t%4.2f\t%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.dtcms.com/a/524949.html

相关文章:

  • **发散创新:金丝雀发布的技术深度解析与实现**随着技术的不断进步,金丝雀发布作为一种重要的软件发布策略,被广泛应用于生
  • 矽塔 SA8208 36V输入耐压 8A过流保护阈值 大功率过压过流保护芯片
  • 在网上做翻译的网站网站建设费属于哪个会计科目
  • 网站如何收录沭阳网站建设方案
  • 东丽集团网站建设什么网站可以接图做图
  • SAP SD交货单执行跟踪报表分享
  • vs code工具新手操作技巧
  • Delft3D建模、水动力模拟方法及在地表水环境影响评价中的实践技术应用
  • Python多态与继承详解
  • 详解c++中的文件流
  • 2017网站建设费用html网页设计毕业设计作品
  • 单页响应式网站模板html5电商网页制作
  • PaddleOCR-VL:紧凑型0.9B参数模型在多语言文档解析领域表现卓越
  • syssetup!Wizard函数分析之comctl32!_CreatePropertySheetPage
  • Python爬虫数据存储:MySQL实战教程
  • 网站源码免费的电影网站页面seo
  • 青岛建设工程信息网站银川360推广 网站建设
  • 阿里云国际站GPU:怎么使用Workbench工具以SSH协议登录Linux实例?
  • Linux中内核基础设置函数do_basic_setup的实现
  • 乳腺癌良性和恶性图像分类数据集
  • C++通用业务标准库中常用接口函数总结
  • 永久免费的移动建站平台网站备案没通过
  • 汕头建网站国家高新技术企业认定有什么好处
  • 【数论】欧拉定理 扩展欧拉定理
  • 正能量网站入口免费安全想学做网站从哪里入手
  • 南宁网站制作最新招聘信息wordpress文章插件
  • 基于python大数据技术的医疗数据分析与研究
  • 1.Go基础知识入门
  • Linux内核InfiniBand连接管理器(CM)深度解析:架构设计与实现原理
  • 网站网站开发者犯法吗网站负责人