【STM32CubeMX】HC_SR04模块测距

前言

  本文章介绍了基于STM32F103的HAL库,完成对HC_SR04超声波模块测距的基本思路和工程案例。

环境

  • STM32F103C6T6系统板,72MHz主频
  • 基于STM32CubeMX生成的HAL库代码
  • 硬件连接:
    • PB12 — Echo(HC_SR04),PB13 — Trig(HC_SR04)
    • PB9 — SDA(OLED),PB8 — SCL(OLED)
    • HC_SR04模块供电一般3.3V~5V行

思路

  外设配置,配置tim2分频后为1us状态,PB12配置为上升沿中断模式,且使能引脚中断的NVIC管理,PB13,PB9,PB8配置为输出模式。

  总体思路,通过在PB13连接的HC_SR04的Trig引脚发出高电平脉冲后,等待一些时间后,声波返回,通过PB12连接的Echo引脚的外部中断(上升沿模式),进入外部中断事件后,在重置定时器的计数值为0后,开启定时器,判断下降沿的到来,到来后则停止定时器计数,然后获取计数值,通过运算后得到距离值。

流程

  1. 去RCC使能使用外部高速晶振,在去时钟配置中,将主频提到72MHz。

  2. 配置tim2分频后为1us状态,也就是计数器每加1,相当与过了1us(主频72M/72=1000000,每秒计数)。计数周期给到最大。

    在这里插入图片描述

  3. PB12引脚配置,左图找到引脚左键选择GPIO_EXTI模式,然后配置GPIO mode为上升沿触发模式,然后记得在NVIC中使能线路中断。

    在这里插入图片描述

  4. 其余三个GPIO引脚默认输出模式即可。在这里插入图片描述

代码

  1. 代码方面除了上述配置生成的,还导入OLED(IIC)的库,和编写的HC_SR04的库,反正没几行我就直接粘贴出来了。我在计算距离时用了整型来获得结果,想要提高精度的话可以改成浮点型的。

  2. HC_SR04库代码

    HC_SR04.h

    #ifndef __HC_SR04_H__
    #define __HC_SR04_H__
    
    void HCSR04_Trigger(void);
    void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);
    unsigned int HCSR04_ReValue(void);
    
    #endif
    

    HC_SR04.c

    #include "main.h"
    #include "tim.h"
    #include "gpio.h"
    
    /**
    * @描述:使用HC_SR04测量距离。
    * @前置:在STM32CubeMX上完成tim2,gpio13,12的相关配置。
    *		tim2,完成定时器2的主频/分频系数=1us,配置好PB12,PB13的相关模式。		
    */
    
    unsigned int Value=0;
    unsigned int Length=0;
    
    /**
    * @描述:触发函数,给予一定时间的高电平脉冲
    * @返回:无
    */
    void HCSR04_Trigger(void)
    {
    //触发引脚
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_SET);
    //理论有10us间隔,我这里没加
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET);
    }
    
    /**
    * @描述:该函数为,重写引脚外部中断回调函数
    * @返回:无
    */
    void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
    {
    if(GPIO_Pin & GPIO_PIN_12)
    {
        //计数返回脉冲长度
        __HAL_TIM_SET_COUNTER(&htim2,0);		//计数值归零
        HAL_TIM_Base_Start(&htim2);
        while(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12));
        HAL_TIM_Base_Stop(&htim2);
        Value=__HAL_TIM_GET_COUNTER(&htim2);	//获取计数值
        //测试距离=(高电平时间*声速(340M/S))/2
        Length=(Value*0.034)/2;
    }
    }
    
    /**
    * @描述:该函数为,返回
    * @返回:计算好的距离整型,单位cm
    */
    unsigned int HCSR04_ReValue(void)
    {
    return Length;
    }
    
    

演示

在这里插入图片描述

在这里插入图片描述

工程

文章演示工程

链接:https://pan.baidu.com/s/16hKY0LDolT0ADzDrfFdf9w  提取码:1xdv

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32HC-SR04是两个不同的东西。STM32是一系列由STMicroelectronics开发的32位微控制器,而HC-SR04是一种超声波传感器模块。在STM32中使用HC-SR04进行测距的方法可以通过以下步骤实现: 1. 初始化系统和串口:在main函数中调用Med_Mcu_Iint()函数进行系统初始化,确保串口功能正常。 2. 获取距离信息:通过调用Med_Hcsr04_GetLength()函数获取HC-SR04返回的距离信息,并将其存储在gDistance变量中。 3. 打印距离信息:使用printf函数将距离信息以字符串的形式打印到串口上,可以使用格式化字符串来控制输出的格式。 4. 延时:使用delay_ms函数进行延时,以控制测距的频率。在这个例子中,延时500毫秒。 需要注意的是,以上代码只是一个示例,具体的实现可能会根据具体的硬件和软件环境有所不同。在实际应用中,还需要根据需要进行其他的配置和处理,比如设置引脚的输入输出模式、配置定时器等。 引用\[1\]:\[1\]提供了关于超声波测距的基本原理和程序实现的详细内容。引用\[2\]提供了一个使用HC-SR04进行测距的示例代码。引用\[3\]介绍了HC-SR04模块的引脚功能和使用方法。 #### 引用[.reference_title] - *1* *2* *3* [STM32外设系列—HC-SR04(超声波)](https://blog.csdn.net/qq_45217381/article/details/131412928)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值