HY-SRF05超声波测距模块的使用

HY-SRF05超声波测距模块的使用

测距模块介绍

enter image description here

  1. VCC和GND:接电源的正负极,也可接单片机的5V或3.3V,注意与单片机共地
  2. Trig:触发控制信号输入。通过这个引脚输入10us以上的高电平触发信号,然后模块自动发送8个40KHz的方波进行一次测距。
  3. Echo:回响信号接收。该引脚可以在接收到回响信号后输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。
  4. OUT:该引脚在手册中提到为开关量输出,可以做报警模块使用,应该是一个模块状态口,通过判断OUT的高低电平来判断模块是否上电,基本不用。
  5. 时序图
    enter image description here

距离=高电平持续时间340/2*


代码说明

  1. 先利用基本定时器6实现微秒级别的延时函数,再在此基础上完成控制信号发送
    延时函数
void Delay_us(uint16_t myus)//基于TIM6定时器的μs级延时函数
{
 uint16_t differ = 0xffff-myus-5;
 HAL_TIM_Base_Start(&htim6);
 __HAL_TIM_SetCounter(&htim6,differ);
 while(differ < 0xffff-5)
 {
  differ = __HAL_TIM_GetCounter(&htim6);
 }
 HAL_TIM_Base_Stop(&htim6);
}

控制信号发送

void Send_Trig(void)
{
	HAL_GPIO_WritePin(Trig_GPIO_Port, Trig_Pin, SET);
	Delay_us(20);
	HAL_GPIO_WritePin(Trig_GPIO_Port, Trig_Pin, RESET);
}
  1. 利用通用定时器6的输入捕获功能测出高电平持续时间
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
	if(htim==&htim3)
	{
		switch(polarity)
		{
			case PO_Rising:
			  {
				  Period_Num=0;
				  Capture_Value1=HAL_TIM_ReadCapturedValue(&htim3, TIM_CHANNEL_1);
				  __HAL_TIM_SET_CAPTUREPOLARITY(&htim3,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);
				  polarity=PO_Falling;
				  break;
			  }
			case PO_Falling:
			  {
				  Capture_Value2=HAL_TIM_ReadCapturedValue(&htim3, TIM_CHANNEL_1);
				  Distance_Value[Distance_Num]=(Capture_Value2+Period_Num*65536-Capture_Value1)*170/1000;
				  Distance_Num++;
				  if(Distance_Num>=100)
					  Distance_Num=0;
				  __HAL_TIM_SET_CAPTUREPOLARITY(&htim3,TIM_CHANNEL_1,TIM_ICPOLARITY_RISING);
				  polarity=PO_Rising;
				  break;
			  }
		}
	}
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if(htim==&htim3)
	{
		Period_Num++;
	}
}
  1. 主函数循环里实现初始化和周期测距,周期须大于60ms
 polarity=PO_Rising;
  Distance_Num=0;
  Period_Num=0;
  HAL_GPIO_WritePin(Trig_GPIO_Port, Trig_Pin, RESET);
  HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_1);
  /* USER CODE END 2 */
 while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	  Send_Trig();
	  HAL_Delay(100);
  }
  1. 一些全局变量定义和函数声明
/* USER CODE BEGIN PD */
#define PO_Rising 1
#define PO_Falling 2
/* USER CODE END PD */

  /* USER CODE BEGIN PV */
uint8_t polarity;
uint16_t Capture_Value1;
uint16_t Capture_Value2;
float Distance_Value[100];
uint16_t Distance_Num;
uint16_t Period_Num;
/* USER CODE END PV */

/* USER CODE BEGIN PFP */
void Delay_us(uint16_t myus);
void Send_Trig(void);

/* USER CODE END PFP */

一定要记得开启定时器输入捕获中断
HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_1);

  1. 图形化配置
    在这里插入图片描述

记得开启中断

经实际测距发现,同一距离下的测量最大值和最小值差值最大为30mm 左右,并有部分数据出现溢出

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值