问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

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

创作时间:
作者:
@小白创作中心

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

引用
1
来源
1.
https://www.jerry.net.cn/articals/15448.html

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

一、硬件连接与配置

  1. 硬件连接
  • 将HC-SR04模块的VCC引脚连接到5V电源。
  • GND引脚连接到地线。
  • Trig引脚连接到单片机的PB14引脚。
  • Echo引脚连接到单片机的PB15引脚。
  1. 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引脚的信号波形,确保触发信号和回响信号的正确性。
  • 根据实际测量结果调整延时和计数器的参数,以确保测量精度。
  1. 常见问题及解决方法
  • 如果测量距离不准确,检查超声波模块的安装位置和被测物体的表面是否平整。
  • 如果回响信号不稳定,可能是由于环境噪声干扰,可以尝试增加滤波处理。

五、代码示例

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

#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\nHello World\r\n");
    while(1)
    {
        if(0 == KEY1)
        {
            delay_ms(10);
            if(0 == KEY1)
            {
                while(0 == KEY1);
                USART1_printf(USART1,"\r\n\r\n");
                ultrasonic_Ranging(); 
                USART1_printf(USART1,"\r\ntime_count=%d\n",time_count);
                rang = (unsigned int)(((time_count*0.000005*340)/2)*1000); 
                USART1_printf(USART1,"\r\nDistance=%d\n",rang);
            }
            while(0 == KEY1);
        }
    }
}

六、相关问答FAQs

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

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

  • 确保被测物体表面平整且面积足够大(建议不少于0.5平方米)。
  • 使用适当的滤波处理来减少环境噪声干扰。
  • 调整测量周期,建议测量周期为60ms以上,以防止发射信号对回响信号的影响。
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号