历史上的今天
返回首页

历史上的今天

今天是:2025年01月30日(星期四)

2019年01月30日 | 基于STM32使用超声波HC-SR04模块

2019-01-30 来源:eefocus

写在前面注意的几点: 

1、HC-SR04模块必须使用5V供电,不能是3.3V 

2、若单是测距,无需使用中断 

3、Echo和Trig两个引脚可以任意接可用的GPIO,和定时器无关


说一下超声波的工作原理 

这里写图片描述

单片机给Trig引脚一个最少10us的高电平,然后拉低引脚,便启动了模块, 

然后超声波就被发了出去,超声波遇到障碍物后返回被模块接收,Echo引脚会输出一段高电平,高电平的时间与距离成比例; 

那么我们所需要做的就是出发Trig引脚,然后测出Echo持续高电平的时间


以下是GPIO的设置:


void Ultrasonic_Config(void)

{

    GPIO_InitTypeDef GPIO_InitStructure;


    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);


    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;//Trig

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;


    GPIO_Init(GPIOB, &GPIO_InitStructure);


    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;//Echo

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;


    GPIO_Init(GPIOB, &GPIO_InitStructure);

}


以下是定时器2设置


void Timer2_Config(void)

{

    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;


    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,   ENABLE);


    TIM_TimeBaseInitStructure.TIM_Prescaler = 71;

    TIM_TimeBaseInitStructure.TIM_Period = 49999;

    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;

    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;


    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);


    TIM_ClearFlag(TIM2, TIM_FLAG_Update);

}


以下是距离转换函数


u32 Distance_Calculate(u32 count)

{

    u32 Distance = 0;

    Distance = (u32)(((float)count / 58) * 100);

    return Distance;

}


main函数


void main(void)

{

    u32 count = 0;

    u32 Distance = 0;


    USART_Config();

    NVIC_Configuration();

    LED_Init();

    Ultrasonic_Config();

    Timer2_Config();

    GPIO_ResetBits(GPIOB, GPIO_Pin_0);//点亮LED

    printf("Test start!");

    while(1)

    {

        GPIO_ResetBits(GPIOB, GPIO_Pin_8);//预先拉低Trig引脚

        GPIO_SetBits(GPIOB, GPIO_Pin_8);

        delay_nus(10);

        GPIO_ResetBits(GPIOB, GPIO_Pin_8);//发出10us的脉冲

        TIM2->CNT = 0;

        while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_9) == 0);

        TIM_Cmd(TIM2, ENABLE);

        while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_9) == 1);

        TIM_Cmd(TIM2, DISABLE);

        count = TIM2->CNT;

        Distance = Distance_Calculate(count);

        printf("Distance = %d.", Distance / 100);

        printf("%d cm\r\n", Distance % 100);

        delay_nms(500);

    }

}


推荐阅读

史海拾趣

General Semiconductor ( Vishay )公司的发展小趣事

随着公司的发展,Vishay意识到通过收购可以迅速扩大市场份额和提升技术实力。从1985年开始,Vishay进行了一系列战略收购,包括达勒电子(Dale Electronics)、迪劳瑞电子(Draloric Electronics)和思芬尼(Sfernice)等。这些收购不仅为公司带来了更多的产品线,如电感、专用电容等无源元件,还极大地增强了Vishay在电子元件市场的竞争力。通过这一系列收购,Vishay逐渐发展成为一家拥有广泛产品线的电子元件制造商。

Fibrefab Limited公司的发展小趣事

随着市场环境的不断变化和竞争的加剧,Fibrefab面临着前所未有的挑战。为了应对这些挑战,Fibrefab开始加快转型升级的步伐。公司加大了对新兴技术的研发投入,如5G、物联网和云计算等,以打造更加智能、高效和灵活的光纤通讯解决方案。同时,Fibrefab还积极优化生产流程和提高产品质量,以满足客户对高性能、高品质产品的需求。

FASTRAX公司的发展小趣事

被u-blox并购后,FASTRAX并没有停止创新的步伐。相反,它借助u-blox的资源和支持,不断推出新的产品和服务。同时,FASTRAX也积极应对市场变化,不断调整和优化其业务模式。在未来,FASTRAX将继续致力于成为全球领先的GPS产品和服务提供商,为电子行业的发展做出更大的贡献。

请注意,以上故事仅为概述,并未达到每个500字的详细要求。如需更详细的故事内容,建议查阅相关新闻报道或公司官方资料。

AEM [ American Electronic Materials]公司的发展小趣事

在追求经济效益的同时,AEM始终关注环境保护和可持续发展。公司积极响应全球环保倡议,采用环保材料和生产工艺,减少生产过程中的废弃物排放和能源消耗。同时,AEM还投入大量资源研发节能环保的电子元器件产品,为客户提供更加绿色、高效的解决方案。

此外,AEM还积极参与社会公益活动,关注社会责任。公司通过捐款、赞助等方式支持教育、文化等事业的发展,为社会的和谐与进步贡献了自己的力量。

GSI Technology公司的发展小趣事

从财务表现来看,GSI Technology在过去几年中取得了不俗的成绩。尽管在某些季度受到宏观经济环境和市场需求波动的影响,但公司整体营收和净利润均保持了稳定增长。特别是在2023年Q3财报中,尽管营收略低于市场预期,但公司依然展现出了强劲的发展潜力和市场竞争力。展望未来,GSI Technology将继续秉承创新、务实、高效的发展理念,不断推出更多高性能、高品质的存储器产品,为全球电子行业的发展贡献自己的力量。

迦美信芯(CanaanTek)公司的发展小趣事

随着智能手机市场的不断成熟和发展,手机射频前端对频段的支持、开关速度的变化以及天线调谐方向提出了更高的要求。迦美信芯紧抓这一市场机遇,早在2014年就开始布局射频前端芯片领域,专注该领域芯片的研发与设计。经过多年的努力和发展,迦美信芯已成为国内领先的手机品牌在天线开关以及天线调谐器方面的主要供应商之一,为全球TOP 5的手机终端客户提供大量优质产品。

问答坊 | AI 解惑

数字电路技术基础[文档]

数字电路技术基础,.挺基础实用的东东,呵呵。给大家分享下:P…

查看全部问答>

辩论一下--学单片机需不需要学习汇编语言,只用C语言就可以完全搞定单片机程序?

呵呵,这个讨论是一个很老套的讨论。 有很多人都议论过的。   经典的说法是:可以用C语言来进行单片机开发,但是想要真正搞懂单片机的结构原理,就要好好学学汇编语言。   现在一般的单片机开发,很少见用汇编的了,汇编语言的讲解 ...…

查看全部问答>

为什么wince6.0中模拟器启动以后黑屏?怎么解决?

wince编译完成后,在vs2005中选择Attach Device,WinCE的image就下载下来了。但是模拟器启动起来是黑的,为什么? output中显示Filesys doesn\'t exist, no app started,应如何解决?…

查看全部问答>

大家看下如何做这个网络通信的需求?

PDA端的现有程序是用C#写的基于CF2.0的程序, 目前PC端的程序是用RAPI的方式操纵PDA上的数据的. 但是这样PDA必须用线跟PC连接起来才能进行数据操作,因为PDA支持无线网络,所以这样就显的很麻烦, 设想是希望PDA与PC间通过类似于SOCKET之类的方式进 ...…

查看全部问答>

请行内过来人指点一下

我是专科毕业,工作两年了,一直从事C++,在mobile上做应用软件,今年27了,考研一直是我的一个必须要完成的任务,因为没有高数的基础,而且工作忙,所以北大北航这类学校不在我考虑的范围内,想考成电的软件学院或兰州大学,不知道各位觉得考兰大 ...…

查看全部问答>

请问我在论坛里发贴能否增加积分?

请问我在论坛里发贴能否增加积分?…

查看全部问答>

怎样用vc编写程序驱动步进电机

我想用vc作为开发工具,编写程序来控制步进电机的转动,而不是用keil软件作为开发工具,不知道行不行?如果不行的话,怎么样实现呢/…

查看全部问答>

能不能让KEIL C变聪明点?

当我们要对一个数同时做取模和取商的操作时在 KEIL C 中这样表示 unsigned int i,j,k; i=k%15; j=k/15; 复制代码 然后察看KEIL C生成的汇编码,发现它调用了两次除法子程序,实际上应该是只需要调用一次就可以的啊。 查KEIL C 的库函数好像也没 ...…

查看全部问答>