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

一、准备工作:

有关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

八、总结

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

引用提到了使用HAL库完成对HC-SR04超声波模块的距离测量。该库包括了超声波传感器的原理、STM32CUBEMX的配置以及程序的完善。使用这个库可以实现对超声波模块的距离测量功能。而引用中提到了HC-SR04超声波模块的接线方法,其中VCC接STM32板子的5V电源,GND接STM32板子的地,Trig是触发控制信号输入,用于触发测距,需要给至少10us的高电平信号,而Echo是回响信号输出,用于接收超声波发射后的回响信号,Echo输出的高电平持续时间就是超声波从发射到返回的时间。在STM32中,可以通过一个端口作为Trig端口,通过推挽输出一个至少10us的高电平信号进行触发;而可以选择另一个端口作为Echo端口,利用端口捕获高电平时间来获取回响信号。根据引用的分析,可以选择相应的STM32端口来实现这些功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [手把手教你,通过HAL库实现STM32超声波测距--以SR-04为例](https://blog.csdn.net/tangxianyu/article/details/121519637)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [HAL库实现定时器实现多个超声波HC-SR04)测距](https://download.csdn.net/download/XiaoCaiDaYong/33511071)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值