打印
[其他ST产品]

学习 HC-SR04超声波测距模块工作原理,使用 stm32F103 完成一个超声波测距方案

[复制链接]
491|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
学习 HC-SR04超声波测距模块工作原理,使用 stm32F103 完成一个超声波测距方案
1.产品特点
HC-SR04 超声波测距模块可提供 2cm-400cm 的非接触式距离感测功能,测
距精度可达高到的非接触式距离感测功能,测距精度可达高到 3mm ;模块包括超声波发射器、接收器与控制电路。

2.基本工作原理
(1)采用 IO 口 TRIG 触发测距,给最少 10us 的高电平信呈。
(2)模块自动发送 8 个 40khz 的方波,自动检测是否有信号返回;
(3)有信号返回,通过 IO 口 ECHO 输出一个高电平,高电平持续的时间就是超声
波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2;



使用特权

评论回复
评论
在水一方00 2024-1-29 17:03 回复TA
原文链接:https://blog.csdn.net/weixin_68811361/article/details/134273036 
沙发
在水一方00|  楼主 | 2024-1-29 17:04 | 只看该作者
3.实验设备



4.代码

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "PWM.h"
#include "Serial.h"
#include "Servo.h"
#include "Ultrasound.h"

int main()
{

        Serial_Init();
        Servo_Init();
        Ultrasound_Init();
       
        char * a="dis:";
       
        while(1)
        {        float dis=Test_Distance();
               
                Serial_SendString(a);
                Serial_SendNumber(dis,2);

                Delay_ms(500);
        }
       
}

使用特权

评论回复
板凳
在水一方00|  楼主 | 2024-1-29 17:05 | 只看该作者
Ultrasound.c
#include "stm32f10x.h"                  // Device header
#include "Delay.h"

uint16_t Cnt;
uint16_t OverCnt;
void Ultrasound_Init(){
               
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
       
        GPIO_InitTypeDef GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//trig 推挽输出
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//echo 接受引脚 下拉输入
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
       
        TIM_InternalClockConfig(TIM4);
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
        TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
        TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseInitStructure.TIM_Period = 60000 - 1;                //ARR
        TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1;                //PSC
        TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
        TIM_TimeBaseInit(TIM4, &TIM_TimeBaseInitStructure);

}
float Test_Distance(){
        GPIO_SetBits(GPIOB,GPIO_Pin_12);
        Delay_us(20);
        GPIO_ResetBits(GPIOB,GPIO_Pin_12);
        while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13)==RESET){
        };
        TIM_Cmd(TIM4, ENABLE);
        while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13)==SET){
        };
        TIM_Cmd(TIM4, DISABLE);
        Cnt=TIM_GetCounter(TIM4);
        float distance=(Cnt*1.0/10*0.34)/2;
        TIM4->CNT=0;
        Delay_ms(100);
        return distance;
}

使用特权

评论回复
地板
在水一方00|  楼主 | 2024-1-29 17:05 | 只看该作者
5.实验现象

使用特权

评论回复
5
在水一方00|  楼主 | 2024-1-29 17:05 | 只看该作者
总结
在实验中,我深入学习和理解了STM32定时器的工作原理。我掌握了定时器计数方式控制LED的亮灭状态,并成功地实现了LED以2s的频率周期性地亮灭。随后,我学习了脉宽调制(PWM)的生成方法,并将LED的控制方式切换至PWM模式。通过适当调整周期和占空比,我成功实现了LED以呼吸灯的方式渐亮渐灭。

在观察PWM输出波形的过程中,我使用了Keil虚拟示波器。通过观察波形图,我能够直观地了解到PWM信号的变化情况,从而验证我的编程结果。这使我更加熟悉了使用示波器进行波形分析的方法。

在任务中,我采用了定时器的另一个通道来编程采集上述PWM输出信号,并获取其周期和脉宽。通过对信号的计数和处理,我成功获得了PWM信号的周期和脉宽的数值。随后,我将这些数据通过串口进行显示输出,进一步验证了我的程序正确性。

尽管对于选做任务五中的超声波测距方案,由于时间和资源的限制,我未能完成实验。但是,通过学习HC-SR04超声波测距模块的工作原理,我了解到了超声波测距技术的基本原理和应用场景。这为我今后在该领域的研究和开发提供了宝贵的参考。

通过这次实验,我不仅加深了对STM32定时器原理和PWM生成方法的理解,还掌握了相关的编程技巧。同时,通过使用虚拟示波器和串口通信,我提高了对信号分析和数据输出的能力。这次实验使我更加熟悉了STM32F103单片机的应用和编程,也增强了我的实践能力和解决问题的能力。我相信这些所学将为我以后的学习和工作提供很好的基础和帮助。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

50

主题

541

帖子

0

粉丝