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

【经验分享】基于STM32F103C8T6(HAL库)的HC-SR501红外人体传感及HC-SR04超声波测距

[复制链接]
STMCU小助手 发布时间:2022-4-15 10:00
前言
我在上一篇文章中驱动了HC-SR501红外人体传感模块,但在测试过程中发现,这个模块的热释电探头过于灵敏了,甚至有的时候往上哈气,会因为检测到类似于人体的温度而误判为感应到人体,所以为了减少误判概率,我打算再添加一个测距模块,在红外感应到人体时,再次判断人体与传感器的距离,在满足预设的距离范围时,才确定有人体接近,进行后续操作。
一、模块简介
HC-SR501红外人体感应模块资料介绍:
探究人体红外传感器HC-SR501

HC-SR04超声波测距模块资料介绍:

[}NY0UME6`THJ~NGH(UFEM5.png

P93W`1KJ@3I1B%9T~XHA%3M.png

工作原理:

2440fa92274644939b0de5e59ef1852b.png

TTPZ0O8GJDMQZXWX}%P2A.png

简而言之:
给Trig一个10μS以上的高电平,模块开始工作,模块内自动发送八个40khz方波,并自主检测是否有电波返回。此时需要检测Echo处的电平,当为高电平的时候记一个时间;当Echo出为低电平的时候再记一个时间,这两个时间的差就是高电平持续的时间,最后用测距公式进行计算。

二、配置CubeMX
1、新建工程;
2、配置时钟源,在RCC里面的HSE配置的是晶振时钟;
3、配置程序烧录引脚SYS为SWD模式;
4、配置GPIO输出口,配置一个LED灯(我的板子是PC13),起到检测到人体时的指示作用;
5、配置GPIO输入口,用来读取HC-SR501模块的输出电平,我选的是PA1口;
6、配置GPIO输入口,用来检测HC-SR04超声波测距模块的回响信号输出,我选择PB5口,命名为HC_SR04_Echo_Pin;
7、配置GPIO输出口,用来触发HC-SR04超声波测距模块,我选择PB4口,命名为HC_SR04_Trig_Pin;
8、使能定时器,用来实现微秒延时,和测量HC-SR04模块高电平时间,我选择TIM2,并使能TIM2中断;

Y}$I[3U85M8EJX0`TSX}Q@P.png

TIM2挂载在APB1,时钟来源频率为36MHz,故取预分频系数PSC=36-1,计数周期Counter设为60000-1。即此时定时器频率为36M/36=1MHz,每60ms进一次中断,60000μs对应实际测距范围大概为10m,远远超过我的需求。

CP1WI%N(~F}{56Z8OZ{NHN4.png

14c2aefe04d5410b89a5300226b73aa6.png

9、配置串口收发引脚;
10、配置时钟树,我还是开到最高的72MHz;
11、进行项目设置,最后生成代码,CubeMX部分就大功告成了

B4M6VI[W3NYH~IN2P13@NCA.png

三、硬件连线部分
CH340 ↔ STM32F103C8T6最小系统板:
 TX    ↔        RX
 RX    ↔        TX

DAP-LINK ↔ STM32F103C8T6最小系统板
  3.3V    ↔         VCC
  GND    ↔         GND
  SWIO   ↔         SWIO
 SWCLK  ↔        SWCLK

HC-SR501模块 ↔ STM32F103C8T6最小系统板
    OUT      ↔           PA1
    GND      ↔           GND

HC-SR501模块 ↔ DAP-LINK (这里注意模块供电范围为4.5V-20V,用3.3V无法驱动)
     VCC     ↔    5V

HC-SR04模块   ↔  CH340
     VCC      ↔    5V

HC-SR04模块   ↔ STM32F103C8T6最小系统板
     Trig       ↔          PB4
     Echo      ↔          PB5
     GND      ↔          GND

四、逻辑代码部分
代码框架是基于上一篇HC-SR501红外人体感应模块修改而成的,想要完整代码的话可以和上篇文章一起看。

HC_SR04.c
  1. #include "main.h"
  2. #include "HC_SR04.h"
  3. #include "stm32f1xx_hal.h"
  4. #include "stm32f1xx_it.h"

  5. static float distance_result;
  6. /*
  7. *********************************************************
  8. 函数原型:void Delay_us(uint16_t time)
  9. 函数输入:无符号整形
  10. 函数输出:无
  11. 函数功能:利用定时器实现微秒级延时
  12. *********************************************************
  13. */
  14. void Delay_us(uint16_t time)
  15. {
  16.         uint16_t a1=TIM2->CNT;
  17.         while(TIM2->CNT-a1<time);
  18. }
  19. /*
  20. *********************************************************
  21. 函数原型:void HC_SR04_startrange(void)
  22. 函数输入:无
  23. 函数输出:无
  24. 函数功能:从trig引脚生成一个不小于10us的高电平触发测距,触发后模块自动产生8个40kHz方波,自动检测是否有信号返回
  25. *********************************************************
  26. */
  27. void HC_SR04_startrange(void)
  28. {
  29.         HAL_GPIO_WritePin(HC_SR04_Trig_GPIO_Port,HC_SR04_Trig_Pin,GPIO_PIN_SET);
  30.         //HAL_Delay(5);
  31.         Delay_us(10);
  32.         HAL_GPIO_WritePin(HC_SR04_Trig_GPIO_Port,HC_SR04_Trig_Pin,GPIO_PIN_RESET);
  33.         
  34. }
  35. /*
  36. *********************************************************
  37. 函数原型:uint16_t HC_SR04_gettime(void)
  38. 函数输入:无
  39. 函数输出:无符号整型
  40. 函数功能:通过定时器获取当前时间
  41. *********************************************************
  42. */
  43. uint16_t HC_SR04_gettime(void)
  44. {
  45.         uint32_t a;
  46.         a=TIM2->CNT;
  47.         return a;
  48. }
  49. /*
  50. *********************************************************
  51. 函数原型:float HC_SR04_getdistance(void)
  52. 函数输入:无
  53. 函数输出:浮点型
  54. 函数功能:获取与目标之间的距离
  55. *********************************************************
  56. */
  57. float HC_SR04_getdistance(void)
  58. {   
  59.         uint16_t time_node1;
  60.          uint16_t time_node2;
  61.           uint16_t measure;
  62.         
  63.   HC_SR04_startrange();
  64.         
  65.         TIM2->CNT = 0;
  66.         
  67.         //有信号返回则通过IO口Echo输出高电平,高电平持续时间即为超声波从发射到返回的时间,测试距离=( 高电平时间*声速(340m/s) )/ 2
  68.           while(HAL_GPIO_ReadPin(HC_SR04_Echo_GPIO_Port,HC_SR04_Echo_Pin)==RESET);
  69.         time_node1=HC_SR04_gettime();
  70.         
  71.         while(HAL_GPIO_ReadPin(HC_SR04_Echo_GPIO_Port,HC_SR04_Echo_Pin)==SET);
  72.         time_node2=HC_SR04_gettime();
  73.         
  74.         measure=time_node2-time_node1;
  75.         
  76.         distance_result = measure * 17.0/1000;//距离=计数差值(us) / 1000000 * 340(m/s) * 100 / 2 = measure * 17/1000

  77.   return distance_result;
  78. }
复制代码

HC_SR04.h
  1. #ifndef _HC_SR04_H_
  2. #define _HC_SR04_H_
  3. void Delay_us(uint16_t time);
  4. void HC_SR04_startrange(void);
  5. float HC_SR04_getdistance(void);
  6. uint16_t HC_SR04_gettime(void);
  7. #endif
复制代码

main.c
  1.   /* USER CODE BEGIN 2 */
  2.         HAL_TIM_Base_Start_IT(&htim2);
  3.   /* USER CODE END 2 */
复制代码
  1. while (1)
  2.   {
  3.     /* USER CODE END WHILE */

  4.     /* USER CODE BEGIN 3 */
  5.                 if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1) == 1)
  6.                 {
  7.                         //HAL_Delay(50);
  8.                         HC_SR04_distance=HC_SR04_getdistance();
  9.                         HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);//灭灯
  10.                         printf("有人,目前距离为:%.2f cm\r\n",HC_SR04_distance);
  11.                         HAL_Delay(100);
  12.                 }

  13.                 else  
  14.                 {
  15.                         HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_SET);//亮灯
  16.                         printf("没人\r\n");
  17.                         HAL_Delay(1000);
  18.                 }
  19.                
  20. //                  printf("hellp\r\n");
  21. //                        HAL_Delay(1000);
  22.   }
  23.         
  24.   /* USER CODE END 3 */
  25. }
复制代码

现象:

感应到人体,板载LED绿灯亮,同时串口打印测距结果。



注意:
重定义printf后,必须在target里面勾选上MicroLIB,调用一下这个微型库,不然一直卡在里面。

6(B(NQX6N322(SRUM`I)[WF.png



收藏 评论0 发布时间:2022-4-15 10:00

举报

0个回答

所属标签

相似分享

官网相关资源

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