STM32F103C8T6驱动SRF05超声波测距传感器程序

STM32F103C8T6驱动SRF05超声波测距传感器程序

本项目基于 STM32F103C8T6 微控制器,构建了一套高精度、实时性的超声波测距系统,用于驱动 SRF05 超声波测距传感器。系统采用72MHz主频运行,通过定时器实现1μs级时间分辨率,对ECHO脉冲宽度进行精确计时,从而计算声波往返传播时间,并完成厘米级距离换算。程序基于标准外设库 stm32f10x.h 构建,结合GPIO高速推挽输出与定时器计数机制,实现对TRIG触发信号的精确控制及对ECHO信号的稳定采集。同时加入超时保护机制,有效避免异常环境下的阻塞风险,增强系统鲁棒性与工程可靠性。

一、完整代码

SRF05 超声波测距传感器驱动程序头文件(SRF05.h)

c 复制代码
#ifndef __SRF05_H
#define __SRF05_H

#include "stm32f10x.h"

// 引脚定义
#define SRF05_TRIG_PORT     GPIOA
#define SRF05_TRIG_PIN      GPIO_Pin_1

#define SRF05_ECHO_PORT     GPIOA
#define SRF05_ECHO_PIN      GPIO_Pin_2

void SRF05_Init(void);
float SRF05_GetDistance(void);

#endif

SRF05 超声波测距传感器驱动程序(SRF05.c)

c 复制代码
#include "SRF05.h"
#include "Delay.h"

static void TIM2_Init(void);

#define ECHO_TIMEOUT_US   30000UL
#define TRIGGER_US        12

void SRF05_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

    GPIO_InitStructure.GPIO_Pin = SRF05_TRIG_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(SRF05_TRIG_PORT, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = SRF05_ECHO_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(SRF05_ECHO_PORT, &GPIO_InitStructure);

    TIM2_Init();

    GPIO_ResetBits(SRF05_TRIG_PORT, SRF05_TRIG_PIN);
}

static void TIM2_Init(void)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_TimeBaseStructure.TIM_Period = 0xFFFF;
    TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1;
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
    TIM_Cmd(TIM2, ENABLE);
}

float SRF05_GetDistance(void)
{
    uint32_t start_time;
    uint32_t pulse_width = 0;
    uint8_t echo_started = 0;

    GPIO_ResetBits(SRF05_TRIG_PORT, SRF05_TRIG_PIN);
    Delay_us(3);
    GPIO_SetBits(SRF05_TRIG_PORT, SRF05_TRIG_PIN);
    Delay_us(TRIGGER_US);
    GPIO_ResetBits(SRF05_TRIG_PORT, SRF05_TRIG_PIN);

    TIM_SetCounter(TIM2, 0);
    start_time = TIM_GetCounter(TIM2);

    while (GPIO_ReadInputDataBit(SRF05_ECHO_PORT, SRF05_ECHO_PIN) == 0)
    {
        if ((TIM_GetCounter(TIM2) - start_time) > ECHO_TIMEOUT_US)
        {
            return -1.0f;
        }
    }

    TIM_SetCounter(TIM2, 0);

    start_time = TIM_GetCounter(TIM2);

    while (GPIO_ReadInputDataBit(SRF05_ECHO_PORT, SRF05_ECHO_PIN) == 1)
    {
        pulse_width = TIM_GetCounter(TIM2);
        if (pulse_width > ECHO_TIMEOUT_US)
        {
            pulse_width = ECHO_TIMEOUT_US;
            break;
        }
    }

    float distance_cm = (float)pulse_width * 0.0172f;

    if (distance_cm < 2.0f || distance_cm > 450.0f)
    {
        return -1.0f;
    }

    return distance_cm;
}

主程序文件(main.c)

c 复制代码
#include "stm32f10x.h"
#include "SRF05.h"
#include "Delay.h"

volatile float distance;

int main(void)
{
    
    SRF05_Init();

    while (1)
    {
        distance = SRF05_GetDistance();

        Delay_ms(60);     
    }
}

二、硬件说明

HY-SRF05超声波测距模块是一款高性能的非接触式距离传感器,能够提供2cm至450cm的测量范围,测距精度可高达3mm,最大测量角度15°。该模块集成了超声波发射器、接收器以及控制电路,工作原理简洁可靠:使用IO口向TRIG引脚发送至少10μs的高电平信号触发测距,模块随后自动发出8个40kHz的超声波方波,并检测是否有回波返回;若检测到回波,则通过ECHO引脚输出一个高电平脉冲,该高电平持续的时间即为超声波从发射到返回的往返时间。通过公式"测试距离 = (高电平时间 × 声速340m/s) ÷ 2"即可计算出目标物体与模块之间的实际距离。
引脚功能定义图 硬件实物图 硬件模块原理图

三、实物操作演示

硬件接线

  • V C C V_{CC} VCC:连接5V
  • GND:连接GND
  • TRIG:连接PA1
  • ECHO:连接PA2

OUT引脚是开关量输出,它属于报警/开关模式下的功能,主要用于独立使用模块(不接微控制器)时做简单阈值判断或报警。
实物连接图

编译调试

编译并下载程序至单片机中

打开调试,在Watch 1窗口可以看到距离数据。
调试数据输出

结束~

例程资源: https://download.csdn.net/download/hsdujdjrjrj/92680023

相关推荐
吠品5 小时前
智谱开源 ZCode 之后,真正的考试才开始
单片机·嵌入式硬件·1024程序员节
Chery11407 小时前
高速ADC与精密DAC怎么选?DP9230D与DP8532D应用解析
嵌入式硬件·物联网·射频工程
小李不想当小白10 小时前
SPI通信外设与W25Q64 (硬件SPI)(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·嵌入式
LCG米10 小时前
STM32驱动W5500以太网模块实测:TCP吞吐瓶颈定位、TX指针回绕陷阱与断线重连保活落地
stm32·单片机·嵌入式硬件·tcp/ip
尼喃11 小时前
662K/65Z5三脚稳压芯片规格书—PW6566B33/B30引脚功能
嵌入式硬件
创界工坊工作室11 小时前
63-基于STC89C52霍尔传感器的智能化电能表设计
stm32·单片机·嵌入式硬件·51单片机·proteus
智购科技自动售货机厂家12 小时前
让AI经营自动售货机:从Project Vend看工具权限与业务规则~YH
大数据·服务器·单片机·嵌入式硬件·深度学习
Zwawa14 小时前
从 printf 到曲线:把数据送上 VOFA+
c语言·单片机·嵌入式
意法半导体STM3214 小时前
【官方原创】LAT6048 如何扩大MP2的A35核和M33核共享内存
stm32·单片机·嵌入式硬件·内存映射·stm32mp2
en.en..14 小时前
STM32(F429)启动模式与两种烧录方式
stm32·单片机·嵌入式硬件