一.概要
HC-SR04超声波模块常用于机器人避障、物体测距、液位检测、公共安防、停车场检测等场所。HC-SR04超声波模块主要是由两个通用的压电陶瓷超声传感器,并加外围信号处理电路构成的。
两个压电陶瓷超声波传感器,一个用于发出超声波信号,一个用于接收反射回来的超声波信号。由于发出信号和接收信号都比较微弱,所以需要通过外围信号放大器提高发出信号的功率,和将反射回来信号进行放大,以能更稳定地将信号传输给单片机。
模块如图所示:
二.HC-SR04主要参数
1.模块引脚定义
2.模块电气参数
3.模块通讯时序
以上时序图表明单片机只需要提供一个10uS以上脉冲触发信号给模块的TRIG引脚,该模块内部将发出8个40kHz周期电平并检测回波。模块一旦检测到有回波信号则输出回响信号到模块ECHO引脚。回响信号的脉冲宽度与所测的距离成正比。单片机通过采集收到的输出回响信号的宽度时间就可以计算得到距离。
距离公式:距离=回响高电平时间*声速(340M/S)/2
4.模块原理图
三.GD32单片机超声波模块测距实验
硬件准备:
STLINK接GD32F407VET6开发板,STLINK接电脑USB口,OLED接板子。
主要代码
#include "gd32f4xx.h"
#include "gd32f4xx_libopt.h"
#include "systick.h"
#include "oled.h"
uint32_t HalTime1,HalTime2;
//等待时间,us级别
void Delay_us(unsigned long i)
{
unsigned long j;
for(;i>0;i--)
{
for(j=32;j>0;j--);
}
}
uint32_t Distance_Calculate(uint32_t count)//传入时间单位100us
{
uint32_t Distance = 0;
Distance = (uint32_t)(((float)count *17)/10);//距离单位cm,声速340M/S,时间*速度/2=距离
return Distance;
}
uint32_t Distance;
uint32_t TimeCounter;
//定时器配置
void timer_config(void)
{
/* -----------------------------------------------------------------------
系统主频168MHZ,timer_initpara.prescaler为167,timer_initpara.period为99,周期为0.1ms
----------------------------------------------------------------------- */
timer_parameter_struct timer_initpara;
rcu_periph_clock_enable(RCU_TIMER1);
rcu_timer_clock_prescaler_config(RCU_TIMER_PSC_MUL4);//AP1总线最高42MHZ,所以TIME1到168M需要4倍频
timer_deinit(TIMER1);
/* TIMER1 configuration */
timer_initpara.prescaler = 167;
timer_initpara.alignedmode = TIMER_COUNTER_EDGE;
timer_initpara.counterdirection = TIMER_COUNTER_UP;
timer_initpara.period = 99;
timer_initpara.clockdivision = TIMER_CKDIV_DIV1;
timer_initpara.repetitioncounter = 0;
timer_init(TIMER1,&timer_initpara);
nvic_priority_group_set(NVIC_PRIGROUP_PRE1_SUB3);
nvic_irq_enable(TIMER1_IRQn, 0, 1);
timer_interrupt_enable(TIMER1, TIMER_INT_UP);
/* auto-reload preload enable */
timer_auto_reload_shadow_enable(TIMER1);
/* auto-reload preload enable */
timer_enable(TIMER1);
}
int main(void)
{
systick_config();//配置系统主频168M,外部8M晶振,配置在#define __SYSTEM_CLOCK_168M_PLL_8M_HXTAL (uint32_t)(168000000)
rcu_periph_clock_enable(RCU_GPIOA);//使能GPIOA时钟
gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_0);//PA0配置成输出
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0);//配置成推挽输出,50M速度
gpio_mode_set(GPIOA, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_1);//PA1配置成输入
timer_config();
OLED_Init();//OLED初始化
OLED_Clear();//OLED清屏
while(1)
{
gpio_bit_write(GPIOA, GPIO_PIN_0,RESET);//预先拉低Trig引脚
delay_1ms(5);
gpio_bit_write(GPIOA, GPIO_PIN_0,SET);//拉高Trig引脚
Delay_us(20);
gpio_bit_write(GPIOA, GPIO_PIN_0,RESET);//拉低Trig引脚
Delay_us(20);
while(gpio_input_bit_get(GPIOA, GPIO_PIN_1) == 0);//如果是低电平,一直等
HalTime1= TimeCounter;
while(gpio_input_bit_get(GPIOA, GPIO_PIN_1) == 1);//如果是高电平一直等
if(TimeCounter>HalTime1)
{
HalTime2 = TimeCounter-HalTime1;
if(HalTime2<0x300)
{
Distance = Distance_Calculate(HalTime2);//计算距离值
}
}
OLED_Clear();
OLED_ShowCHinese(18,0,0);//光
OLED_ShowCHinese(36,0,1);//子
OLED_ShowCHinese(54,0,2);//物
OLED_ShowCHinese(72,0,3);//联
OLED_ShowCHinese(90,0,4);//网
OLED_ShowString(24,3,"SR04 TEST");
OLED_ShowString(0,6,"Dis: ");
OLED_ShowNum(30,6,Distance,3,16);//显示距离,单位cm
OLED_ShowString(60,6,"cm");
delay_1ms(200);
}
}
extern uint32_t TimeCounter;//时间计数器,单位为100us
void TIMER1_IRQHandler(void)//定时器中断服务程序,中断周期为100us
{
timer_flag_clear(TIMER1,TIMER_FLAG_UP);
TimeCounter++;
}
实验结果:
前方放一个物体,能测试到探测到的距离值。
超声波测距处设置断点,可以查看检测到的距离值,如果检测不到距离值,需要排查超声波模块接线或者物体距离超声波模块太远。
四.工程源代码下载
源代码链接下载如下:
CSDN
五.小结
超声波模块基于声音传播的速度和时间差来计算模块到前方障碍物的距离,可用于人体检测,机器人避障,距离测量等,例如在门口安装超声波模块可以检测人的接近并触发开门动作,或者用于室内的距离测量和自动照明等