【STM32+HAL】超声波模块HC-SR04

本文介绍了如何在STM32F103C8T6单片机上通过CUBEMX配置并利用HAL库实现HC-SR04超声波模块的测距功能,包括TIM3和TIM2定时器的配置,以及中断处理和测量原理的详细步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、准备工作:

有关CUBEMX初始化配置,参见我的另一篇blog:【STM32+HAL】CUBEMX初始化配置

二、所用工具:

1、芯片:STM32F103C8T6

2、CUBEMX配置软件

3、超声波模块HC-SR04

三、实现功能:

测量超声波模块与障碍物之间距离(2-600cm)

四、HAL配置步骤:

1、打开TIM3输出触发信号

每隔一定时间(70ms)输出高电平,并持续一定时间(10us+)

2、开启TIM2定时器输入捕获功能

周期设为1us(72M / 72)

3、中断配置(不唯一)

至此,CUBEMX配置完成

五、KEIL填写代码

1、接线
接线:
VCC -> 3.3V
Trig -> PB14
Echo -> PA0-WKUP
GND ->GND

2、变量定义
#define TRIG_ON  HAL_GPIO_WritePin(GPIOB, TRIG_Pin, GPIO_PIN_SET)
#define TRIG_OFF  HAL_GPIO_WritePin(GPIOB, TRIG_Pin, GPIO_PIN_RESET)

uint32_t capture_Buf[4] = {0};
uint8_t capture_Cnt = 0;
uint32_t high_time;
double distance=0;

3、us级延时函数定义
void delay_us(uint32_t us)//主频72M
{
    uint32_t delay = (HAL_RCC_GetHCLKFreq() / 4000000 * us);
    while (delay--);
}

4、初始化程序
	TRIG_OFF;
	HAL_TIM_Base_Start_IT(&htim3);
	printf("Hello World!\r\n");
	HAL_Delay(300);

5、定时器中断(70ms为一个周期)
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  UNUSED(htim);
	if ( htim -> Instance == TIM3 ){
		TRIG_ON;
		delay_us(15); //持续至少10us
		TRIG_OFF;
		__HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_ICPOLARITY_RISING);
		HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);
	}
}

6、定时器输入捕获
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
	if(TIM2 == htim->Instance){
		switch(capture_Cnt){
			case 0:      //low level
				capture_Buf[0] = HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_1);
				__HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);
				capture_Cnt++;
				break;

			case 1:     //high level
				capture_Buf[1] = HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_1);
				HAL_TIM_IC_Stop_IT(&htim2,TIM_CHANNEL_1);
				capture_Cnt = 0;
//				__HAL_TIM_SET_COUNTER(&htim2,0);	//清零会有问题
				high_time = capture_Buf[1]- capture_Buf[0];
				distance=high_time*0.017; //速度0.034cm/us,计算出的距离要除以2,distances的单位是cm
				break;

			default: break;
		}
	}
}

六、原理讲解

STM32系列(HAL库)——F103C8T6通过HC-SR04超声波模块实现测距

HC-SR04超声波模块的使用(stm32f103c8t6/HAL)(超详细)

七、源码提供

【STM32+HAL】超声波模块HC-SR04

八、总结

超声波模块仅在测量物体表面光滑平整的前提下精度较高,否则测量数据偏移量较大

### 使用 STM32 HAL 驱动 HC-SR04 超声波模块 #### 配置 GPIO 和 TIM3 输出触发信号 为了使 STM32 控制器能够通过 HAL HC-SR04 超声波传感器通信,需先设置相应的硬件资源。具体来说,在 CubeMX 中应为每个超声波模块分配一对 GPIO 引脚用于 Trig (触发) 及 Echo (回响),例如 PE2 和 PD2 给第一个模块作为其对应的 I/O 接口[^2]。 对于触发脉冲的生成,则可通过定时器来实现。按照说明文档指示操作,即开启 TIM3 来负责发出触发信号给超声波模块,从而启动一次测距过程[^1]。 ```c // 初始化TIM3并配置成PWM模式以发送触发脉冲 __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 1); // 设置比较值为1us宽度的高电平时间 ``` #### 编写中断服务函数处理返回数据 当超声波遇到物体反射回来被接收端捕捉到时会改变状态,此时可以利用外部中断机制捕获这一变化事件,并据此计算飞行时间进而得出距离信息: ```c void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){ if(GPIO_Pin == ECHO_PIN){ if(HAL_GetTick()-startTime >= MAX_TIME_OUT){ distance = -1; // 表示超出量程范围 return; } endTime = HAL_GetTick(); uint32_t timeDifference = endTime-startTime; float duration = ((float)(timeDifference)*MicroSecPerTick)/1e6*SONIC_SPEED/2; distance=(int)((duration+0.5f)*100); } } ``` 上述代码片段展示了如何定义回调函数 `HAL_GPIO_EXTI_Callback` 处理由 Echo 引发的状态转换,其中包含了对超时情况下的异常处理逻辑以及最终的距离换算方法[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值