这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » NUCLEO-U083RC学习历程36+使用超声波模块制作实现测量距离

共1条 1/1 1 跳转至

NUCLEO-U083RC学习历程36+使用超声波模块制作实现测量距离

高工
2025-08-04 07:55:22     打赏

一:超声波模块知识分享:

    HC-SR04超声波传感器是通过发送和接收超声波,利用时间差和声音传播速度,计算出模块到前方障碍物的距离的一种传感器模块。与蝙蝠寻找猎物的回声定位基本原理相同,可以广泛应用于无损测量、水文液位测量、工业场地等领域。超声波测距模块有两个超声波探头,分别用于发射和接收超声波,TRIG 脚用于触发发射超声波,若接收到返回的超声波 ECHO 脚会输出高电平,根据高电平的持续时间计算目标距离

二:模块工作原理如下所示:

    在 TRIG 管脚输入一个 10US 以上的高电平(一般建议 50Us 左右),芯片(TP,TN管脚)便可发出8个 40KHZ的超声波脉冲,然后(RP,RN)检测回波信号。当检测到回波信号后,通过 ECHO 管脚输出,如图所示。

1.png

根据 ECHO 管脚输出高电平的持续时间可以计算距离值。即距离值为:(高电平时间*340m/s)/2。

当测量距离超过测量范围时,CS100A 仍会通过 ECHO 管脚输出高电平的信号,高电平的宽度约为 33ms。如下图所示:

2.png

测量周期:当芯片通过 ECHO 管脚输出的高电平脉冲后,便可进行下一次测量,所以测量周期取决于测量距离,当测距很近时,ECHO 返回的脉冲宽度较窄,测量周期就很短;当测距较远时,ECHO 返回的脉冲宽度较宽,测量周期也就相应的变长。最坏情况下,被测物体超出测量范围,此时返回的脉冲宽度最长,约为33ms,所以最坏情况下的测量周期大于 33ms 即可(比如测量周期可取 50ms)。

三:软件编写流程如下所示:

3.1 程序编写流程

1.选定好 GPIO 脚,该脚与超声波测距模块的 TRIG 脚相连

2.选定好 TIM通道,该脚与超声波测距模块的 ECHO 脚相连

3.初始化 GPIO 脚即 TRIG 脚,重点配置为推挽输出模式

4.初始化 TIM 通道对应的 GPIO 脚即 ECHO 脚,重点配置为浮空输入模式

5.初始化 TIM,配置为输入捕获模式

6.TRIG 脚输出一个大于 10us 的高电平,触发 CS100A 芯片发射超声波

7.输入捕获测量 ECHO 脚高电平脉宽

8.计算 ECHO 脚高电平持续时间,带入公式 距离(m)=高电平持续时间(s)*声速(340m/s)12,算出距离值

3.2 程序流程图如下所示:

0804-1.png

四:程序代码如下所示:

4.1 延时函数如下所示:

void delay_us(uint32_t nus)
{		
	uint32_t ticks;
	uint32_t told,tnow,tcnt=0;
	uint32_t reload=SysTick->LOAD;				//LOAD的值	    	 
	ticks=nus*fac_us; 						//需要的节拍数 
	told=SysTick->VAL;        				//刚进入时的计数器值
	while(1)
	{
		tnow=SysTick->VAL;	
		if(tnow!=told)
		{	    
			if(tnow<told)tcnt+=told-tnow;	//这里注意一下SYSTICK是一个递减的计数器就可以了.
			else tcnt+=reload-tnow+told;	    
			told=tnow;
			if(tcnt>=ticks)break;			//时间超过/等于要延迟的时间,则退出.
		}  
	};
}

4.2 编写输出一定时间脉冲

/***********************************************************************************************
  * @brief   void StartOut(void)
  * @param   输出一段时间高电平
  * @retval  无
  * @author  聪聪哥哥
  * @version V1.1.0
  * @date     04-8-2025
*************************************************************************************************/
void StartOut(void)
{
	HAL_GPIO_WritePin(GPIOC, GPIO_PIN_10, GPIO_PIN_SET);
	delay_us(50);
	HAL_GPIO_WritePin(GPIOC, GPIO_PIN_10, GPIO_PIN_RESET);
}

4.3 计算超声波的测量距离如下:

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13)==GPIO_PIN_SET)  //上升沿中断
	{
		__HAL_TIM_SetCounter(&htim7,0);     //定时器清零
		HAL_TIM_Base_Start(&htim7);         //定时器开始计时
	}
	else                                    //下降沿触发中断
	{
		iTime7Count=__HAL_TIM_GetCounter(&htim7); //读取定时器计数值
		HAL_TIM_Base_Stop(&htim7);          //定时器停止计时
		
		iLength=0.5*iTime7Count/1000000*340;               //测试距离:((count/1000000)*340/2)*100,单位CM

		sprintf(buffer1,"ilength= %1.6f",iLength);

		HAL_UART_Transmit_DMA(&huart2, (uint8_t *)buffer1, 20);
	}
}

五:实物测试图片如下:

0804-2.png




关键词: NUCLEO-U083RC     超声波     测量    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]