stm32Cubemx实用篇(二):定时器捕获功能实现SR04超声波测距

本文介绍了如何利用STM32CubeMX配置定时器输入捕获功能,结合SR04超声波模块进行距离测量。通过设置内部时钟、预分频和双边沿触发,实现高电平时间的捕捉,进而计算超声波往返时间并得出距离。同时展示了主函数中按键控制测距及串口打印距离的实现方法。
摘要由CSDN通过智能技术生成

stm32Cubemx实用篇(二):定时器捕获功能实现SR04超声波测距

本章将介绍使用stm32Cubemx软件配置定时器的输入捕获功能来控制SR04模块测量距离。
硬件平台:Stm32H743IIT6 超声波模块:SR04(网购5元一个) 软件:StmcubemxV6.0.1 、MDK5 cubemx下载地址: https://www.st.com/stm32cubemx


提示:以下是本篇文章正文内容,下面案例可供参考

一、SR04使用方法

SR04实物

在这里插入图片描述
1、工作原理
在这里插入图片描述

2、接口定义和使用方法
在这里插入图片描述
3、注意事项

1:此模块不宜带电连接,如果要带电连接,则先让模块的 Gnd 端先连接。否则会影响
模块工作。
2:测距时,被测物体的面积不少于 0.5 平方米且要尽量平整。否则会影响测试结果。

二、Cubemx参数配置

1、时钟配置
在这里插入图片描述

2、定时器输入捕获设置

设置定时器输入捕获:内部时钟、预分频为240、双边沿触发

具体设置如下图所示:
在这里插入图片描述

三、MDK代码修改与运行

1.输入捕获函数实现

HAL库给我们提供了一个输入捕获回调函数,我们只需要重写这个函数,实现测量接受端口高电平持续时间即可。

代码如下(示例):


void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
  static uint32_t capture_buf[2]={0,0}; //计数器缓存
  static uint8_t capture_cnt=0;   //循环次数
  static uint32_t high_time;    //高电平时间,超声波来回一次的时间,us
  /* Prevent unused argument(s) compilation warning */
  UNUSED(htim);
	//需要发送完触发信号后先开启上升沿捕获
	if(TIM12== htim->Instance)
	{
		if(HAL_TIM_ACTIVE_CHANNEL_2 == htim->Channel)
		{
		  switch(capture_cnt)
			{
			  case 0://捕获到上升沿,记录下来当前时间
				capture_buf[0]= __HAL_TIM_GET_COMPARE(htim,TIM_CHANNEL_2);
			    __HAL_TIM_SET_CAPTUREPOLARITY(htim,TIM_CHANNEL_2,TIM_INPUTCHANNELPOLARITY_FALLING); //开启捕获下降沿
				  capture_cnt++;
			 break;
			 case 1://捕获到下降沿,记录下此刻时间
				  capture_buf[1]= __HAL_TIM_GET_COMPARE(htim,TIM_CHANNEL_2); 
				  capture_cnt=0;
				  HAL_TIM_IC_Stop_IT(htim,TIM_CHANNEL_2); //停止捕获 
				  high_time = capture_buf[1]- capture_buf[0];
				  if(capture_buf[1]>capture_buf[0])printf("ultrasonic DIST = %.1fCM\r\n",17.0*high_time/1000); 
		     break;				 
		     default: break;
			}		
		}	
	}	
}

2.主函数实现

这里在主函数增加了按键扫描通过按键控制SR04测量距离。
另外还增加了串口printf函数,打印出测量到的距离。

代码如下(示例):

key=KEYPRESS();    //按键
if(key==1)//如果按键按下则进行一次测距
{
//发送>10us的超声波trig信号
HAL_GPIO_WritePin(GPIOG, GPIO_PIN_11,GPIO_PIN_SET);
HAL_Delay(1);
HAL_GPIO_WritePin(GPIOG, GPIO_PIN_11,GPIO_PIN_RESET);	
__HAL_TIM_SET_CAPTUREPOLARITY(&htim12,TIM_CHANNEL_2,TIM_INPUTCHANNELPOLARITY_RISING);  //开启上升沿捕获
HAL_TIM_IC_Start_IT(&htim12,TIM_CHANNEL_2);  //开启输入捕获中断
}

可以看到按键按下后能够正确测出距离。
在这里插入图片描述


结束!!!希望小伙伴们多多关注。

摘要:超声波测距是一种典型的非接触测量方式,应用非常广泛。本文提出了一种基于STM32单片机的高精度超声波测距方案。与传统单片机相比,STM32的主频和定时器的频率可以通过PLL倍频高达72MHz,高分辨率的定时器为高精度的测量提供了保证。超声波的发射使用定时器的PWM功能来驱动,回波信号的接收使用定时器的输入捕获功能,开始测距时,定时器的开启将同时启动PWM和输入捕获,完全消除了启动发射和启动计时之间的偏差,提高了测量精度。为使回波信号趋于稳定,设计了时间增益补偿电路(TGC),在等待回波的过程中随着时间的推移需要将放大器的增益值不断增大,通过实验获取不同距离需要设置的增益值,对应不同时间需要设置数字电位器的增量,并将该参数固化在单片机的FALSH中,在测距过程中,根据时间查询电位器增量表改变电位器阻值,实现回波信号的时间补偿,提高了测量的精度。为了在减小盲区的同时而不减小测量范围,设计了双比较器整形电路分别处理近、远距离的回波信号,近距离比较器可以有效屏蔽超声波衍射信号从而减小了测量盲区。传统的峰值检测方法大多通过硬件电路实现,设计较复杂,稳定性差。本文通过软件算法对回波信号进行峰值时间检测。不仅简化了电路,降低了成本,而且提高了系统的稳定度。经研究表明,该系统测量精度达到了lmm,盲区低至3cm,量程可达500cm。本系统在近距离测试时,系统的精度较理想,可作为停车时的倒车雷达使用,也可以用于液面检测(油箱液位),还可以用于自动门感应,机器人视觉识别等。如果多使用几个测距仪,将这些集成一个大系统,那么整个大系统可用于定位避障。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

YZW0123

谢谢大家的支持,请关注我哦!!

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

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

打赏作者

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

抵扣说明:

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

余额充值