锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

传感器:HC-SR04超声波传感器原理(底部附代码)

时间:2023-02-28 03:30:00 sr循环数显继电器dh48s

一、超声波测距原理
》》超声波测距原理是在超声波发射装置发出超声波,在发射超声波时开始计时,超声波在空气中传播,在传播时遇到障碍物,将返回超声波接收器的信号,超声波接收器接收到信号后立即停止计时,有一段时间t,空气中超声波的传播速度为340m/s,通过公式s=340 x t / 200,计算待测距离是多少。(公司用的是HC-SR04,可提供2cm-400cm非接触式测距功能)
1.使用单片机I/O口TRIG触发测距,至少给定10us的高电平;
2.模块自动发送8个40个khz的方波,自动检测是否有信号返回;
3.有信号返回,通过I/O口ECHO输出高电平,高电平的持续时间(用定时器定时)是波从发射到返回的时间。测试距离=(高电平时间 x 声速(340m/s))/2;

二、HC-SR04超声波测距模块的工作原理
1、采用I/O通过单片机至少发出10个口触发测距us超声波模块的高电平信号Trig触发超声波模块的引脚;
2.模块将自动发送8个40个KHz自动检测方波信号是否有信号返回;
3.有信号返回,通过Echo引脚与单片机相连I/O口输出高电平,高电平持续时间为超声波从发射到返回的时间;
4.声音在空气中的传播速度为340米/秒,可计算测量距离;

三、具体代码测距方法
1.定时器模式
2、延时方式

四、测距公式
1.正常计算距离的公式
测试距离=[ 高电平时间 x 速度(340m/s)/2 ](除以2表示,从发出到接收)
测量单位:测量距离(米)、速度(米/秒)、高电平时间(秒)
2、将单位改变后的测距离的公式
测试距离=[ (高电平时间us/1000000)x 340 / 2 x 100 ] =高电平时间us/58
测量单位:测量距离(cm)、速度(cm/秒)、高电平时间(微秒)

五、HC-SR04模块(工作电压:DC 5V)
该模块包括超声波发射器、接收器和控制电路

六、注意事项
1.该模块不应带电连接。如果要带电连接,请先让模块GND端接地,否则会影响模块的正常工作;
2.测距时,被测物体的面积不小于0.5平方米,平面要求平整,否则会影响测量结果;

七、编程思路
1、HC-SR8004超声波KHz方波,然后遇到障碍物通过ECHO从触发到单片机返回高电平HC-SR04工作开始计时,到ECHO返回高电平停止计时,计时为t;
2.此时的距离可以通过公式计算s;

main函数: #include "stm32f10x.h" #include "delay.h" #include "hc_sr04.h" #include "stdio.h" #include "usart.h" u8 count=0; int main() { 
         delay_init();  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);  HC_SR04_Init();  NVIC_Config();  uart_init(9600);  Time2_Init(20,3600);//1ms中断1次 // while(1) // { 
          hc_sr04_calculate();   count = 0;   delay_ms(1000);   printf("HC-SR完成04测距计算!over\n"); // } } c_sr04.c源文件:
#include"stm32f10x.h"
#include"hc_sr04.h"
#include"stdio.h"
//hc_sr04引脚初始化
void HC_SR04_Init(void)//初始化hc_sro4的连接引脚
{ 
       
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//开启GPIOB时钟
	
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;//将hc_sr04的Trig引脚连接到单片机的PB5引脚上,单片机给HC_SR04提供至少10us的脉冲
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;//将hc_sr04的Echo引脚连接到单片机的PB6引脚上,HC_SR04反馈高电平信号给单片机
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStructure);
}

//通用定时器Tim2初始化
void Time2_Init(u32 Period , u32 Prescaler)
{ 
       
	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//开启定时器TIM2的时钟
	
	TIM_TimeBaseStructure.TIM_Period = Period;//自动重装载寄存器的值
	TIM_TimeBaseStructure.TIM_Prescaler = Prescaler;//时钟预分频数
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//采样分频
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数
	
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
	TIM_ClearFlag(TIM2,TIM_FLAG_Update);//清除溢出中断标志位
	TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//TIM2中断使能
// TIM_Cmd(TIM2,ENABLE);//使能定时器Tim2 
}

//NVIC配置
void NVIC_Config(void)
{ 
       
	NVIC_InitTypeDef NVIC_InitStructure;
	
	NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;//中断通道号配置为TIM2
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//无占先优先级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//无副优先级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//中断使能
	NVIC_Init(&NVIC_InitStructure);//NVIC初始化
}

//给hc_sr04一个启动信号
void hc_sr04_start(void)
{ 
       
	Trig=1;
	delay_us(20);
	Trig=0;
}

//计算hc_sr04测出来的值
void hc_sr04_calculate(void)
{ 
       
	float temp;
	while(Echo==1);
	hc_sr04_start();//启动hc_sr04超声波传感器
	while(Echo==0);
	printf("收到20us的脉冲,开始发送8个40KHz的方波信号!\r\n");
	delay_ms(500);
	printf("hc_sr04正在开始测距.......\r\n");
	TIM_SetCounter(TIM2,0);//清空计数器
	TIM_Cmd(TIM2,ENABLE);//开启定时器
	while(Echo==1);//如果hc_sr04返回低电平说明还未检测到前面有障碍物,就一直执行该程序
	TIM_Cmd(TIM2,DISABLE);//停止计数
	temp=TIM_GetCounter(TIM2)*340/(2*1000);
	printf("距离:%6.2fm\n",temp);
}

hc_sr04.h头文件:
#ifndef _HC_SRO4_H
#define _HC_SR04_H

#include "stm32f10x.h"
#include "delay.h"

#define Trig PBin(5)
#define Echo PBout(6)
void HC_SR04_Init(void);
void Time2_Init(u32 Period , u32 Prescaler);
void NVIC_Config(void);
void hc_sr04_start(void);
void hc_sr04_calculate(void);
void delay_init();
void uart_init(u32 bound);


#endif
锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章