基于STM32F103ZET6 HC_SR04超声波测距模块

Posted zzlloveyty

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于STM32F103ZET6 HC_SR04超声波测距模块相关的知识,希望对你有一定的参考价值。

技术图片

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

板子 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 ",Distance);
delay_ms(1000);//延时1秒钟,这样不会输出太过频繁
  }
}

 

这是我的工程文件

 

百度网盘  密码 v3y7

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

 

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

 

以上是关于基于STM32F103ZET6 HC_SR04超声波测距模块的主要内容,如果未能解决你的问题,请参考以下文章

基于STM32F103C8T6(HAL库)的HC-SR501红外人体传感及HC-SR04超声波测距

基于STM32F103C8T6(HAL库)的HC-SR501红外人体传感及HC-SR04超声波测距

基于STM32F103C8T6(HAL库)的HC-SR501红外人体传感及HC-SR04超声波测距

STemwin图形界面库移植与运用(基于STM32F103ZET6)

stm32f103zet6引脚说明

基于STM32F103c8t6的智能垃圾桶项目