STM32-超声波模块配置流程及代码示例

STM32-超声波模块配置流程及代码示例

HC-SR04超声波测距模块可提供2cm-400cm的非接触式距离感测功能,测距精度可达高到3mm;模块包括超声波发射器、接收器与控制电路。像智能小车的测距以及转向,或是一些项目中,常常会用到。智能小车测距可以及时发现前方的障碍物,使智能小车可以及时转向,避开障碍物。

配置超声波模块(如HC-SR04)的代码流程通常涉及以下几个步骤。以下是一个基于STM32 标准外设库和HC-SR04超声波模块的典型配置流程:

硬件连接

首先,需要将HC-SR04超声波模块的引脚正确连接到STM32开发板的相应引脚上。一般来说,需要连接以下引脚:

  • VCC:连接到STM32的3.3V或5V电源(根据HC-SR04的规格书选择)
  • Trig:连接到STM32的一个GPIO输出引脚,用于发送触发信号
  • Echo:连接到STM32的一个GPIO输入引脚,用于接收回响信号
  • GND:连接到STM32的GND

2. 初始化GPIO

在STM32 HAL库中,需要初始化与Trig和Echo引脚相连的GPIO端口。这通常包括设置GPIO的模式(输入/输出)、速度、上拉/下拉等。

3. 配置定时器(也可用while延时计时)

由于HC-SR04模块需要精确的时间测量来计算距离,因此需要配置一个定时器来测量Echo引脚上的高电平持续时间。定时器的配置通常包括:

  • 时钟源:选择合适的时钟源,如内部时钟或外部时钟。
  • 预分频器(Prescaler):设置预分频值以调整定时器的计数频率。
  • 自动重载寄存器(ARR):设置定时器的周期值,确定定时器的溢出时间。
  • 输入捕获:配置定时器的输入捕获功能,以便在Echo引脚发生边沿变化时捕获时间戳。

4. 编写测距函数

测距函数通常包括以下步骤:

  • 发送触发信号:通过Trig引脚向HC-SR04发送一个短暂的(通常为10us以上)高电平信号。
  • 等待Echo引脚变为高电平:表示超声波已经发出并开始传播。
  • 启动定时器:在Echo引脚变为高电平时启动定时器,开始测量时间。
  • 等待Echo引脚变为低电平:表示超声波已经反射回来并被接收。
  • 停止定时器:在Echo引脚变为低电平时停止定时器,并读取定时器的计数值。
  • 计算距离:根据定时器的计数值和声速(通常为340m/s)计算距离。公式通常为:距离 = (定时器计数值 * 定时器计数周期) * 声速 / 2。

代码示例

/*******************************************************************
*
*	函数名称:	 HS_SR04_Init
*	函数功能:	对超声波模块echo,trig引脚进行初始化
* 	函数参数:	none
*   返回结果:   
* 	注意事项:   None
* 	函数作者:  m17872844806@163.com
*	创建日期:   2024/07/9
*	修改历史:
*	函数版本:	V1.0
* *****************************************************************/
void  HS_SR04_Init(void)
{
   GPIO_InitTypeDef  GPIO_InitStructure;
	
	/* 使能硬件时钟:端口硬件时钟 */
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);

	/* PB6初始电平状态为低电平,看数据手册 */
	GPIO_InitStructure.GPIO_Mode 	= GPIO_Mode_OUT;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_PuPd 	= GPIO_PuPd_NOPULL;
	GPIO_InitStructure.GPIO_Pin 	= GPIO_Pin_6;
	GPIO_Init(GPIOB, &GPIO_InitStructure);	
	
	GPIO_WriteBit(GPIOB,GPIO_Pin_6,Bit_RESET);
	
	/* PE6配置为输入模式 */
	GPIO_InitStructure.GPIO_Mode 	= GPIO_Mode_IN;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
	GPIO_InitStructure.GPIO_PuPd 	= GPIO_PuPd_NOPULL;
	GPIO_InitStructure.GPIO_Pin 	= GPIO_Pin_6;
	GPIO_Init(GPIOE, &GPIO_InitStructure);	
   
}
/*******************************************************************
*
*	函数名称:	Get_Measure
*	函数功能:	利用超声波模块返回高电平时间计算距离
* 	函数参数:	none
*   返回结果:   测量的距离单位mm
* 	注意事项:   None
* 	函数作者:  m17872844806@163.com
*	创建日期:   2024/07/9
*	修改历史:
*	函数版本:	V1.0
* *****************************************************************/
/***** 测距 *****/
int32_t Get_Measure(void)
{
    int32_t t=0;
	//发送10us的高电平信号触发测距
	GPIO_WriteBit(GPIOB,GPIO_Pin_6,Bit_SET);
	delay_us(10);
	GPIO_WriteBit(GPIOB,GPIO_Pin_6,Bit_RESET);
	
	//等待回响信号出现
	while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_6)==Bit_RESET);
	
	//测量回响信号高电平的持续时间,而该高电平的持续时间就是超声波发送到返回的时间
	while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_6)==Bit_SET)
	{
		t++;
		delay_us(9);//9us的时间,声音传播了3mm
	
	}
	return 3*t/2;  
}

完成以上步骤后,需要对代码进行调试和测试,以确保超声波模块能够正常工作并准确测量距离。

posted @ 2024-07-11 22:05  琨为玉也  阅读(342)  评论(0编辑  收藏  举报