本文作者:豆面

如何调试超声波测距系统?

豆面 2025-01-12 19:42:23 16
如何调试超声波测距系统?摘要: 超声波测距是一种常用的非接触式测量技术,广泛应用于机器人避障、液位检测和距离测量等领域,以下是详细的调试步骤和注意事项:一、硬件连接与配置1、硬件连接: - 将HC-SR04模块的...

超声波测距是一种常用的非接触式测量技术,广泛应用于机器人避障、液位检测和距离测量等领域,以下是详细的调试步骤和注意事项:

一、硬件连接与配置

如何调试超声波测距系统?

1、硬件连接

将HCSR04模块的VCC引脚连接到5V电源。

GND引脚连接到地线。

Trig引脚连接到单片机的PB14引脚。

Echo引脚连接到单片机的PB15引脚。

2、CubeMX配置

设置系统时钟频率为最大,例如168MHz。

APB1的时钟频率设置为84MHz。

如何调试超声波测距系统?

配置TIM2基础定时器,分频系数为83,计数单位为1μs,向上计数模式,周期为65535。

配置PB14为输出模式(Trig引脚),PB15为输入模式(Echo引脚)。

二、软件实现

1、触发信号

使用宏定义控制Trig引脚的高低电平:

     #define HCSR_TRIG_HIGH() HAL_GPIO_WritePin(HC_SR04_Trig_GPIO_Port, HC_SR04_Trig_Pin, GPIO_PIN_SET)
     #define HCSR_TRIG_LOW()  HAL_GPIO_WritePin(HC_SR04_Trig_GPIO_Port, HC_SR04_Trig_Pin, GPIO_PIN_RESET)

2、触发脉冲信号

实现不低于10μs的TTL高电平脉冲信号,这里延时20μs:

     void HCSR04StartTrigStart(void)
     {
         HCSR_TRIG_HIGH();
         for_delay_us(20);
         HCSR_TRIG_LOW();
     }

3、回响信号读取

使用TIM2计时器来测量Echo引脚的高电平持续时间:

如何调试超声波测距系统?
     void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
     {
         if (GPIO_Pin == GPIO_PIN_15) // Echo引脚
         {
             if (HAL_GPIO_ReadPin(GPIO_PIN_15) == 1) // Echo高电平开始
             {
                 __HAL_TIM_SET_COUNTER(&htim2, 0); // 重置TIM2计数器
                 while (HAL_GPIO_ReadPin(GPIO_PIN_15) == 1); // 等待Echo变低
                 time_count = __HAL_TIM_GET_COUNTER(&htim2); // 获取计数值
             }
         }
     }

三、计算距离

1、公式

距离 = (time_count * 声速(340M/S)) / 2;

time_count是TIM2计数器的值,单位为μs。

四、调试与优化

1、调试步骤

确保硬件连接正确,特别是Trig和Echo引脚的连接。

检查单片机和超声波模块的供电是否正常。

使用逻辑分析仪或示波器观察Trig和Echo引脚的信号波形,确保触发信号和回响信号的正确性。

根据实际测量结果调整延时和计数器的参数,以确保测量精度。

2、常见问题及解决方法

如果测量距离不准确,检查超声波模块的安装位置和被测物体的表面是否平整。

如果回响信号不稳定,可能是由于环境噪声干扰,可以尝试增加滤波处理。

五、代码示例

以下是完整的代码示例,用于实现超声波测距的基本功能:

#include "stm32f1xx.h"
#include "usart.h"
#include "delay.h"
#include "key.h"
#include "time.h"
#include "exti.h"
#include "Ultrasonic.h"
int main(void)
{
    unsigned int rang = 0;
    /*初始化串口*/
    delay_init();
    key_init_wt();    
    //TIM3_Int_Init(4999,7199);//10Khz的计数频率,计数到5000为500ms  
    ultrasonic_config();
    EXTI_config();  
    TIM3_Int_Init(4,71);		//5us
    USART1_Config();
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
    
    USART1_printf(USART1,"\r
Hello World\r
");
    
    while(1)
    {
        if(0 == KEY1)
        {
            delay_ms(10);
            if(0 == KEY1)
            {
                while(0 == KEY1);
                USART1_printf(USART1,"\r
\r
");
                ultrasonic_Ranging(); 
                USART1_printf(USART1,"\r
time_count=%d
",time_count);
                rang = (unsigned int)(((time_count*0.000005*340)/2)*1000); 
                USART1_printf(USART1,"\r
Distance=%d
",rang);
                
            }
            while(0 == KEY1);
        }
    }
}

六、相关问答FAQs

Q1:超声波测距模块的工作原理是什么?

A1:超声波测距模块通过发射超声波脉冲并接收其回波来测量距离,模块的Trig引脚发送一个至少10μs的高电平脉冲信号,触发模块内部发出8个40kHz的方波,然后自动检测是否有信号返回,有信号返回时,Echo引脚输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间,根据这个时间间隔和声速,可以计算出距离。

Q2:如何提高超声波测距的精度?

A2:提高超声波测距精度的方法包括:

确保被测物体表面平整且面积足够大(建议不少于0.5平方米)。

使用适当的滤波处理来减少环境噪声干扰。

调整测量周期,建议测量周期为60ms以上,以防止发射信号对回响信号的影响。

文章版权及转载声明

作者:豆面本文地址:https://www.jerry.net.cn/articals/15448.html发布于 2025-01-12 19:42:23
文章转载或复制请以超链接形式并注明出处杰瑞科技发展有限公司

阅读
分享