STM32超声波模块问题

先写没问题用法,有问题的语法就不示范

void Sr04_Init(void){

    GPIO_InitTypeDef    GPIO_InitStruct;
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseInitStruct;



    //打开GPIO组时钟
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
    //1、能定时器时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);

    GPIO_InitStruct.GPIO_Pin=GPIO_Pin_4;         //引脚
    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN;     //输入模式
    GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;    //推挽
    GPIO_InitStruct.GPIO_Speed=GPIO_Speed_25MHz; //速度
    GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP;  //上拉
    GPIO_Init(GPIOA,&GPIO_InitStruct);

    GPIO_InitStruct.GPIO_Pin=GPIO_Pin_7;         //引脚
    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_OUT;     //输出模式
    GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP;  //上拉
    GPIO_Init(GPIOB,&GPIO_InitStruct);

    TIM_TimeBaseInitStruct.TIM_Prescaler=84-1;                  // 84分频 84MHZ/84 = 1MHZ
    TIM_TimeBaseInitStruct.TIM_Period=50000-1;
    TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;    // 向上计数
    TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;            // 分频因子
    //2、初始化定时器,配置ARR,PSC
    TIM_TimeBaseInit(TIM6,&TIM_TimeBaseInitStruct);

    //5,不使能定时器
    TIM_Cmd(TIM6,DISABLE);
}

int Get_Sr04_Value(void){
    int temp=0,dis=0,t=0;
    //PA2输出低电平
    PBout(7)=0;

    delay_us(8);
    //PA2输出高电平
    PBout(7)=1;
    delay_us(20);
    //PA2输出低电平
    PBout(7)=0;

    //设置定时器的CNT为0  
    TIM6->CNT=0;


    //PA3等待高电平到来,参考按键松开代码 
    printf("Get_Sr04_Value 68\r\n");
    while(PAin(4)==0){

    }

    //使能定时器开始计数
    TIM_Cmd(TIM6,ENABLE);

    printf("Get_Sr04_Value 77\r\n");
    t=0;
    //PA3等待低电平到来,
    while(PAin(4)==1){

    }
    printf("Get_Sr04_Value 84\r\n");

    //获取定时器CNT值,从而得到高电平持续时间    
    temp=TIM6->CNT;

    //关闭定时器
    TIM_Cmd(TIM6,DISABLE);

    //通过公式计算出超声波测量距离    
    dis=temp/58;


    return dis;
}

int main(void)
{
    int dis = 0;

    //超声波测距
    u16 static cnt1;if(cnt1++%(2*1000)==0)dis = Get_Sr04_Value();
}

超声波模块卡住在

等待高电平到来
现象1:一开始测距就卡
原因1.脚初始化模式不对
解法:一定要超声波trig脚连接的那个脚设置输出模式,超声波echo叫连的那个叫设置输入模式

现象2:第一次可以,后面才卡的

原因2:运行速度太快了,传输速度跟不上

解法2:循环中增加延时时间

posted @ 2024-02-11 12:33  败人两字非傲即惰  阅读(18)  评论(0编辑  收藏  举报