OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4113|回复: 17

超声波测距模块距离错误且不变,有没有大神帮忙看看

[复制链接]

21

主题

138

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2019-6-1
在线时间
52 小时
发表于 2019-7-7 23:52:57 | 显示全部楼层 |阅读模式
35金钱
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "timer.h"
#define Trig PCout(1)                //PC1        TRIG
/************************************************
ALIENTEK战舰STM32开发板实验10
输入捕获实验  
技术支持:www.openedv.com
淘宝店铺:http://eboard.taobao.com
关注微信公众平台微信号:"正点原子",免费获取STM32资料。
广州市星翼电子科技有限公司  
作者:正点原子 @ALIENTEK
************************************************/
void UltrasonicWave_Configuration(void);
void UltrasonicWave_StartMeasure(void);
void onemeasure(void);
extern u8  TIM5CH1_CAPTURE_STA;                //输入捕获状态                                                   
extern u16        TIM5CH1_CAPTURE_VAL;        //输入捕获值       
int main(void)
{               
         u32 temp=0;
        delay_init();                     //延时函数初始化          
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);         //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
        uart_init(115200);         //串口初始化为115200
        LED_Init();                             //LED端口初始化
UltrasonicWave_Configuration();
        TIM3_PWM_Init(899,0);                 //不分频。PWM频率=72000/(899+1)=80Khz
        TIM5_Cap_Init(0XFFFF,72-1);        //以1Mhz的频率计数
           while(1)
        {
               
                 UltrasonicWave_StartMeasure();
                if(TIM5CH1_CAPTURE_STA&0X80)//成功捕获到了一次上升沿
                {
                        temp=TIM5CH1_CAPTURE_STA&0X3F;
                        temp*=65536;//溢出时间总和
                        temp+=TIM5CH1_CAPTURE_VAL;//得到总的高电平时间
                        printf("HIGH:%d cm\r\n",temp*170/10000);//打印总的距离
                        TIM5CH1_CAPTURE_STA=0;//开启下一次捕获
                }
                 delay_ms(500);
        }
}

/*
* 函数名:UltrasonicWave_Configuration
* 描述  :超声波模块的初始化
* 输入  :无
* 输出  :无        
*/
void UltrasonicWave_Configuration(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;                                         //PC1接TRIG
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                     //设为推挽输出模式
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 
        GPIO_Init(GPIOC, &GPIO_InitStructure);                         //初始化外设GPIO

}

/*
* 函数名:UltrasonicWave_StartMeasure
* 描述  :开始测距,发送一个>10us的脉冲,然后测量返回的高电平时间
* 输入  :无
* 输出  :无        
*/
void UltrasonicWave_StartMeasure(void)
{
        Trig = 1;
        delay_us(20);                                      //延时20US
        Trig = 0;
        delay_us(20);
}


最佳答案

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

21

主题

138

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2019-6-1
在线时间
52 小时
 楼主| 发表于 2019-7-7 23:52:58 | 显示全部楼层
回复

使用道具 举报

21

主题

138

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2019-6-1
在线时间
52 小时
 楼主| 发表于 2019-7-7 23:54:08 | 显示全部楼层
顶顶顶求助
回复

使用道具 举报

21

主题

138

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2019-6-1
在线时间
52 小时
 楼主| 发表于 2019-7-8 15:47:54 | 显示全部楼层
顶顶顶顶顶顶
回复

使用道具 举报

21

主题

138

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2019-6-1
在线时间
52 小时
 楼主| 发表于 2019-7-8 23:34:30 | 显示全部楼层
顶顶顶顶顶顶
回复

使用道具 举报

21

主题

138

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2019-6-1
在线时间
52 小时
 楼主| 发表于 2019-7-9 19:46:29 | 显示全部楼层
顶顶顶顶顶顶
回复

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1612
金钱
1612
注册时间
2012-6-15
在线时间
39 小时
发表于 2019-7-10 00:30:28 | 显示全部楼层
本帖最后由 aleda303 于 2019-7-10 00:34 编辑

硬件不一样,方案不一样, 不太好判断你的问题。
我把我的 给你参考下: 用的中断 + 计时器
  1. extern bool start_trig_measure;
  2. void EXTI15_10_IRQHandler(void)
  3. {
  4.         static bool en=false;
  5.         if(EXTI->GetITFlag(EXTIType::Line14))
  6.         {
  7.                 EXTI->ClearFlag(EXTIType::Line14) ;
  8.                 if (ULTRA_ECHO() == 0)   {
  9.                         if(start_trig_measure && en)    {
  10.                                 ultra_time = TIM2->CNT;                                
  11.                                 start_trig_measure =false;        
  12.                         }
  13.                         en = false;
  14.                 }
  15.                 else    {
  16.                         en = true;                        
  17.                         TIM2->CNT = 0;
  18.                 }
  19.                         
  20.                
  21.         }
  22. }
复制代码

  1. void Application::GetDistance()
  2. {
  3.         float          t = ultra_time / 500.0 ; //ms 获取时间参数,并计算距离。
  4.           //中间的一部分数据处理 去掉了 省略

  5.        //下面准备重新启动测量
  6.         ULTRA_TIRG(1);
  7.         delay_us(15);
  8.         ULTRA_TIRG(0);
  9.         delay_ms(60);
  10.         start_trig_measure=true;
  11. }
复制代码
回复

使用道具 举报

34

主题

331

帖子

0

精华

高级会员

Rank: 4

积分
857
金钱
857
注册时间
2018-9-16
在线时间
240 小时
发表于 2019-7-10 10:12:35 | 显示全部楼层
需要技术支持吗,可以联系我
回复

使用道具 举报

0

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2019-6-22
在线时间
10 小时
发表于 2019-7-10 15:05:40 | 显示全部楼层
先把PC1电平拉低,试试
回复

使用道具 举报

0

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2019-6-22
在线时间
10 小时
发表于 2019-7-10 15:07:36 | 显示全部楼层
不行的话,全代码发给我看看
回复

使用道具 举报

21

主题

138

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2019-6-1
在线时间
52 小时
 楼主| 发表于 2019-7-10 21:46:48 | 显示全部楼层
林大杨 发表于 2019-7-10 15:07
不行的话,全代码发给我看看

也不行,这个就是主函数全部,其他头文件跟原子的输入捕获一样
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2019-7-11 02:16:50 | 显示全部楼层
帮顶
回复

使用道具 举报

10

主题

293

帖子

0

精华

高级会员

Rank: 4

积分
623
金钱
623
注册时间
2019-6-3
在线时间
107 小时
发表于 2019-7-11 10:37:12 | 显示全部楼层
整理一下楼主的代码
  1. #include "led.h"
  2. #include "delay.h"
  3. #include "key.h"
  4. #include "sys.h"
  5. #include "usart.h"
  6. #include "timer.h"
  7. #define Trig PCout(1)                //PC1        TRIG
  8. /************************************************
  9. ALIENTEK战舰STM32开发板实验10
  10. 输入捕获实验  
  11. 技术支持:www.openedv.com
  12. 淘宝店铺:http://eboard.taobao.com
  13. 关注微信公众平台微信号:"正点原子",免费获取STM32资料。
  14. 广州市星翼电子科技有限公司  
  15. 作者:正点原子 @ALIENTEK
  16. ************************************************/
  17. void UltrasonicWave_Configuration(void);
  18. void UltrasonicWave_StartMeasure(void);
  19. void onemeasure(void);
  20. extern u8  TIM5CH1_CAPTURE_STA;                //输入捕获状态                                                   
  21. extern u16        TIM5CH1_CAPTURE_VAL;        //输入捕获值        
  22. int main(void)
  23. {               
  24.          u32 temp=0;
  25.         delay_init();                     //延时函数初始化         
  26.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);         //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  27.         uart_init(115200);         //串口初始化为115200
  28.         LED_Init();                             //LED端口初始化
  29. UltrasonicWave_Configuration();
  30.         TIM3_PWM_Init(899,0);                 //不分频。PWM频率=72000/(899+1)=80Khz
  31.         TIM5_Cap_Init(0XFFFF,72-1);        //以1Mhz的频率计数
  32.            while(1)
  33.         {
  34.                
  35.                  UltrasonicWave_StartMeasure();
  36.                 if(TIM5CH1_CAPTURE_STA&0X80)//成功捕获到了一次上升沿
  37.                 {
  38.                         temp=TIM5CH1_CAPTURE_STA&0X3F;
  39.                         temp*=65536;//溢出时间总和
  40.                         temp+=TIM5CH1_CAPTURE_VAL;//得到总的高电平时间
  41.                         printf("HIGH:%d cm\r\n",temp*170/10000);//打印总的距离
  42.                         TIM5CH1_CAPTURE_STA=0;//开启下一次捕获
  43.                 }
  44.                  delay_ms(500);
  45.         }
  46. }

  47. /*
  48. * 函数名:UltrasonicWave_Configuration
  49. * 描述  :超声波模块的初始化
  50. * 输入  :无
  51. * 输出  :无        
  52. */
  53. void UltrasonicWave_Configuration(void)
  54. {
  55.         GPIO_InitTypeDef GPIO_InitStructure;

  56.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

  57.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;                                         //PC1接TRIG
  58.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                     //设为推挽输出模式
  59.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 
  60.         GPIO_Init(GPIOC, &GPIO_InitStructure);                         //初始化外设GPIO

  61. }

  62. /*
  63. * 函数名:UltrasonicWave_StartMeasure
  64. * 描述  :开始测距,发送一个>10us的脉冲,然后测量返回的高电平时间
  65. * 输入  :无
  66. * 输出  :无        
  67. */
  68. void UltrasonicWave_StartMeasure(void)
  69. {
  70.         Trig = 1;
  71.         delay_us(20);                                      //延时20US
  72.         Trig = 0;
  73.         delay_us(20);
  74. }
复制代码
回复

使用道具 举报

21

主题

138

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2019-6-1
在线时间
52 小时
 楼主| 发表于 2019-7-11 15:10:30 | 显示全部楼层
迅得电子 发表于 2019-7-11 10:37
整理一下楼主的代码

谢谢
回复

使用道具 举报

21

主题

138

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2019-6-1
在线时间
52 小时
 楼主| 发表于 2019-7-12 21:17:25 | 显示全部楼层
顶顶顶
回复

使用道具 举报

21

主题

138

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2019-6-1
在线时间
52 小时
 楼主| 发表于 2019-7-15 21:58:42 | 显示全部楼层
顶顶顶,还是没整出来,求助,有没有完整的可以借鉴下
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2019-6-19
在线时间
8 小时
发表于 2019-7-30 16:50:40 | 显示全部楼层
楼主你的问题解决了吗 ?   我也遇到了这种问题
回复

使用道具 举报

21

主题

138

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2019-6-1
在线时间
52 小时
 楼主| 发表于 2019-7-30 22:56:07 | 显示全部楼层
linxin 发表于 2019-7-30 16:50
楼主你的问题解决了吗 ?   我也遇到了这种问题

额。。我没整这个了,当时应该是代码写错了没有弄echo引脚的问题
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-26 03:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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