裴多菲。 2024-01-28 19:13 采纳率: 75%
浏览 16
已结题

STM32超声波,蜂鸣问题

STM32上电后,用来测超声波的定时器的值一直卡在170不变,并且蜂鸣器也咯噔咯噔的响。求问朋友该如何解决?

超声波.c

#include "hcsr04.h"
#include "delay.h"
#include "stdio.h"
#include "timer.h"
#include "sys.h"
float distance;    //定义非负整数变量。

void Hcsr04_Init(void)
{
    GPIO_InitTypeDef    GPIO_InitStructure;
    EXTI_InitTypeDef    EXTI_InitStructure;
    NVIC_InitTypeDef    NVIC_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;      //推挽输出
    GPIO_InitStructure.GPIO_Pin=TRIG_PIN;               //引脚PA0
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(TRIG_PORT,&GPIO_InitStructure);
    
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;
    GPIO_InitStructure.GPIO_Pin=ECHO_PIN;              //开启引脚PA1
    GPIO_Init(ECHO_PORT,&GPIO_InitStructure);
    
    EXTI_InitStructure.EXTI_Line=EXTI_Line1;        //外部中断
    EXTI_InitStructure.EXTI_LineCmd=ENABLE;
    EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;
    EXTI_Init(&EXTI_InitStructure);
    
    NVIC_InitStructure.NVIC_IRQChannel=EXTI1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;
    NVIC_Init(&NVIC_InitStructure);
}

void EXTI1_IRQHandler(void)    //中断服务函数自己编写,里面写判断中断开启。
{
    delay_us(10);
    if(EXTI_GetITStatus(EXTI_Line1)!=RESET)        //如果中断通道1,PA1-ECHO为高电平时那么开启中断
    {
        TIM_SetCounter(TIM2,0);    //设置计数器从0开始计数
        TIM_Cmd(TIM2,ENABLE);    //    开启定时器2计数
        while(GPIO_ReadInputDataBit(ECHO_PORT,ECHO_PIN));    //等待
        TIM_Cmd(TIM2,DISABLE);    //关掉计数器
        distance=TIM_GetCounter(TIM2)*340/2;    //计数器的值与超声波持续时间成比例,计算出距离的值,
        EXTI_ClearITPendingBit(EXTI_Line1);
    }
}

void Hcsr04_Start(void)        //启动超声波
{
    GPIO_SetBits(TRIG_PORT,TRIG_PIN);
    delay_us(20);
    GPIO_ResetBits(TRIG_PORT,TRIG_PIN);
}



定时器.c



#include "timer.h"
#include "sys.h"

void Time2_Init(void)
{
    TIM_TimeBaseInitTypeDef    TIM_TimeBaseInit_hcsr04;
//    NVIC_InitTypeDef    NVIC_TIM2_InitStrure;
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
    TIM_TimeBaseInit_hcsr04.TIM_ClockDivision=0;
    TIM_TimeBaseInit_hcsr04.TIM_CounterMode=TIM_CounterMode_Up;    //配置成向上计数模式
    TIM_TimeBaseInit_hcsr04.TIM_Period=4999;                    //500ms一个周期。
    TIM_TimeBaseInit_hcsr04.TIM_Prescaler=7199;
    TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInit_hcsr04);
//    TIM_ITConfig(TIM2,TIM_IT_Update|TIM_IT_Trigger,ENABLE);    //允许更新中断。
//    

//    NVIC_TIM2_InitStrure.NVIC_IRQChannel=TIM2_IRQn;
//    NVIC_TIM2_InitStrure.NVIC_IRQChannelCmd=ENABLE;
//    NVIC_TIM2_InitStrure.NVIC_IRQChannelPreemptionPriority=0;
//    NVIC_TIM2_InitStrure.NVIC_IRQChannelSubPriority=0;
//    NVIC_Init(&NVIC_TIM2_InitStrure);
    
}

//void TIM2_TRQHandler(void)    //定时器中断服务函数
//{
//    if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)
//    {
//        TIM_ClearITPendingBit(TIM2,TIM_IT_Update);    //清除中断标志位
//        //定时器中断要执行的功能
//    }
//}










```

  • 写回答

2条回答 默认 最新

  • 嵌入式吴彦祖 2024-02-23 14:20
    关注

    超声波测距模块的处理思路:
    1.电压接5.5V
    2.用充电器供电,电脑接口可能导致供电不足

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 3月2日
  • 已采纳回答 2月23日
  • 修改了问题 1月28日
  • 创建了问题 1月28日