一、简介
1. C-SR04超声波模块是一种常用的测距模块,其通过发射超声波并接收其反射信号来实现测距功能。因其成本低、精度高、使用简便等特点,被广泛应用于以下场景:
(1)避障机器人:HC-SR04超声波模块可以用于避障机器人的距离测量,通过检测障碍物与机器人的距离,实现避障控制。
(2)智能家居:HC-SR04超声波模块可用于智能家居中的人体检测和距离测量。例如,在门口安装超声波模块,可以检测人的接近并触发开门动作,或者用于室内的距离测量和触发自动照明等。
2. 本实验用到了CW32F030C8T6小蓝板、0.96寸OLED显示屏、HC-SR04超声波模块及Keil5开发环境。
二、超声波模块测距的使用方法
使用流程 连接电源 将VCC引脚连接到+5V,GND引脚连接到GND。
连接触发引脚
将Trig引脚连接到单片机的数字输出引脚。
连接回波引脚
将Echo引脚连接到单片机的数字输入引脚。
发送信号
通过向Trig引脚发送一个至少10微秒的高电平触发信号来启动测距过程
接收信号
模块发送触发信号后,自动发射超声波,并等待接收反射信号。当接收到反射信号时,Echo引脚会输出一个高电平信号,持续时间与超声波的往返时间成正比。
计算距离
通过测量Echo引脚输出高电平信号的持续时间,可以计算得到距离,一般使用以下公式计算:
距离= 高电平持续时间 × 声波在空气中传播的速度 / 2。
重复测量
根据需要可定时测量距离,以实现连续的距离监测。
需要注意的是,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 }
审核编辑:刘清
-
OLED显示屏
+关注
关注
6文章
217浏览量
30675 -
GND
+关注
关注
2文章
539浏览量
38696 -
避障机器人
+关注
关注
0文章
18浏览量
7695 -
超声波模块
+关注
关注
1文章
21浏览量
13500 -
CW32
+关注
关注
1文章
203浏览量
626
原文标题:【CW32优秀项目展示】基于CW32的超声波模块的应用
文章出处:【微信号:武汉芯源半导体,微信公众号:武汉芯源半导体】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论