【STM32CubeMX】HC_SR04模块测距

文章介绍了如何使用STM32F103C6T6微控制器和HAL库,配合HC_SR04超声波模块进行测距。通过配置TIM2为1us分辨率的定时器,设置PB12引脚为上升沿中断模式,触发超声波信号并测量回波时间,从而计算距离。代码中包含了OLED显示的支持,并提供了完整的HC_SR04库代码示例。
摘要由CSDN通过智能技术生成

前言

  本文章介绍了基于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

摘要:超声波测距是一种典型的非接触测量方式,应用非常广泛。本文提出了一种基于STM32单片机的高精度超声波测距方案。与传统单片机相比,STM32的主频和定时器的频率可以通过PLL倍频高达72MHz,高分辨率的定时器为高精度的测量提供了保证。超声波的发射使用定时器的PWM功能来驱动,回波信号的接收使用定时器的输入捕获功能,开始测距时,定时器的开启将同时启动PWM和输入捕获,完全消除了启动发射和启动计时之间的偏差,提高了测量精度。为使回波信号趋于稳定,设计了时间增益补偿电路(TGC),在等待回波的过程中随着时间的推移需要将放大器的增益值不断增大,通过实验获取不同距离需要设置的增益值,对应不同时间需要设置数字电位器的增量,并将该参数固化在单片机的FALSH中,在测距过程中,根据时间查询电位器增量表改变电位器阻值,实现回波信号的时间补偿,提高了测量的精度。为了在减小盲区的同时而不减小测量范围,设计了双比较器整形电路分别处理近、远距离的回波信号,近距离比较器可以有效屏蔽超声波衍射信号从而减小了测量盲区。传统的峰值检测方法大多通过硬件电路实现,设计较复杂,稳定性差。本文通过软件算法对回波信号进行峰值时间检测。不仅简化了电路,降低了成本,而且提高了系统的稳定度。经研究表明,该系统测量精度达到了lmm,盲区低至3cm,量程可达500cm。本系统在近距离测试时,系统的精度较理想,可作为停车时的倒车雷达使用,也可以用于液面检测(油箱液位),还可以用于自动门感应,机器人视觉识别等。如果多使用几个测距仪,将这些集成一个大系统,那么整个大系统可用于定位避障。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值