水压计ILPS28QSW开发(3)----Qvar触摸电容配置

125 篇文章 59 订阅
81 篇文章 3 订阅
#AI是在帮助开发者还是取代他们?#

概述

Qvar,全称为电荷变化检测(Qvar stands for “Quasi-static VARiation”),是一种用于检测电荷变化的技术。这种技术通常用于传感器和其他电子设备中,特别是在惯性测量单元(IMU)和微机电系统(MEMS)技术中。Qvar 技术可以用于检测微小的电荷变化,这些变化可能是由于物理运动、环境变化或其他因素导致的。
在 ILPS28QSW 这类先进的 MEMS 中,Qvar 技术用于增强用户界面功能,如轻触、双击、三击、长按或滑动手势。它通过检测和解析与这些手势相关的微小电荷变化,来实现高度精准和灵敏的用户交互。
需要样片的可以加群申请:615061293 。
在这里插入图片描述

视频教学

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

水压计ILPS28QSW开发(3)----Qvar触摸电容配置

样品申请

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

完整代码下载

Qvar功能

Qvar(电荷变化检测)功能可以通过外部电极实现,用于用户接口,例如:
水泄漏检测
轻拍检测
双击检测
长按检测
左/右滑动检测
这些功能为传感器在智能设备和工业应用中提供了更多可能性。

生成STM32CUBEMX

用STM32CUBEMX生成例程,这里使用MCU为STM32H503CB。
配置时钟树,配置时钟为250M。
在这里插入图片描述

串口配置

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

在这里插入图片描述
配置串口,速率为2000000。

在这里插入图片描述

IIC配置

在这里插入图片描述
配置IIC速度为1M。
在这里插入图片描述

串口重定向

打开魔术棒,勾选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/ilps28qsw-pid

获取ID

可以向WHO_AM_I (0Fh)获取固定值,判断是否为0xB4
在这里插入图片描述

ilps28qsw_id_get为获取函数。
在这里插入图片描述

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

  /* Check device ID */
  ilps28qsw_id_get(&dev_ctx, &id);
	printf("ILPS28QSW_ID=0x%x,id.whoami=0x%x\n",ILPS28QSW_ID,id.whoami);	
  if (id.whoami != ILPS28QSW_ID)
    while(1);

复位操作

ilps28qsw_init_set为重置函数。

在这里插入图片描述

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

  /* Restore default configuration */
  ilps28qsw_init_set(&dev_ctx, ILPS28QSW_RESET);
  do {
    ilps28qsw_status_get(&dev_ctx, &status);
  } while (status.sw_reset);

BDU设置

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

在这里插入图片描述

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

  /* Set bdu and if_inc recommended for driver usage */
  ilps28qsw_init_set(&dev_ctx, ILPS28QSW_DRV_RDY);

设置总线接口

  /* Select bus interface */
  bus_mode.filter = ILPS28QSW_AUTO;
  ilps28qsw_bus_mode_set(&dev_ctx, &bus_mode);

设置速率

设置速率和量程可以通过CTRL_REG1 (10h)和CTRL_REG2 (11h)进行设置。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  /* Set Output Data Rate */
  md.odr = ILPS28QSW_200Hz;
  md.avg = ILPS28QSW_4_AVG;
  ilps28qsw_mode_set(&dev_ctx, &md);

开启QVAR

通过配置CTRL_REG3 (12h)寄存器,可以根据需要启用(AH)/ Qvar功能。

在这里插入图片描述

  /* Enable AH/QVAR function */
  ilps28qsw_ah_qvar_en_set(&dev_ctx, 1);	

QVAR外部电路

下图可以了解如何配置和使用ILPS28QSW传感器的模拟枢纽和Qvar功能,包括其外部连接、寄存器配置及操作模式,从而有效地利用该传感器的多功能特性。
在这里插入图片描述

初始化代码

  /* USER CODE BEGIN 2 */
  ilps28qsw_all_sources_t all_sources;
  ilps28qsw_bus_mode_t bus_mode;
  ilps28qsw_stat_t status;
  stmdev_ctx_t dev_ctx;
  ilps28qsw_id_t id;
  ilps28qsw_md_t md;

  /* Initialize mems driver interface */
  dev_ctx.write_reg = platform_write;
  dev_ctx.read_reg = platform_read;
  dev_ctx.mdelay = platform_delay;
  dev_ctx.handle = &SENSOR_BUS;

  /* Init test platform */
//  platform_init(dev_ctx.handle);
  /* Wait sensor boot time */
  platform_delay(BOOT_TIME);

  /* Check device ID */
  ilps28qsw_id_get(&dev_ctx, &id);
	printf("ILPS28QSW_ID=0x%x,id.whoami=0x%x\n",ILPS28QSW_ID,id.whoami);	
  if (id.whoami != ILPS28QSW_ID)
    while(1);

  /* Restore default configuration */
  ilps28qsw_init_set(&dev_ctx, ILPS28QSW_RESET);
  do {
    ilps28qsw_status_get(&dev_ctx, &status);
  } while (status.sw_reset);

  /* Set bdu and if_inc recommended for driver usage */
  ilps28qsw_init_set(&dev_ctx, ILPS28QSW_DRV_RDY);

  /* Select bus interface */
  bus_mode.filter = ILPS28QSW_AUTO;
  ilps28qsw_bus_mode_set(&dev_ctx, &bus_mode);

  /* Set Output Data Rate */
  md.odr = ILPS28QSW_200Hz;
  md.avg = ILPS28QSW_4_AVG;
  ilps28qsw_mode_set(&dev_ctx, &md);

  /* Enable AH/QVAR function */
  ilps28qsw_ah_qvar_en_set(&dev_ctx, 1);
  /* USER CODE END 2 */

获取Qvar数据

对于Qvar数据是否准备好,可以查看STATUS (27h)的P_DA位,判断是否有新数据到达。
在这里插入图片描述

对于压强和QVAR数据,主要在PRESS_OUT_XL (28h)-PRESS_OUT_H (2Ah)。

在这里插入图片描述

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    static ilps28qsw_ah_qvar_data_t data;
    /* Read output only if new values are available */
    ilps28qsw_all_sources_get(&dev_ctx, &all_sources);
    if ( all_sources.drdy_pres ) {
      ilps28qsw_ah_qvar_data_get(&dev_ctx, &data);

      printf("QVAR [mV]:%6.2f [LSB]:%d\r\n", data.mv, data.lsb);

    }		
		
    /* USER CODE END WHILE */

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

测试结果

未触摸。

在这里插入图片描述

触摸上按键。

在这里插入图片描述

触摸下按键。

在这里插入图片描述

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

记帖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值