野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 27178|回复: 24

指南者超声波测距系统,出问题了,求大佬.....

[复制链接]
发表于 2021-3-1 12:02:12 | 显示全部楼层 |阅读模式
依据论坛大神的霸道超声波测距修改的,想实现更多功能,希望论坛里的大神给予指导,本人小白,希望不要沉啊!!!千万不要沉!!!


他日若做出了,定会分享大家学习交流!!!

这是超声波测距这一部分的设置,最下面是想让蜂鸣器响。。。

这是超声波测距这一部分的设置,最下面是想让蜂鸣器响。。。

超声波测距.zip

6.32 MB, 下载次数: 68

指南者超声波测距

回复

使用道具 举报

发表于 2021-3-1 13:48:38 | 显示全部楼层
出了什么问题
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-1 14:31:53 | 显示全部楼层

想让蜂鸣器在测距低于设定值时,响起了,但是实现不了,感觉程序没错,希望您能指点一下
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-1 14:34:19 | 显示全部楼层

我想设定一个最低值,当低于最低值时,蜂鸣器和LED开始工作,但是搞不定了,您指导一下吧
回复 支持 反对

使用道具 举报

发表于 2021-3-1 16:13:37 | 显示全部楼层
MAZW 发表于 2021-3-1 14:31
想让蜂鸣器在测距低于设定值时,响起了,但是实现不了,感觉程序没错,希望您能指点一下 ...

目前的程序有没有什么现象,比如串口能不能打印出距离信息之类的
回复 支持 反对

使用道具 举报

发表于 2021-3-1 16:16:58 | 显示全部楼层
大概看了下代码,感觉没什么问题,就是延时函数最好是换成systick定时或者内核定时器定时,这样相对来说准确些,纯软件延时不太准
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-1 16:21:41 | 显示全部楼层
ZZZ_XXJ 发表于 2021-3-1 16:13
目前的程序有没有什么现象,比如串口能不能打印出距离信息之类的

串口可以显示
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-1 16:23:02 | 显示全部楼层

但是想让LED和蜂鸣器低于某个值开始工作,实现起来有困难
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-1 16:33:25 | 显示全部楼层
ZZZ_XXJ 发表于 2021-3-1 16:16
大概看了下代码,感觉没什么问题,就是延时函数最好是换成systick定时或者内核定时器定时,这样相对来说准 ...

我知道了,马上改,我想设定一个下限值,在低于这个值之后,蜂鸣器和LED开始工作,您可以知道一下吗?
拜托了,大佬
回复 支持 反对

使用道具 举报

发表于 2021-3-1 17:12:39 | 显示全部楼层
MAZW 发表于 2021-3-1 16:33
我知道了,马上改,我想设定一个下限值,在低于这个值之后,蜂鸣器和LED开始工作,您可以知道一下吗?
拜 ...

目前你写的这样就可以,一个if判断一下有没有低于设定值,如果低于设定值就让蜂鸣器响
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-1 17:20:28 | 显示全部楼层
ZZZ_XXJ 发表于 2021-3-1 17:12
目前你写的这样就可以,一个if判断一下有没有低于设定值,如果低于设定值就让蜂鸣器响 ...

进行判断了,程序没有错误和警告,但是蜂鸣器没有工作
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-1 17:25:28 | 显示全部楼层
这个判断是否低于UltrasonicWave_Distance<Dis_up的程序语句
野火论坛202103011724262837..png
回复 支持 反对

使用道具 举报

发表于 2021-3-2 09:07:25 | 显示全部楼层
MAZW 发表于 2021-3-1 17:20
进行判断了,程序没有错误和警告,但是蜂鸣器没有工作

又重新看了下程序,蜂鸣器和LED灯在main函数里没有初始化
还有就是确认下这两个的引脚号是不是对的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-2 09:36:39 | 显示全部楼层
ZZZ_XXJ 发表于 2021-3-2 09:07
又重新看了下程序,蜂鸣器和LED灯在main函数里没有初始化
还有就是确认下这两个的引脚号是不是对的 ...

好的,我再看看试试
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-2 10:07:49 | 显示全部楼层
ZZZ_XXJ 发表于 2021-3-2 09:07
又重新看了下程序,蜂鸣器和LED灯在main函数里没有初始化
还有就是确认下这两个的引脚号是不是对的 ...

非常感谢您的帮助,问题已经解决了,就是没有在主函数内初始化LED和BEEP,接下来我会实现按键控制测距最小值和屏幕显示,进一步优化调试。
再次感谢您的帮助。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-2 11:59:41 | 显示全部楼层
ZZZ_XXJ 发表于 2021-3-2 09:07
又重新看了下程序,蜂鸣器和LED灯在main函数里没有初始化
还有就是确认下这两个的引脚号是不是对的 ...

我一开始设定了一个最低值,我想通过按键来控制这个最低值,从而控制超声波声光报警的极限
我程序写出来了,没有错误和警告,但是串口调试助手直接什么也不显示了,LED和蜂鸣器也没工作,测距也没显示。

按键设置如下
#include "bsp_key.h"


void KEY1_GPIO_Config(void)
{
        GPIO_InitTypeDef KEY1_GPIO_InitStruct;

        RCC_APB2PeriphClockCmd(KEY1_GPIO_CLK,ENABLE);
       
        KEY1_GPIO_InitStruct.GPIO_Pin = KEY1_GPIO_PIN;
        KEY1_GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空

        GPIO_Init(KEY1_GPIO_PORT,&KEY1_GPIO_InitStruct);
}

void KEY2_GPIO_Config(void)
{
        GPIO_InitTypeDef KEY2_GPIO_InitStruct;

        RCC_APB2PeriphClockCmd(KEY2_GPIO_CLK,ENABLE);
       
        KEY2_GPIO_InitStruct.GPIO_Pin = KEY2_GPIO_PIN;
        KEY2_GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;

        GPIO_Init(KEY2_GPIO_PORT,&KEY2_GPIO_InitStruct);
}
                //Key_Scan是按键扫描,括号里是被扫描的端口和被扫描端口的引脚
uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)                        //因为存在return,所以为uint8_t开头,
{
  if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON)
  {   
      while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON);//松手检测
          
      return KEY_ON;
  }
  else return KEY_OFF;
}       







//超声波测距模块,UltrasonicWave_Configuration()函数
//初始化超声模块,UltrasonicWave_StartMeasure()函数
//启动测距,并将测得的数据通过串口1打印出来         
//实验平台:野火STM32开发板
//硬件连接
//PC  - TRIG
//PC9 - ECHO
#include "UltrasonicWave.h"
#include "usart1.h"
#include "TIM2.h"
#include "bsp_beep.h"
#include "bsp_led.h"
#include "bsp_key.h"

unsigned short int Dis_up = 20;                                         //距离上限 默认20cm
unsigned short int UltrasonicWave_Distance;      //计算出的距离


       
       

void DelayTime_us(int Time)   
{
        unsigned char i;
        for ( ; Time>0; Time--)
                for ( i = 0; i < 72; i++ );
}



//超声波模块的初始化
void UltrasonicWave_Configuration(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;       
                 
        RCC_APB2PeriphClockCmd(TRIG_GPIO_CLK , ENABLE);
   
        GPIO_InitStructure.GPIO_Pin = TRIG_PIN;                                         //PC8接TRIG
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                     //设为推挽输出模式
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                
        GPIO_Init(TRIG_PORT, &GPIO_InitStructure);                     //初始化发送GPIO

        GPIO_InitStructure.GPIO_Pin = ECHO_PIN;                                     //PC9接ECH0
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;                 //设为输入
        GPIO_Init(ECHO_PORT,&GPIO_InitStructure);                                         //初始化接受GPIO
}



//计算距离
void UltrasonicWave_CalculateTime(void)
{
        UltrasonicWave_Distance=TIM_GetCounter(TIM2)*5*34/2000;//距离计算公式       
}




//开始测距,发送一个>10us的脉冲,然后测量返回的高电平时间
//启动超声波模块
void UltrasonicWave_StartMeasure(void)
{
        GPIO_SetBits(TRIG_PORT,TRIG_PIN);                                           //送>10US的高电平
        DelayTime_us(20);                                                              //延时20US
        GPIO_ResetBits(TRIG_PORT,TRIG_PIN);
  
        while(!GPIO_ReadInputDataBit(ECHO_PORT,ECHO_PIN));         //等待高电平
        TIM_Cmd(TIM2, ENABLE);                                 //开启时钟
        while(GPIO_ReadInputDataBit(ECHO_PORT,ECHO_PIN));             //等待低电平
        TIM_Cmd(TIM2, DISABLE);                                             //定时器2失能
        UltrasonicWave_CalculateTime();                                                 //计算距离
        TIM_SetCounter(TIM2,0);                                                                 //定时器2清零
       
       
       
       

        printf("\r\ndistance:%d%d cm\r\n",UltrasonicWave_Distance/256,UltrasonicWave_Distance%256);       
       
        if ( Key_Scan(KEY1_GPIO_PORT,KEY1_GPIO_PIN)  == ((uint8_t)KEY_ON))
        {
                Dis_up--;
                if( UltrasonicWave_Distance<Dis_up)
                {
                        GPIO_ResetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);                       
                        GPIO_SetBits(BEEP_GPIO_PORT,BEEP_GPIO_PIN);
                }
                else
                {
                        GPIO_SetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);                        //关报警标志位       
                        GPIO_ResetBits(BEEP_GPIO_PORT,BEEP_GPIO_PIN);
                }
        }
       
        if ( Key_Scan(KEY2_GPIO_PORT,KEY1_GPIO_PIN)  == ((uint8_t)KEY_ON))
        {
                Dis_up++;
                if( UltrasonicWave_Distance<Dis_up)
                {
                        GPIO_ResetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);                       
                        GPIO_SetBits(BEEP_GPIO_PORT,BEEP_GPIO_PIN);
                }
                else
                {
                        GPIO_SetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);       
                        GPIO_ResetBits(BEEP_GPIO_PORT,BEEP_GPIO_PIN);
                }
        }




}

回复 支持 反对

使用道具 举报

发表于 2021-3-2 15:08:33 | 显示全部楼层
MAZW 发表于 2021-3-2 11:59
我一开始设定了一个最低值,我想通过按键来控制这个最低值,从而控制超声波声光报警的极限
我程序写出来 ...

有可能某个地方卡死了,这里看不出什么问题,可以进debug一步步调试看看
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-3 15:52:01 | 显示全部楼层
ZZZ_XXJ 发表于 2021-3-2 15:08
有可能某个地方卡死了,这里看不出什么问题,可以进debug一步步调试看看

大佬,我又检查了一下,还是找不到哪里出错了,您可以帮我看看吗?麻烦您了,卡这两天了,快学不下去了
我感觉是按键那里有问题,想通过K1、K2改变Ds_up(设定的最低测距值)的大小
附上程序,您要是有空的话,就扫几眼,以后可能要接触STM32,所以第一个东西想做出来,不然心里太不爽了。
可以有偿,老麻烦您,也挺不好意思的,可以有偿。

超声波测距.zip

6.51 MB, 下载次数: 22

回复 支持 反对

使用道具 举报

发表于 2021-3-5 15:29:52 | 显示全部楼层
MAZW 发表于 2021-3-3 15:52
大佬,我又检查了一下,还是找不到哪里出错了,您可以帮我看看吗?麻烦您了,卡这两天了,快学不下去了:' ...

稍微看了下,串口助手没输出有可能是在等待高低电平的时候卡住了,具体是什么原因导致接收不到正确的高低电平就得一点点调试了,有可能延时不准也有可能是其他原因
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-5 21:35:53 | 显示全部楼层
ZZZ_XXJ 发表于 2021-3-5 15:29
稍微看了下,串口助手没输出有可能是在等待高低电平的时候卡住了,具体是什么原因导致接收不到正确的高低 ...

好的,我再努力努力,估计问题不大
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-30 12:16:20 | 显示全部楼层
ZZZ_XXJ 发表于 2021-3-5 15:29
稍微看了下,串口助手没输出有可能是在等待高低电平的时候卡住了,具体是什么原因导致接收不到正确的高低 ...

哥,您在吗?还是上次那个超声波测距程序,我用的是指南者,上面带着一块LCD屏幕,想实现距离的LCD显示,调用了一个显示例程,有错误,希望您能指导一下,您就闲时给看看就行感谢感谢
错误.png
显示函数.png
问题.png

超声波测距.zip

7.29 MB, 下载次数: 31

回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-30 12:18:51 | 显示全部楼层
ZZZ_XXJ 发表于 2021-3-5 15:29
稍微看了下,串口助手没输出有可能是在等待高低电平的时候卡住了,具体是什么原因导致接收不到正确的高低 ...

哥,第二张图片是例程,不知道是不是调用  “ILI9341_DispStringLine_EN(LINE”这个函数,调用之后,就有那个错误
回复 支持 反对

使用道具 举报

发表于 2021-4-2 09:18:47 | 显示全部楼层
这个是C语言方面的问题了,在.c文件里声明inline函数的时候,要么不加inline,要么在前面加上static
野火论坛202104020918372673..png
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-2 16:49:25 | 显示全部楼层
ZZZ_XXJ 发表于 2021-4-2 09:18
这个是C语言方面的问题了,在.c文件里声明inline函数的时候,要么不加inline,要么在前面加上static
...

好的好的,感谢感谢
回复 支持 反对

使用道具 举报

发表于 2021-9-6 15:18:28 | 显示全部楼层
老板,UltrasonicWav.c里面的
GPIO_SetBits(TRIG_PORT,TRIG_PIN);                   //送>10US的高电平,这个10us是什么意思?自己设置的吗?
UltrasonicWave_Distance=TIM_GetCounter(TIM3)*5*34/2000;          *5*34/2000又是什么意思那?
谢谢
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-23 10:48 , Processed in 0.051317 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表