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


本章将介绍使用stm32Cubemx软件配置定时器的输入捕获功能来控制SR04模块测量距离。


硬件平台:Stm32H743IIT6 超声波模块:SR04(网购5元一个) 软件:StmcubemxV6.0.1 、MDK5 cubemx下载地址: https://www.st.com/stm32cubemx


文章目录

  • stm32Cubemx实用篇(二):定时器捕获功能实现SR04超声波测距
  • 一、SR04使用方法
  • 二、Cubemx参数配置
  • 三、MDK代码修改与运行
  • 1.输入捕获函数实现
  • 2.主函数实现



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

一、SR04使用方法


SR04实物

cubemx配置定时器中断_stm32


1、工作原理

cubemx配置定时器中断_上升沿_02

2、接口定义和使用方法

cubemx配置定时器中断_cubemx配置定时器中断_03


3、注意事项


1:此模块不宜带电连接,如果要带电连接,则先让模块的 Gnd 端先连接。否则会影响

模块工作。

2:测距时,被测物体的面积不少于 0.5 平方米且要尽量平整。否则会影响测试结果。

二、Cubemx参数配置


1、时钟配置

cubemx配置定时器中断_c语言_04

2、定时器输入捕获设置

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

具体设置如下图所示:

cubemx配置定时器中断_上升沿_05

三、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);  //开启输入捕获中断
}

可以看到按键按下后能够正确测出距离。

cubemx配置定时器中断_上升沿_06


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