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;
}
完成以上步骤后,需要对代码进行调试和测试,以确保超声波模块能够正常工作并准确测量距离。