你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32CUBEMX驱动TMOS模块之驱动STHS34PF80进行人体检测(2)

[复制链接]
攻城狮Melo 发布时间:2023-11-16 16:16
套件概述
STHS34PF80 是一款非冷却、工厂校准的红外运动和存在检测传感器,工作波长在 5 µm 至 20 µm 之间。STHS34PF80 传感器设计用于测量视野内物体发出的红外辐射量。该信息由 ASIC 进行数字处理,可以对其进行编程以监控运动、存在或过热状况。

本章主要驱动STHS34PF80,进行人体检测。

微信图片_20231116161600.png


引导
在设备上电后,它会执行一个2.5毫秒的引导过程,将校准系数从嵌入式闪存下载到内部寄存器,并加载AVG_TRIM(10h)、CTRL0(17h)和SENS_DATA(1Dh)寄存器的默认内容。在引导时间内,设备的寄存器不可访问。

引导完成后,设备会自动配置为电源关闭模式。

在上电后,可以通过将CTRL2(21h)寄存器的BOOT位设置为1,重新启动引导过程,以重新加载上述寄存器的默认值。不需要切换设备电源线。

在重新启动时间内,设备的寄存器不可访问。重新启动完成后,设备会自动配置为之前的操作模式,并且BOOT位会自动清除为0。

微信图片_20231116161557.png


温度测量滤波方式
首先需要设置AVG_TRIM (10h) 寄存器用于配置温度平均值滤波的参数,以控制环境温度和目标温度测量的平滑度和稳定性。在温度测量中,可能会受到噪声和干扰的影响,这可能导致短期内测量值的波动。通过应用平均值滤波,可以平滑这些波动,从而得到更加稳定的温度数据。AVG_TRIM 寄存器中的设置会决定平均值滤波的级别,从而影响滤波的时间常数以及平滑度。

这里默认参数如下
在AVG_TRIM(10h)寄存器中写入02h // AVG_T = 8,AVG_TMOS = 32
在CTRL1(20h)寄存器中写入07h // ODR = 15 Hz

微信图片_20231116161554.png


AVG_T[1:0]: 这个设置位用于选择环境温度的平均值滤波样本数。
AVG_TMOS[2:0]: 这个设置位用于选择目标温度的平均值滤波样本数以及与之相关的噪声水平。

微信图片_20231116161550.png


参考demo中将AVG_TMOS [2:0] 和AVG_T[1:0] 分为了2个函数进行操作。

微信图片_20231116161547.png

微信图片_20231116161544.png

修改后操作如下所示。
  1. /**
  2.   * @brief  Select number of averages for object temperature.[set]
  3.   *
  4.   * @param  ctx      read / write interface definitions
  5.   * @param  val      AVG_TMOS_2, AVG_TMOS_8, AVG_TMOS_32, AVG_TMOS_128, AVG_TMOS_256, AVG_TMOS_512, AVG_TMOS_1024, AVG_TMOS_2048,
  6.   * @retval          interface status (MANDATORY: return 0 -> no Error)
  7.   *
  8.   */
  9. uint8_t sths34pf80_avg_tobject_num_set(uint8_t add, sths34pf80_avg_tobject_num_t val)
  10. {
  11.   sths34pf80_avg_trim_t avg_trim;
  12.   int32_t ret;
  13.   ret = sths34pf80_read_reg(add, STHS34PF80_AVG_TRIM, (uint8_t *)&avg_trim, 1);

  14.   if (ret == HAL_OK)
  15.   {
  16.     avg_trim.avg_tmos = ((uint8_t)val & 0x7U);
  17.     ret = sths34pf80_write_reg(add, STHS34PF80_AVG_TRIM, (uint8_t *)&avg_trim, 1);
  18.   }

  19.   return ret;
  20. }
  21. /**
  22.   * @brief  Select number of averages for ambient temperature.[set]
  23.   *
  24.   * @param  ctx      read / write interface definitions
  25.   * @param  val      AVG_T_8, AVG_T_4, AVG_T_2, AVG_T_1,
  26.   * @retval          interface status (MANDATORY: return 0 -> no Error)
  27.   *
  28.   */
  29. uint8_t sths34pf80_avg_tambient_num_set(uint8_t add, sths34pf80_avg_tambient_num_t val)
  30. {
  31.   sths34pf80_avg_trim_t avg_trim;
  32.   int32_t ret;
  33.   ret = sths34pf80_read_reg(add, STHS34PF80_AVG_TRIM, (uint8_t *)&avg_trim, 1);
  34.   if (ret == HAL_OK)
  35.   {
  36.     avg_trim.avg_t = ((uint8_t)val & 0x3U);
  37.     ret = sths34pf80_write_reg(add, STHS34PF80_AVG_TRIM, (uint8_t *)&avg_trim, 1);   
  38.   }   


  39.   return ret;
  40. }
复制代码

使用如下所示,这里设置参数为STHS34PF80_AVG_TMOS_32和STHS34PF80_AVG_T_8。
  1. /* Set averages (AVG_TAMB = 8, AVG_TMOS = 32) */
  2.   sths34pf80_avg_tobject_num_set(STHS34PF80_ADDRESS, STHS34PF80_AVG_TMOS_32);
  3.   sths34pf80_avg_tambient_num_set(STHS34PF80_ADDRESS, STHS34PF80_AVG_T_8);
复制代码

智能识别算法
STHS34PF80嵌入了智能数字算法,以支持以下三种检测模式:
• 存在检测
• 运动检测
• 环境温度冲击检测

这些算法分别使用不同的低通滤波器(LPF_P、LPF_M和LPF_A_T)。此外,存在和运动检测算法使用另一个共同的低通滤波器(LPF_P_M)。这些滤波器用于生成中间信号(TPRESENCE、TMOTION和TAMB_SHOCK),可以用于对算法本身进行微调。这些滤波器的截止频率值可以通过它们各自的位范围进行配置,这些位范围可以在LPF1(0Ch)和LPF2(0Dh)寄存器中找到,如下所示。

微信图片_20231116161540.png

寄存器LPF1 (0Ch)和LPF2 (0Dh)如下所示。

微信图片_20231116161537.png

案例中只是对滤波器进行了读取以及打印。

微信图片_20231116161534.png

修改后如下所示。

复制代码

使用块数据更新(BDU)功能
如果读取输出数据的时机与数据准备信号不同步,强烈建议在CTRL1(20h)寄存器中将BDU(块数据更新)位设置为1。

此功能可以避免读取与不同采样相关的寄存器值(输出数据的最高和最低字节)。

微信图片_20231116161530.png

案例也是设置了BDU。

微信图片_20231116161528.png

BDU在CTRL1 (20h)寄存器中。

微信图片_20231116161524.png

修改后的操作如下所示。
  1.     /* Set BDU */
  2.   sths34pf80_block_data_update_set(STHS34PF80_ADDRESS, 1);
复制代码

设置ODR速率

初始化完毕之后需要通过CTRL1(20h)寄存器中的ODR[3:0]位范围选择其中一种操作模式(连续模式),或者在CTRL2(21h)寄存器中将ONE_SHOT位设置为1(单次触发模式)。

微信图片_20231116161521.png

当配置了寄存器LPF1 (0Ch)和LPF2 (0Dh) 的LPF_P、LPF_M和LPF_A_T、LPF_P_M滤波器之后,可以去设置ODR速率。

微信图片_20231116161517.png

这里设置速率为30HZ。
  1. /* Set ODR */
  2.   sths34pf80_tmos_odr_set(STHS34PF80_ADDRESS, STHS34PF80_TMOS_ODR_AT_30Hz);
复制代码

状态寄存器
初始化完毕之后,可以通过状态寄存器STATUS (23h)获取DRDY标志位。数据就绪信号由STATUS寄存器的DRDY位表示。当新的数据可用时,此位被设置为1,并在读取FUNC_STATUS(25h)寄存器后被清除。

微信图片_20231116161513.png

主程序中会去获取改状态位,若为1,则代表数据已经准备完毕,可以进行获取和打印。

微信图片_20231116161509.png

FUNC_STATUS(25h)主要检测三个标志位:PRES_FLAG、MOT_FLAG 和 TAMB_SHOCK_FLAG,这些标志位用于检测不同类型的事件。

PRES_FLAG是存在检测标志位。当存在检测到人员存在时,此位变为1。

MOT_FLAG:运动检测标志位。当检测到运动时,此位变为1。

TAMB_SHOCK_FLAG:环境温度冲击检测标志位。当检测到环境温度冲击时,此位变为1。

微信图片_20231116161505.png

修改完毕主程序如下所示。
  1.   /* Infinite loop */
  2.   /* USER CODE BEGIN WHILE */
  3.   while (1)
  4.   {
  5.     sths34pf80_tmos_drdy_status_get(STHS34PF80_ADDRESS, &status);
  6.     if (status.drdy)
  7.     {
  8.       sths34pf80_tmos_func_status_get(STHS34PF80_ADDRESS, &func_status);
  9.       printf("-->环境温度冲击检测标志位 %d - 存在检测标志位 %d - 运动检测标志位 %d\r\n",func_status.tamb_shock_flag, func_status.pres_flag, func_status.mot_flag);
  10.    }
  11.       HAL_Delay(1000);

  12.     /* USER CODE END WHILE */

  13.     /* USER CODE BEGIN 3 */
  14.   }
  15.   /* USER CODE END 3 */
复制代码

main.c
  1.   /* USER CODE BEGIN 2 */
  2.   sths34pf80_lpf_bandwidth_t lpf_m, lpf_p, lpf_p_m, lpf_a_t;  
  3.   sths34pf80_tmos_drdy_status_t status;  
  4.   sths34pf80_tmos_func_status_t func_status;  
  5.   
  6.   
  7.   
  8.   
  9.       HAL_Delay(200);  
  10.   printf("123");
  11.   uint8_t STHS34PF80_ID =STHS34PF80_getChipID(STHS34PF80_ADDRESS);
  12.   printf("STHS34PF80_ID=0x%x\n",STHS34PF80_ID);  
  13.   if (STHS34PF80_ID != 0xD3)
  14.     while(1);
  15. /* Set averages (AVG_TAMB = 8, AVG_TMOS = 32) */
  16.   sths34pf80_avg_tobject_num_set(STHS34PF80_ADDRESS, STHS34PF80_AVG_TMOS_2048);
  17.   sths34pf80_avg_tambient_num_set(STHS34PF80_ADDRESS, STHS34PF80_AVG_T_8);

  18.   /* read filters */
  19.   sths34pf80_lpf_m_bandwidth_get(STHS34PF80_ADDRESS, &lpf_m);
  20.   sths34pf80_lpf_p_bandwidth_get(STHS34PF80_ADDRESS, &lpf_p);
  21.   sths34pf80_lpf_p_m_bandwidth_get(STHS34PF80_ADDRESS, &lpf_p_m);
  22.   sths34pf80_lpf_a_t_bandwidth_get(STHS34PF80_ADDRESS, &lpf_a_t);

  23. printf("lpf_m: %02d, lpf_p: %02d, lpf_p_m: %02d, lpf_a_t: %02d\r\n", lpf_m, lpf_p, lpf_p_m, lpf_a_t);
  24.   
  25.     /* Set BDU */
  26.   sths34pf80_block_data_update_set(STHS34PF80_ADDRESS, 1);

  27.   /* Set ODR */
  28.   sths34pf80_tmos_odr_set(STHS34PF80_ADDRESS, STHS34PF80_TMOS_ODR_AT_1Hz);

  29.     int32_t cnt = 0;
  30.   
  31.   /* USER CODE END 2 */

  32.   /* Infinite loop */
  33.   /* USER CODE BEGIN WHILE */
  34.   while (1)
  35.   {
  36.     sths34pf80_tmos_drdy_status_get(STHS34PF80_ADDRESS, &status);
  37.     if (status.drdy)
  38.     {
  39.       sths34pf80_tmos_func_status_get(STHS34PF80_ADDRESS, &func_status);
  40.       printf("-->环境温度冲击检测标志位 %d - 存在检测标志位 %d - 运动检测标志位 %d\r\n",func_status.tamb_shock_flag, func_status.pres_flag, func_status.mot_flag);
  41.    }
  42.       HAL_Delay(1000);

  43.     /* USER CODE END WHILE */

  44.     /* USER CODE BEGIN 3 */
  45.   }
  46.   /* USER CODE END 3 */
复制代码

转载自:记帖
如有侵权请联系删除



收藏 评论0 发布时间:2023-11-16 16:16

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版