一、HC-SR04超声波测距模块原理
1.模块简介
HC-SR04超声波模块常用于机器人避障、物体测距、液位检测、公共安防、停车场检测等场所。HC-SR04超声波模块主要是由两个通用的压电陶瓷超声传感器,并加外围信号处理电路构成的。
两个压电陶瓷超声传感器,一个用于发出超声波信号,一个用于接收反射回来的超声波信号。由于发出信号和接收信号都比较微弱,所以需要通过外围信号放大器提高发出信号的功率,和将反射回来信号进行放大,以能更稳定地将信号传输给单片机。模块如图所示:
2.模块电气参数
工作电压:DC—5V 工作电流:15mA 工作频率:40Hz 电平输出:高5V 电平输出:底0V 感应角度:不大于15度 射程范围:2cm-400cm 高精度 可达0.3cm
3.模块工作原理
(1)采用 IO 口 TRIG 触发测距,给最少 10us 的高电平信呈。 (2)模块自动发送 8 个 40khz 的方波,自动检测是否有信号返回; (3)有信号返回, 通过 IO 口 ECHO 输出一个高电平, 高电平持续的时间就是超 波从发射到返回的时间。 测试距离=(高电平时间*声速(340M/S))/2
二、HC-SR04超声波测距模块与32单片机接线
Trig接IO口PA5,Echo接IO口PA6。如图示
实设距离:
测量结果:
三、32单片机源码
main.c文件:
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "hcsr04.h"
int main()
{
float length;
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
uart_init(115200);
Hcsr04Init();
while(1)
{
length = Hcsr04GetLength();
printf("?àà??a:%.3f\r\n",length);
}
return 0;
}
hcsr04.c文件
#include "hcsr04.h"
#include "sys.h"
#include "delay.h"
#define HCSR04_PORT GPIOA
#define HCSR04_CLK RCC_APB2Periph_GPIOA
#define HCSR04_TRIG GPIO_Pin_5
#define HCSR04_ECHO GPIO_Pin_6
#define TRIG_Send PAout(5)
#define ECHO_Reci PAin(6)
u16 msHcCount = 0;
void Hcsr04Init()
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB2PeriphClockCmd(HCSR04_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin =HCSR04_TRIG;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);
GPIO_ResetBits(HCSR04_PORT,HCSR04_TRIG);
GPIO_InitStructure.GPIO_Pin = HCSR04_ECHO;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);
GPIO_ResetBits(HCSR04_PORT,HCSR04_ECHO);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_TimeBaseStructure.TIM_Period = (1000-1);
TIM_TimeBaseStructure.TIM_Prescaler =(72-1);
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM3,DISABLE);
}
void OpenTimer()
{
TIM_SetCounter(TIM3,0);
msHcCount = 0;
TIM_Cmd(TIM3, ENABLE);
}
void CloseTimer()
{
TIM_Cmd(TIM3, DISABLE);
}
void TIM3_IRQHandler(void)
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update );
msHcCount++;
}
}
u32 GetEchoTimer(void)
{
u32 t = 0;
t = msHcCount*1000;
t += TIM_GetCounter(TIM3);
TIM3->CNT = 0;
delay_ms(50);
return t;
}
float Hcsr04GetLength(void )
{
u32 t = 0;
int i = 0;
float lengthTemp = 0;
float sum = 0;
while(i!=5)
{
TRIG_Send = 1;
delay_us(20);
TRIG_Send = 0;
while(ECHO_Reci == 0);
OpenTimer();
i = i + 1;
while(ECHO_Reci == 1);
CloseTimer();
t = GetEchoTimer();
lengthTemp = ((float)t/58.0);
sum = lengthTemp + sum ;
}
lengthTemp = sum/5.0;
return lengthTemp;
}
hcr04.h文件
#ifndef __HCSR04_H
#define __HCSR04_H
float Hcsr04GetLength(void);
void Hcsr04Init(void);
#endif
详细注释请见完整工程源码.
总结
感谢各位的收看,下期将讲解如何用32单片机控制舵机,还请各位多多支持,也欢迎各位在评论区留言!
|