STM32驱动HC-SR04超声波模块

STM32学习笔记——HC-SR04超声波测距模块

碰巧学校老师要求做个HC-SR04超声波的实验,笔者在完成实验报告的同时,也顺带完成一篇STM32驱动超声波模块记录。


前言

HC-SR04作为简单的外设模块,广泛应用于简单的课设项目中,十分适合入门STM32。

一、HC-SR04介绍

HC-SR04的介绍,这里就不做累述了,大家可以上某宝上找店家要下用户手册,或者到其他博主的博客中看个大概的介绍。

二、使用步骤

1.接口定义

VCC      ------->      5V
TRIG      ------->		PA6
ECHO      ------->		PA7
GND      ------->		GND

TRIG和ECHO两个接口也可以使用其他的IO口继续驱动,在这篇文章中,博主用的是PA6和PA7。当然也可以使用其他的IO口,只需要所使用的IO口可以输出输入高低电平即可。

2.阅读时序图

在这里插入图片描述
如图,驱动HC-SR04需要先向TRIG口输入一段超过10us的高电平。此时模块会自动输出脉冲信号来检测是否接收到了信号的返回。若接收到了返回信号,则会将ECHO段拉高并持续一段时间,而持续的时间便是超声波信号发出到接收到返回的超声波信号的时间。

3.原理

在这里插入图片描述

原理:IO口发送触发信号拉高Trig,延迟超过10us之后,再拉低Trig,作为超声波模块的启动信号,此时模块不断自动发出一段40khz的信号,当收到返回的超声波信号时,ECHO口则输出回响信号 。回响信号的脉冲宽度与所测的距离成正比。由此通过发射信号到收到的回响信号时间间隔可以计算得到距离.

4.代码

hscr.c下的代码:

#include "hcsr.h"

void TIM2_Count_Configuration(void)
{
	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	
	TIM_TimeBaseStructure.TIM_Period = 0xFFFF;  //999+1 =1000
	TIM_TimeBaseStructure.TIM_Prescaler = 71;  //71+1= 72分频
	//TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

	TIM_Cmd(TIM2, ENABLE);
	//暂时先关闭TIM2时钟,等全部初始化结束后正式使用定时器前再开启
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, DISABLE);
}

//PB6(output):TRIG   PB7(input):ECHO
void HCSR04_GPIO_Configuration(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
}



代码分析:该段代码初始化HC-SR04所使用到的IO口和时钟。并没有什么难度。

main. c的代码如下:

  	while(1) 
	{	

		TIM_Cmd(TIM2, ENABLE);
		TRIG_H;
		delay_us(15);
		TRIG_L;
		//printf("HERE");
		while(ECHO == 0);
		TIM_SetCounter(TIM2, 0);
		
		while(ECHO == 1);
		TIM_Cmd(TIM2, DISABLE);
		time = TIM_GetCounter(TIM2);
		//printf("time = ",time);
		distance = time * 0.017;
		printf("Distance = %.2fcm\n", distance);
	}

代码分析:此段代码的重点在于两个while循环,两个while循环都是为了检查ECHO的输出以及查询其高电平持续的时间,通过持续时间算出测量距离。

  • 6
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值