超声波模块介绍
SR04超声波模块是一款广泛应用的测距传感器,主要用于使用超声波测量物体与传感器之间的距离。它是一个成本低廉、精度较高且易于使用的传感器,常用于机器人、智能家居、无人机、汽车防撞系统等项目。以下是SR04超声波模块的主要特点和应用:
测距范围: SR04模块的测距范围通常在2厘米到400厘米之间,适合多种应用。
高精度: 它具备较好的测量精度,通常可达±3毫米,这使其适用于需要精确测量的场合。
工作原理: SR04模块通过发射超声波脉冲并测量声波反射回来的时间来计算距离。传感器的超声波发射和接收分别由两个探头(发射器和接收器)完成。
简单接口: 通常使用简单的GND、VCC、Trig(触发信号)和Echo(回声信号)四个引脚,便于连接到微控制器(如Arduino)上。
低功耗: 在待机状态下,SR04的功耗较低,适合电池供电的项目。
超声波模块工作原理

只需要在 Trig 管脚(触发信号)输入一个 10US 以上的高电平,系统便可发出 8 个 40KHZ 的超声波脉冲,然后检测回波信号。当检测到回波信号后,通过 Echo 管脚输出。根据 Echo 管脚输出高电平的持续时间可以计算距离值。即距离值为:(高电平时间*340m/s)/2。
当测量距离超过 HC-SR04 的测量范围时,仍会通过 Echo管脚输出高电平的信号,高电平的宽度约为 66ms。如图所示:

测量周期:当接收到 HC-SR04 通过 Echo 管脚输出的高电平脉冲后,便可进行下一次测量,所以测量周期取决于测量距离,当距离被测物体很近时,Echo 返回的脉冲宽度较窄,测量周期 就很短;当距离被测物体比较远时,Echo 返回的脉冲宽度较宽,测量周期也就相应地变长。最坏情况下,被测物体超出超声波模块的测量范围,此时 返回的脉冲宽度最长,约为 66ms,所以最坏情况下的测量周期稍大于 66ms 即可(取 70ms 足够)。
电路连接
该模块在主控制板上与CW32L012/F030连接如下:

两个引脚分别接到了PA8与PA15端口。
工程代码
在文件HC_SR04.C中编写如下代码
#define Trig_Send(x) GPIO_WritePin(CW_GPIOA, GPIO_PIN_8, (GPIO_PinState)(x)) #define Echo_Input GPIO_ReadPin(CW_GPIOA, GPIO_PIN_15) uint16_t Get_Time; /************************** 定时器配置 中断周期为1ms **************************/ void TIM_Init(void) { RCC_APBPeriphClk_Enable2(RCC_APB2_PERIPH_BTIM,ENABLE); BTIM_TimeBaseInitTypeDef BTIM_Initstructure; BTIM_Initstructure.BTIM_Mode=BTIM_Mode_TIMER; BTIM_Initstructure.BTIM_OPMode=BTIM_OPMode_Repetitive; BTIM_Initstructure.BTIM_Period=1000-1; BTIM_Initstructure.BTIM_Prescaler=BTIM_PRS_DIV64;//64分频 BTIM_TimeBaseInit(CW_BTIM1,&BTIM_Initstructure); BTIM_ITConfig(CW_BTIM1,BTIM_IT_OV,ENABLE); // BTIM_Cmd(CW_BTIM1,ENABLE); NVIC_SetPriority(BTIM1_IRQn,8);//中断优先级 NVIC_EnableIRQ(BTIM1_IRQn);//开启中断 } void HC_SR04_Init(void) { __RCC_GPIOA_CLK_ENABLE(); GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.IT=GPIO_IT_NONE; GPIO_InitStruct.Mode=GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pins=GPIO_PIN_8; GPIO_InitStruct.Speed=GPIO_SPEED_HIGH; GPIO_Init(CW_GPIOA, &GPIO_InitStruct); GPIO_InitStruct.IT=GPIO_IT_NONE; GPIO_InitStruct.Mode=GPIO_MODE_INPUT_PULLDOWN; GPIO_InitStruct.Pins=GPIO_PIN_15; GPIO_InitStruct.Speed=GPIO_SPEED_HIGH; GPIO_Init(CW_GPIOA, &GPIO_InitStruct); Trig_Send(0); TIM_Init(); } void BTIM1_Start(void)//打开定时器 { BTIM_SetCounter(CW_BTIM1,0); Get_Time=0; BTIM_Cmd(CW_BTIM1,ENABLE); } void BTIM1_Stop(void)//关闭定时器 { BTIM_Cmd(CW_BTIM1,DISABLE); } uint32_t Get_Tim_Timer(void)//得到信号反射时间 { uint32_t time; time=Get_Time*1000; time+=BTIM_GetCounter(CW_BTIM1); BTIM_SetCounter(CW_BTIM1,0); return time; } float Get_Disance(void)//距离计算 { uint8_t i; uint16_t time=0; float Distance=0; float Temp=0; float num=0; for(i=0;i< 10;i++) { Trig_Send(1);//trig拉高信号,发出高电平 delay10us(2); Trig_Send(0);//trig拉低信号,发出低电平 while(Echo_Input==0); BTIM1_Start(); while(Echo_Input==1); BTIM1_Stop(); /*Echo发出信号 等待回响信号*/ /*输入方波后,模块会自动发射8个40KHz的声波,与此同时回波引脚(echo)端的电平会由0变为1; (此时应该启动定时器计时);当超声波返回被模块接收到时,回波引 脚端的电平会由1变为0; (此时应该停止定时器计数),定时器记下的这个时间即为 超声波由发射到返回的总时长;*/ time=Get_Tim_Timer(); Temp=(float)time/58.2; // 获取时间,分辨率为1us num+=Temp; Delay_ms(4); } Distance=num/10.0; return Distance; } void BTIM1_IRQHandler(void) { if(BTIM_GetITStatus(CW_BTIM1,BTIM_IT_OV)==1) { Get_Time++; } BTIM_ClearITPendingBit(CW_BTIM1,BTIM_IT_OV); }
在main.c中编写如下代码
int main(void)
{
OLED_Init();//初始化
HC_SR04_Init();
OLED_ShowString(1,1,"hello");//OLED显示字符串
while(1)
{
OLED_ShowString(2,1,"Dis:");
OLED_ShowNum(2,5,Get_Disance(),3);//距离显示
OLED_ShowString(2,9,"cm");;
}
}
工作现象
将代码烧入主控制板之后,可以观察到以下现象
OLED显示屏第一行第一列显示字符串hello
第二行显示距离单位cm
-
超声波
+关注
关注
63文章
3325浏览量
146064 -
智能小车
+关注
关注
87文章
565浏览量
83523 -
CW32
+关注
关注
1文章
324浏览量
1958
发布评论请先 登录
CW32L012/F030灵眸X1智能小车——使用蓝牙模块通讯
CW32L012小型机器人控制评估板活动 四足机器人+智能小车 开箱评测
超声波模块测距问题
HC-SR04超声波模块的工作原理是什么
超声波模块的原理
利用超声波模块设计智能避障的WiFi小车
怎么使用STM32F1驱动超声波模块
超声波模块的工作原理与时序图学习
怎样利用HY-SRF05超声波模块实现超声波的测距避障呢
利用HY-SRF05 超声波模块实现超声波的测距避障
CW32L012/F030灵眸X1智能小车——超声波模块配置
评论