博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于STM32F103ZET6 HC_SR04超声波测距模块
阅读量:5991 次
发布时间:2019-06-20

本文共 2631 字,大约阅读时间需要 8 分钟。

这是最后的实验现象,改变不同的角度即可测得距离

板子 PZ6806L 超声波模块 HC_SR04

HC_SR04模块讲解

通过该超声波模块说明书,可明白供电需VCC 5V  还需GND  ECHO(回响信号)  TRIG(触发信号)

也就是说总共需要4根线,其中VCC和GND只需要接到开发板上的5V电源和GND即可

这是我的接线图

 

 ECHO 使用的是PC3引脚,TRIG 使用的是PC2引脚

PC3和PC2只是普通的引脚,没任何特殊性,可凭自己想法配置不同的引脚

 

从超声波时序图看出,若想能够使用该模块,

1 使用你要触发信号拉高10us以上

 

2 接着模块内部自己发出8个40khz脉冲,不需要管,接着模块会输出回响信号,而回响信号高电平的

脉冲宽度,与距离成正比

 

以上知道这些就可以正常使用,至于距离公式后面会再解释

注意

 

接着就是代码部分,主函数最后再介绍

HC_SR04配置函数及ECHO高电平时间

首先是头文件

配置一个变量 time,用于存储回响信号高电平的时间

void hc_sr04_init(void); 该函数是引脚的配置函数

float  Get_hcsr04length(void);该函数是用来发送触发信号,并得到回响信号的高电平时间

 

 

void hc_sr04_init(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC ,ENABLE);//打开GPIOC的时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;//配置引脚2,trig触发信号
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//配置为推挽输出
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_ResetBits(GPIOC,GPIO_Pin_2);//触发信号,首先把它拉低,避免额外影响
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//配置引脚3,echo回响信号
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//配置为模拟输入
GPIO_Init(GPIOC, &GPIO_InitStructure);//echo信号
GPIO_ResetBits(GPIOC,GPIO_Pin_3);//也同样拉低
}

 

 

 

float Get_hcsr04length(void)

{
GPIO_SetBits(GPIOC,GPIO_Pin_2);
delay_us(20);
GPIO_ResetBits(GPIOC,GPIO_Pin_2); //TRIG发送触发信号,延时10us以上就可以了
while(PCI(3)==0) //当echo一直是低电平的时候,就清空,并且关闭计时器
{
TIM_SetCounter(TIM2, 0);
TIM_Cmd(TIM2,DISABLE);
}
while(PCI(3)==1)//一旦echo被拉高了,就说明模块传需要的数据回来了,打开计时器
{
TIM_Cmd(TIM2,ENABLE);
}
time=TIM_GetCounter(TIM2);//当被拉高的echo再次变回低电平时,将计时器的值赋给time
return time;//返回time
}

 

计时器函数的配置

 

void TIM_Counter(void)

{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//使能TIM2的时钟
TIM_TimeBaseStructure.TIM_Period = 65535;
TIM_TimeBaseStructure.TIM_Prescaler = 71;//72MHx/72=1us,
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数模式
TIM_TimeBaseInit(TIM2, & TIM_TimeBaseStructure);
TIM_Cmd(TIM2,DISABLE);//关闭,需要的时候再打开
}

 

部分主函数

 

int main(void)

{

float Distance=0;//存储距离

delay_init(72); //配置滴答计时器
RCC_Configuration();//时钟配置
GPIO_Configuration();//GPIO配置,只是PC0(LED0),用来提示系统正常运行
TIM_Counter();//计时器的配置
USART1_Configuration();//串口配置,
hc_sr04_init();//HC_SR04初始化配置好(即PC2,PC3的配置)
  while(1)
  {
GPIO_ResetBits(GPIOC,GPIO_Pin_0);//提示系统正常运行进该循环

 

Distance =(Get_hcsr04length()*340/2/1000);//从函数得到距离值,340是声音的速度,除于2,是因为声波发出到接收,是一次来回,除于1000,是将距离定为mm(毫米),该函数返回的就是之前time的值
printf("距离是%.2f\r\n",Distance);
delay_ms(1000);//延时1秒钟,这样不会输出太过频繁
  }
}

 

这是我的工程文件

 

百度网盘  密码 v3y7

https://pan.baidu.com/s/1MNVf70_gnZ5aqSm6XInrMA

 

如有需要,可结合自己板子修改下代码即可使用,欢迎交流,咱们共同进步

 

转载于:https://www.cnblogs.com/zzlloveyty/p/10696656.html

你可能感兴趣的文章
整合spring cloud云架构 - SSO单点登录之OAuth2.0登录认证
查看>>
推荐几个精致的前端UI框架
查看>>
递归和深拷贝 浅拷贝
查看>>
java Runtime.exec方法详解!
查看>>
架构设计之「 CAP 定理 」
查看>>
阿里巴巴IPv6应用平台引领下一代互联网
查看>>
区块链软件公司:区块链金融今后会如何发展
查看>>
阿里开源自用 OpenJDK 版本,Java 社区迎来中国力量
查看>>
企业级框架整合Springmvc+mybatis+restful+bootstrap
查看>>
(四)整合spring cloud云服务架构 - 企业分布式微服务云架构构建
查看>>
Unity(刚体)
查看>>
构建dubbo分布式平台-dubbo简介
查看>>
前端优化
查看>>
38. SQL -- 自动维护计划和管理表
查看>>
电脑常见小技巧
查看>>
usb安全管理
查看>>
我的友情链接
查看>>
树莓派配置小记1:系统篇
查看>>
HDFS详解
查看>>
linux编程指导
查看>>