一坨乱码 2024-02-02 16:11 采纳率: 50%
浏览 260

为什么stm32控制超声波模块,测出来的距离一直是0

用stm32f103c8t6控制HC-SR04模块来测距,用定时器输入捕获模式来测量。因为超声波模块返回的是一个信号,测量这个信号高电平的时间就可以测出来超声波距物体的距离,所以用定时器的输入捕获模式,其中我用的是定时器3的通道1和通道2,通道1是上升沿触发,通道2是下降沿触发。但是我最终的结果始终是0,我通过调试之后,发现好像接收到的信号没有高电平,所以导致返回的信息始终是0,下面是我写的代码,有没有人帮我看看是哪里的问题。

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
void PWM_Init(void)
{
    //使用定时器3的通道1--PA6引脚
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    
    //设置PA6引脚--Echo
    //PA6引脚用来接收超声波发射回来的电平信号
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    //设置PA5引脚--Trig
    //PA5引脚用来触发超声波,使其工作
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    TIM_InternalClockConfig(TIM3);        //选择TIM3为内部时钟
    
    //时基单元初始化
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;                //定义结构体变量
    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;     //时钟分频,选择不分频
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //计数器模式,选择向上计数
    TIM_TimeBaseInitStructure.TIM_Period = 65536 - 1;               //计数周期,即ARR的值
    TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1;               //预分频器,即PSC的值
    TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;            //重复计数器,高级定时器才会用到
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);             //将结构体变量交给TIM_TimeBaseInit,配置TIM3的时基单元
    
    //PWMI模式初始化
    TIM_ICInitTypeDef TIM_ICInitStructure;                            //定义结构体变量
    TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;                //选择配置定时器通道1
    TIM_ICInitStructure.TIM_ICFilter = 0xF;                            //输入滤波器参数
    TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;        //极性,选择为上升沿触发捕获
    TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;            //捕获预分频,选择不分频,每次信号都触发捕获
    TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;    //输入信号交叉,选择直通,不交叉
    TIM_PWMIConfig(TIM3, &TIM_ICInitStructure);                        //将结构体变量交给TIM_PWMIConfig,配置TIM3的输入捕获通道
    
    //选择触发源及从模式
    TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1);                    //触发源选择TI1FP1
    TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);                    //从模式选择复位
                                                                    //即TI1产生上升沿时,会触发CNT归零
    
    //TIM使能
    TIM_Cmd(TIM3, ENABLE);            //使能TIM3,定时器开始运行
}

float Distance(void)
{
    //Trig引脚给一个触发信号,使超声波模块开始工作
    GPIO_SetBits(GPIOA, GPIO_Pin_5);
    Delay_us(40);
    GPIO_ResetBits(GPIOA, GPIO_Pin_5);
    
    //检测Echo高电平的时间
    float time = 0;

    //程序运行到这里说明检测到高电平
    time = TIM_GetCapture2(TIM3);
    
    //这里就返回一个高电平的时间
    return time;
}

主函数:

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

int main(void)
{
    OLED_Init();
    PWM_Init();
    
    while (1)
    {
        OLED_ShowNum(1, 1, Distance(), 5);
        Delay_ms(1000);
    }
}


  • 写回答

3条回答 默认 最新

  • 叫兽-郭老师 Java领域新星创作者 2024-02-02 16:13
    关注

    参考通义千问和郭老师的小迷弟雅思莫了-编写提供,主要是为了帮助您快速解决问题,如下回答,您可以参考下,如有问题,评论区留言。

    根据您的描述和代码,您在使用STM32F103C8T6控制HC-SR04超声波模块时遇到了问题。测距结果始终为0,可能是因为未正确配置或读取输入捕获数据。

    首先,请确认以下几点:

    1. 您的HC-SR04模块是否连接正确?TRIG(触发信号)应连接到PA5,ECHO(回响信号)应连接到PA6。

    2. 超声波模块的工作电压是否与STM32 IO口电压兼容?通常HC-SR04的工作电压是5V,而STM32IO口为3.3V。如果两者不兼容,需要通过电平转换器进行适配。

    3. 在Distance函数中,您配置的是TIM_Channel_1作为上升沿触发,但获取高电平时却使用了通道2(TIM_GetCapture2(TIM3))。这应该是错误的,您应该从配置为上升沿捕获的相同通道获取时间,即改为:

      float time = TIM_GetCapture1(TIM3);
      
    4. 确保TIM3通道1的中断已启用,并且在回调函数中更新了捕获值。虽然您的代码没有展示这部分,但在实际应用中,通常会用到中断来精确测量Echo的高电平宽度。

    5. 验证TIM3的时钟分频系数、预分频器设置以及计数周期是否合适,确保能准确捕获到Echo信号的高电平持续时间。

    6. 使用示波器检查Echo引脚的实际信号,确保STM32能够接收到正确的高电平信号。

    针对以上分析,请调整您的代码并检查硬件连接,这应该有助于解决问题。

    评论

报告相同问题?

问题事件

  • 创建了问题 2月2日

悬赏问题

  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境
  • ¥30 关于#java#的问题,请各位专家解答!