0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于CW32模块的SR04超声波测距传感器设计

武汉芯源半导体 来源:武汉芯源半导体 2024-11-12 11:19 次阅读

01 模块来源

模块实物展示:

e8ef7c16-a09e-11ef-93f3-92fbcf53809c.png

02 规格参数

工作电压:3-5.5V

工作电流:5.3MA

感应角度:小于15度

探测距离:2CM-600CM

探测精度:0.1CM+1%

输出方式: GPIO

管脚数量:4 Pin

以上信息见厂家资料文件

03 移植过程

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

3.1 查看资料

e9127d38-a09e-11ef-93f3-92fbcf53809c.png

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

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

e925fc5a-a09e-11ef-93f3-92fbcf53809c.png

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

3.2 引脚选择

e92d60f8-a09e-11ef-93f3-92fbcf53809c.png

接线表

3.3 移植至工程

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

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

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

/*
 * Change Logs:
 * Date           Author       Notes
 * 2024-06-20     LCKFB-LP    first version
 */


#include "bsp_ultrasonic.h"




unsigned char msHcCount = 0;//ms计数
float distance = 0;


/******************************************************************
 * 函 数 名 称:bsp_ultrasonic
 * 函 数 说 明:超声波初始化
 * 函 数 形 参:无
 * 函 数 返 回:无
 * 作       者:LC
 * 备       注:TRIG引脚负责发送超声波脉冲串
******************************************************************/
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);




}
/******************************************************************
 * 函 数 名 称:Open_Timer
 * 函 数 说 明:打开定时器
 * 函 数 形 参:无
 * 函 数 返 回:无
 * 作       者:LC
 * 备       注:
******************************************************************/
void Open_Timer(void)
{
    BTIM_SetCounter(PORT_TIMER, 0);   // 清除定时器计数


    msHcCount = 0;


    BTIM_Cmd(PORT_TIMER, ENABLE);   // 使能定时器
}


/******************************************************************
 * 函 数 名 称:Get_TIMER_Count
 * 函 数 说 明:获取定时器定时时间
 * 函 数 形 参:无
 * 函 数 返 回:数据
 * 作       者:LC
 * 备       注:
******************************************************************/
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 ;
}


/******************************************************************
 * 函 数 名 称:Close_Timer
 * 函 数 说 明:关闭定时器
 * 函 数 形 参:无
 * 函 数 返 回:无
 * 作       者:LC
 * 备       注:
******************************************************************/
void Close_Timer(void)
{
        BTIM_Cmd(PORT_TIMER, DISABLE);   // 关闭定时器
}


/******************************************************************
 * 函 数 名 称:TIMER_IRQHandler
 * 函 数 说 明:定时器中断服务函数
 * 函 数 形 参:无
 * 函 数 返 回:无
 * 作       者:LC
 * 备       注:1ms进入一次
******************************************************************/
void TIMER_IRQHandler(void)
{
    if (BTIM_GetITStatus(CW_BTIM1, BTIM_IT_OV))   // 检查定时器中断发生
    {
                msHcCount++;


        BTIM_ClearITPendingBit(PORT_TIMER, BTIM_IT_OV);  // 清除中断标志
    }
}




/******************************************************************
 * 函 数 名 称:Hcsr04GetLength
 * 函 数 说 明:获取测量距离
 * 函 数 形 参:无
 * 函 数 返 回:测量距离
 * 作       者:LC
 * 备       注:无
******************************************************************/
float Hcsr04GetLength(void)
{
        /*测5次数据计算一次平均值*/
        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拉低信号,发出低电平
                /*Echo发出信号 等待回响信号*/
                /*输入方波后,模块会自动发射8个40KHz的声波,与此同时回波引脚(echo)端的电平会由0变为1;
                (此时应该启动定时器计时);当超声波返回被模块接收到时,回波引 脚端的电平会由1变为0;
                (此时应该停止定时器计数),定时器记下的这个时间即为
                                                                                超声波由发射到返回的总时长;*/


                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中,编写如下代码。

/*
 * Change Logs:
 * Date           Author       Notes
 * 2024-06-20     LCKFB-LP    first version
 */
#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主函数中,编写如下。

/*
 * Change Logs:
 * Date           Author       Notes
 * 2024-06-20     LCKFB-LP    first version
 */
#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.......
");


    while(1)
    {
        printf((const char *)"距离为 = %.2fCM
",Hcsr04GetLength() );
        delay_ms(500);
    }
}

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

e94664fe-a09e-11ef-93f3-92fbcf53809c.png

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 传感器
    +关注

    关注

    2546

    文章

    50506

    浏览量

    751240
  • 超声波
    +关注

    关注

    63

    文章

    2984

    浏览量

    138164
  • 测距传感器
    +关注

    关注

    0

    文章

    74

    浏览量

    20196
  • CW32
    +关注

    关注

    1

    文章

    177

    浏览量

    552

原文标题:【CW32模块使用】SR04超声波测距传感器

文章出处:【微信号:武汉芯源半导体,微信公众号:武汉芯源半导体】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    超声波传感器HC-SR04测距实例软件

    超声波传感器HC-SR04测距实例软件STM32CubeMX,keil5,野火串口调试助手硬件stm32f103vet6开发板,J-Link,超声波
    发表于 07-30 07:03

    HC-SR04超声波测距模块原理

    、HC-SR04超声波测距模块原理1.模块简介HC-SR04
    发表于 12-06 07:14

    HC-SR04超声波测距模块及程序

    HC-SR04超声波测距模块及程序HC-SR04超声波测距
    发表于 12-08 16:50 83次下载

    HC_SR04超声波测距模块资料

    HC_SR04超声波测距模块资料,有程序和原理图,欢迎下载。
    发表于 03-18 17:00 13次下载

    HC-SR04超声波测距资料

    、HC-SR04超声波测距资料帮你了解传感器实验、使用快速入门,你拥有值得。
    发表于 05-10 10:36 18次下载

    简单的超声波测距模块制作_HC-SR04超声波测距模块及制作图详解

    本文主要介绍的是HC-SR04超声波测距模块及制作图详解,首先介绍了超声波测距原理及特点,其次阐
    发表于 05-18 09:40 5.3w次阅读
    简单的<b class='flag-5'>超声波</b><b class='flag-5'>测距</b><b class='flag-5'>模块</b>制作_HC-<b class='flag-5'>SR04</b><b class='flag-5'>超声波</b><b class='flag-5'>测距</b><b class='flag-5'>模块</b>及制作图详解

    ApmSonar超声波SR04传感器固件免费下载

    本文档的主要内容详细介绍的是ApmSonar超声波SR04传感器固件免费下载。
    发表于 09-25 08:00 16次下载

    HC-SR04超声波传感器模块的示例代码资料合集

    本文档的主要内容详细介绍的是HC-SR04超声波传感器模块的示例代码资料合集包括了:超声波PIC单片机C程序,
    发表于 06-17 08:00 9次下载

    HC-SR04超声波测距块讲解(附32单片机源码)

    、HC-SR04超声波测距模块原理1.模块简介HC-SR04
    发表于 11-23 18:21 132次下载
    HC-<b class='flag-5'>SR04</b><b class='flag-5'>超声波</b><b class='flag-5'>测距</b>块讲解(附32单片机源码)

    超声波传感器HC SR04与Arduino教程

    电子发烧友网站提供《超声波传感器HC SR04与Arduino教程.zip》资料免费下载
    发表于 10-19 10:18 0次下载
    <b class='flag-5'>超声波</b><b class='flag-5'>传感器</b>HC <b class='flag-5'>SR04</b>与Arduino教程

    使用超声波传感器HC SR04和Arduino Uno制作超声波距离传感器

    电子发烧友网站提供《使用超声波传感器HC SR04和Arduino Uno制作超声波距离传感器.zip》资料免费下载
    发表于 10-31 09:35 1次下载
    使用<b class='flag-5'>超声波</b><b class='flag-5'>传感器</b>HC <b class='flag-5'>SR04</b>和Arduino Uno制作<b class='flag-5'>超声波</b>距离<b class='flag-5'>传感器</b>

    超声波测距模块HC SR04与Arduino连接

    电子发烧友网站提供《将超声波测距模块HC SR04与Arduino连接.zip》资料免费下载
    发表于 11-11 14:26 0次下载
    将<b class='flag-5'>超声波</b><b class='flag-5'>测距</b><b class='flag-5'>模块</b>HC <b class='flag-5'>SR04</b>与Arduino连接

    Arduino HC SR04超声波距离传感器

    电子发烧友网站提供《Arduino HC SR04超声波距离传感器.zip》资料免费下载
    发表于 12-22 16:31 0次下载
    Arduino HC <b class='flag-5'>SR04</b><b class='flag-5'>超声波</b>距离<b class='flag-5'>传感器</b>

    使用HC SR04超声波传感器进行速度测量

    电子发烧友网站提供《使用HC SR04超声波传感器进行速度测量.zip》资料免费下载
    发表于 02-07 14:37 12次下载
    使用HC <b class='flag-5'>SR04</b><b class='flag-5'>超声波</b><b class='flag-5'>传感器</b>进行速度测量

    基于CW32超声波模块的应用

    C-SR04超声波模块是一种常用的测距模块,其通过发射超声波并接收其反射信号来实现测距功能。
    的头像 发表于 09-06 09:13 935次阅读