CW32模块与SR04超声波测距传感器的使用

时间:2025-11-02  作者:Diven  阅读:0

01模块来源

CW32模块与SR04超声波测距传感器的使用

模块实物展示:

wKgaombzi0mAQ4LrAAAtNE7mMH879.webp


资料下载链接:
https://pan.baidu.com/s/1sSah9PvLBrmbA7So-6YcSw
资料提取码:qq35

02 规格参数

工作电压:3-5.5V

工作电流:5.3MA

感应角度:小于15度

探测距离:2CM-600CM

探测精度:0.1CM+1%

输出方式: GPIO

管脚数量:4 Pin

以上信息见厂家资料文件

03移植过程

我们的目标是将例程移植至CW32F030C8T6开发板上【能够判断前方障碍物距离的功能】。首先要获取资料,查看数据手册应如何实现读取数据,再移植至我们的工程。

3.1查看资料

wKgZombzi0mAcQncAAAcqkpLaI810.webp

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

当测量距离超过 HC-SR04 的测量范围时,仍会通过 Echo管脚输出高电平的信号,高电平的宽度约为 66ms。如图所示:

wKgaombzi0mAEZGiAAAWTjYNpcw94.webp

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

3.2引脚选择

wKgZombzi0qAcOg0AACBRoWTv1s53.webp

接线表

3.3移植至工程

工程模板参考入门手册的工程模板

移植步骤中的导入.c和.h文件与【CW32模块使用】DHT11温湿度传感器相同,只是将.c和.h文件更改为bsp_ultrasonIC.c与bsp_ultrasonIC.h。这里不再过多讲述,移植完成后面修改相关代码。

在文件bsp_ultrasonic.c中,编写如下代码。

#include "bsp_ultrasonic.h"unsigned char msHcCount = 0;//ms计数float distance = 0;void Ultrasonic_Init(void){ GPIO_InitTypeDef GPIO_InitStructure; BTIM_TimeBaseInitTypeDef BTIM_TimeBaseInitStruct; // 定时器基本初始化结构体 RCC_SR04_ENABLE(); // 使能GPIO时钟 RCC_TIMER_ENABLE(); // 使能定时器时钟 // GPIO配置参数 GPIO_InitStructure.Pins = GPIO_TRIG; GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出 GPIO_InitStructure.Speed = GPIO_SPEED_HIGH; GPIO_Init(PORT_SR04, &GPIO_InitStructure); GPIO_InitStructure.Pins = GPIO_ECHO; GPIO_InitStructure.Mode = GPIO_MODE_INPUT_PULLUP; // 上拉输入 GPIO_Init(PORT_SR04, &GPIO_InitStructure); // 禁止中断,以安全地配置NVIC __disable_irq(); // 开启BTIM1中断,并关联到NVIC NVIC_EnableIRQ(TIMER_IRQ); // 允许中断,恢复中断状态 __enable_irq(); // 配置定时器模式、周期和预分频器 BTIM_TimeBaseInitStruct.BTIM_Mode = BTIM_Mode_TIMER; // 设置为定时器模式 BTIM_TimeBaseInitStruct.BTIM_Period = 1000 - 1; // 设置周期,使得定时器每1ms产生一次溢出中断 BTIM_TimeBaseInitStruct.BTIM_Prescaler = BTIM_PRS_DIV64; // 预分频器设置为64,以降低时钟频率 // 使用上述配置初始化定时器BTIM1 BTIM_TimeBaseInit(PORT_TIMER, &BTIM_TimeBaseInitStruct); // 使能BTIM1的溢出中断 BTIM_ITConfig(PORT_TIMER, BTIM_IT_OV, ENABLE);// // 启动定时器BTIM1// BTIM_Cmd(PORT_TIMER, ENABLE);}void Open_Timer(void){ BTIM_SetCounter(PORT_TIMER, 0); // 清除定时器计数 msHcCount = 0; BTIM_Cmd(PORT_TIMER, ENABLE); // 使能定时器}uint32_t Get_TIMER_Count(void){ uint32_t time = 0; time = msHcCount*1000; // 得到us time += BTIM_GetCounter(PORT_TIMER); // 得到ms BTIM_SetCounter(PORT_TIMER, 0); // 清除定时器计数 delay_ms(10); return time ;}void Close_Timer(void){ BTIM_Cmd(PORT_TIMER, DISABLE); // 关闭定时器}void TIMER_IRQHandler(void){ if (BTIM_GetITStatus(CW_BTIM1, BTIM_IT_OV)) // 检查定时器中断发生 { msHcCount++; BTIM_ClearITPendingBit(PORT_TIMER, BTIM_IT_OV); // 清除中断标志 }}float Hcsr04GetLength(void){ float length = 0; float t = 0; float sum = 0; unsigned int i = 0; while(i != 10) { SR04_TRIG(1);//trig拉高信号,发出高电平 delay_1us(20);//持续时间超过10us SR04_TRIG(0);//trig拉低信号,发出低电平 while(SR04_ECHO() == GPIO_Pin_RESET);//echo等待回响 Open_Timer(); //打开定时器 i++; while(SR04_ECHO() == GPIO_Pin_SET); Close_Timer(); // 关闭定时器 t = Get_TIMER_Count(); // 获取时间,分辨率为1us length = (float)t / 58.0f; // cm sum += length; } length = sum/10;//五次平均值 distance = length; return length;}

在文件bsp_ultrasonic.h中,编写如下代码。

#ifndef _BSP_ULTRASONIC_H_#define _BSP_ULTRASONIC_H_#include "board.h"#define RCC_SR04_ENABLE() __RCC_GPIOA_CLK_ENABLE()#define PORT_SR04 CW_GPIOA#define GPIO_TRIG GPIO_PIN_1#define GPIO_ECHO GPIO_PIN_2#define RCC_TIMER_ENABLE() __RCC_BTIM_CLK_ENABLE()#define PORT_TIMER CW_BTIM1#define TIMER_IRQ BTIM1_IRQn#define TIMER_IRQHandler BTIM1_IRQHandler#define SR04_TRIG(x) GPIO_WritePin( PORT_SR04, GPIO_TRIG, x?GPIO_Pin_SET:GPIO_Pin_RESET)#define SR04_ECHO() GPIO_ReadPin( PORT_SR04, GPIO_ECHO )void Ultrasonic_Init(void);//超声波初始化float Hcsr04GetLength(void );//获取超声波测距的距离#endif

04移植验证

在自己工程中的main主函数中,编写如下。

#include "board.h"#include "stdio.h"#include "bsp_uart.h"#include "bsp_ultrasonic.h"int32_t main(void){ board_init(); // 开发板初始化 uart1_init(115200); // 串口1波特率115200 Ultrasonic_Init(); printf("Start.......rn"); while(1) { printf((const char *)"距离为 = %.2fCMrn",Hcsr04GetLength() ); delay_ms(500); }}

移植现象:距离20CM处摆放障碍物,输出换算后的实际距离。

wKgaombzi0qAOkGFAAB_Ihj1Y4g84.webp

模块移植成功案例代码:

链接:https://pan.baidu.com/s/1AwXOFbLryUoYPW-ueRZ_qA?pwd=LCKF

提取码:LCKF
审核编辑 黄宇

猜您喜欢

江门可调电容器是一个重要的电子元件。在电路中起着关键作用。可调电容器可以根据需求调节电容值。本文将介绍江门可调电容器的特点和应用。产品种类多样江门的可调电容器种...
2025-03-21 20:01:39

1、前言分频器是FPGA设计中使用频率非常高的基本单元之一。尽管目前在大部分设计中还广泛使用集成锁相环(如Altera的PLL,Xilinx的DLL)来进行时...
2019-02-01 01:49:00

TDK作为全球知名的电子元件制造商,其生产的金属膜电阻因高性能和可靠性受到青睐。随着市场需求的不断增长,TDK旗下的金属膜电阻产品也呈现出多样化和差异化。本文将...
2018-11-04 18:20:39

采样电阻作为电子电路中的关键元件,其性能直接影响着电路的稳定性和精度。FOSAN(富捷电子)作为国内知名的电子元器件供应商,其采样电阻产品因品质优良、型号丰富而...
2015-05-10 20:45:25

风华贴片电阻标签通常采用三位数字或四位数字表示阻值,也可能用字母R表示小数点。三位数字: 前两位数字表示有效数字,第三位数字表示10的幂次方。例如,102表示1...
2024-11-29 10:26:08

放大镜是常见的光学工具,应用于阅读、观察细节以及科学实验等场景。放大镜的规格和尺寸多种多样,通常以镜片直径和放大倍数来区分。常见的放大镜镜片直径有30mm、50...
2019-10-27 00:00:00

工业测温领域,热电阻作为一种精确的温度测量仪器,得到了应用。尤其是铠装热电阻和铂电阻,这两种热电阻在实际应用中有着不同的特点和优势。本文将帮助大家了解这两者的区...
2025-03-16 15:00:34

电解电容和独石电容是电子元件中常见的。在电路中都有重要的作用。虽然看起来相似,但其实有很大的不同。本文将介绍这两种电容的特点和应用。电解电容的定义电解电容是利用...
2025-03-19 14:31:06

电位器作为调节电压、电流的重要元件,应用十分。立隆(LELON)作为国内知名的电位器品牌,稳定的质量和多样的规格赢得了众多客户的青睐。本文将详细介绍立隆电位器的...
2017-02-21 07:18:30

贴片电阻损坏需要更换?别担心,即使没有专业设备,你也可以轻松搞定!以下步骤教你如何安全快速地更换贴片电阻:你需要准备一把烙铁、焊锡丝、吸锡器以及新的贴片电阻。确...
2024-11-29 10:26:07