基于CW32的超声波模块的应用

例程资料链接如下(群文件也可下载):
BD网盘链接:
链接:https://pan.baidu.com/s/1g_fN3YCBw8RINsl9Pe9c6Q
提取码:knxt
相关视频:基于CW32的超声波模块的应用

一、简介

HC-SR04超声波模块是一种常用的测距模块,其通过发射超声波并接收其反射信号来实现测距功能。因其成本低、精度高、使用简便等特点,被广泛应用于以下场景:

(1)避障机器人:HC-SR04超声波模块可以用于避障机器人的距离测量,通过检测障碍物与机器人的距离,实现避障控制。

(2)智能家居:HC-SR04超声波模块可用于智能家居中的人体检测和距离测量。例如,在门口安装超声波模块,可以检测人的接近并触发开门动作,或者用于室内的距离测量和触发自动照明等。

二、所需物料


本实验用到了CW32F030C8T6小蓝板、0.96寸OLED显示屏、HC-SR04超声波模块及Keil5开发环境。


在这里插入图片描述
在这里插入图片描述

超声波测距系统

三、超声波模块测距的使用方法


(1)连接电源:将VCC引脚连接到+5V,GND引脚连接到GND。

(2)连接触发引脚:将Trig引脚连接到单片机的数字输出引脚。

(3)连接回波引脚:将Echo引脚连接到单片机的数字输入引脚。

(4)发送信号:通过向Trig引脚发送一个至少10微秒的高电平触发信号来启动测距过程。

(5)接收信号:模块发送触发信号后,自动发射超声波,并等待接收反射信号。当接收到反射信号时,Echo引脚会输出一个高电平信号,持续时间与超声波的往返时间成正比。

(6)计算距离:通过测量Echo引脚输出高电平信号的持续时间,可以计算得到距离,一般使用以下公式计算:
距离 = 高电平持续时间 × 声波在空气中传播的速度 / 2。

(7)重复测量:根据需要可定时测量距离,以实现连续的距离监测。
需要注意的是,HC-SR04超声波模块的测距精度受到多种因素的影响,如温度、超声波传播介质等。在使用过程中,需要结合具体的应用场景和需求进行参数调整和校准,以获得准确的距离测量结果。

四、核心代码

HC_SR04.c:
#include "HC_SR04.h"

extern unsigned int time;

void HC_GPIO_Init(void)  
{
	__RCC_GPIOB_CLK_ENABLE();
	
	GPIO_InitTypeDef GPIO_InitStruct; 
	GPIO_InitStruct.IT=GPIO_IT_NONE;
	GPIO_InitStruct.Mode=GPIO_MODE_INPUT_PULLDOWN;//下拉输入
	GPIO_InitStruct.Pins=GPIO_PIN_8;       				//Echo
	GPIO_Init(CW_GPIOB,&GPIO_InitStruct);
	
	GPIO_InitStruct.Speed=GPIO_SPEED_HIGH;
	GPIO_InitStruct.Mode=GPIO_MODE_OUTPUT_PP;     //推挽输出
	GPIO_InitStruct.Pins=GPIO_PIN_9;       				//Trig 
	GPIO_Init(CW_GPIOB,&GPIO_InitStruct);
	
	PB09_SETLOW();   //Trig拉低,为输出脉冲触发信号做准备
}

unsigned int Measure_Distance(void) //测距
{
	unsigned int distance=0;
	
	SetTrig();     //10us的脉冲触发信号
	Delay_us(10);
	ResetTrig();
	while(ReadEcho()==0); //等待Echo输出高电平
	time=0;               //开始记录回波信号脉宽
	while(ReadEcho()==1); //等待Echo输出低电平	   
	distance=time*1.7;//根据声速和时间计算距离,即distance=time*340/2/100
	/*
			关于分辨力(mm):
					定时器每次对time加1是10us,10us=0.01ms,340m/s=340mm/ms
					计算距离时,最小分辨力为:0.01(ms) * 340(mm/ms) / 2 = 1.7(mm)
					小于模块标准精度3mm,故测距结果十分精准
	*/
	return distance; //返回距离,单位mm
}
main.c:
#include "HC_SR04.h"

extern unsigned int time;

void HC_GPIO_Init(void)  
{
	__RCC_GPIOB_CLK_ENABLE();
	
	GPIO_InitTypeDef GPIO_InitStruct; 
	GPIO_InitStruct.IT=GPIO_IT_NONE;
	GPIO_InitStruct.Mode=GPIO_MODE_INPUT_PULLDOWN;//下拉输入
	GPIO_InitStruct.Pins=GPIO_PIN_8;       				//Echo
	GPIO_Init(CW_GPIOB,&GPIO_InitStruct);
	
	GPIO_InitStruct.Speed=GPIO_SPEED_HIGH;
	GPIO_InitStruct.Mode=GPIO_MODE_OUTPUT_PP;     //推挽输出
	GPIO_InitStruct.Pins=GPIO_PIN_9;       				//Trig 
	GPIO_Init(CW_GPIOB,&GPIO_InitStruct);
	
	PB09_SETLOW();   //Trig拉低,为输出脉冲触发信号做准备
}

unsigned int Measure_Distance(void) //测距
{
	unsigned int distance=0;
	
	SetTrig();     //10us的脉冲触发信号
	Delay_us(10);
	ResetTrig();
	while(ReadEcho()==0); //等待Echo输出高电平
	time=0;               //开始记录回波信号脉宽
	while(ReadEcho()==1); //等待Echo输出低电平	   
	distance=time*1.7;//根据声速和时间计算距离,即distance=time*340/2/100
	/*
			关于分辨力(mm):
					定时器每次对time加1是10us,10us=0.01ms,340m/s=340mm/ms
					计算距离时,最小分辨力为:0.01(ms) * 340(mm/ms) / 2 = 1.7(mm)
					小于模块标准精度3mm,故测距结果十分精准
	*/
	return distance; //返回距离,单位mm
}

五、实验最终现象

在这里插入图片描述

  • 20
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值