OpenEdv-开源电子网

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

stm32多个超声波测距(最少四个)

[复制链接]

5

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2014-3-8
在线时间
19 小时
发表于 2015-5-12 18:51:10 | 显示全部楼层 |阅读模式
5金钱
有没有大侠会多个超声波测距,最少四个,怎么用?初学者,求指导,求源程序

最佳答案

查看完整内容[请看2#楼]

超声波测距会一个就会四个了...所以我感觉题主应该不太清楚怎么使用超声波模块进行测距。 他的具体原理是:向Trig引脚发送一个不低于10us的高电平(你可以设置为20us),当模块接收到这个电平的时候,发出超声波,然后计此刻到收到回波的时间(比如x毫秒)。最后通过Echo引脚发出一个x毫秒的高电平。 所以只要捕捉这段高电平的时间,除以2就得到了声音到达障碍物的时间。但是要注意温度对时间的影响。温度和速度的表格也可以通过百 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

279

帖子

0

精华

高级会员

Rank: 4

积分
750
金钱
750
注册时间
2015-3-27
在线时间
98 小时
发表于 2015-5-12 18:51:11 | 显示全部楼层
超声波测距会一个就会四个了...所以我感觉题主应该不太清楚怎么使用超声波模块进行测距。
他的具体原理是:向Trig引脚发送一个不低于10us的高电平(你可以设置为20us),当模块接收到这个电平的时候,发出超声波,然后计此刻到收到回波的时间(比如x毫秒)。最后通过Echo引脚发出一个x毫秒的高电平。
所以只要捕捉这段高电平的时间,除以2就得到了声音到达障碍物的时间。但是要注意温度对时间的影响。温度和速度的表格也可以通过百度查到。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-5-12 22:49:44 | 显示全部楼层
先写一个出来,然后在搞多个。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

5

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2014-3-8
在线时间
19 小时
 楼主| 发表于 2015-5-14 21:20:59 | 显示全部楼层
回复【3楼】弦子的弦:
---------------------------------
我会测一个,这不是得用定时器计算时间,那一个定时器能同时检测这四个吗?还是用四个定时器
回复

使用道具 举报

6

主题

279

帖子

0

精华

高级会员

Rank: 4

积分
750
金钱
750
注册时间
2015-3-27
在线时间
98 小时
发表于 2015-5-15 09:18:48 | 显示全部楼层
回复【4楼】思雨轩:
---------------------------------
普通定时器有四个通道,好像可以四路捕获,不过我不是很清楚,你看看这方面的教程吧。
回复

使用道具 举报

5

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2014-3-8
在线时间
19 小时
 楼主| 发表于 2015-5-16 10:08:30 | 显示全部楼层
回复【5楼】弦子的弦:
---------------------------------
好的,谢谢
回复

使用道具 举报

7

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-3-12
在线时间
2 小时
发表于 2015-6-5 10:58:35 | 显示全部楼层
楼主,请问你弄出来没
回复

使用道具 举报

5

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2014-3-8
在线时间
19 小时
 楼主| 发表于 2015-6-6 19:55:41 | 显示全部楼层
回复【7楼】jhqcumt:
---------------------------------
木有
回复

使用道具 举报

2

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2016-3-25
在线时间
12 小时
发表于 2016-4-8 17:57:43 | 显示全部楼层
正点原子 发表于 2015-5-12 22:49
先写一个出来,然后在搞多个。

原子哥我改了两个超声波,单个都能实现,但是两个一起就出问题了[mw_shl_code=c,true]#include "UltrasonicWave.h"
#include "usart.h"
#include "timer.h"
#include "delay.h"

#define        TRIG_PORT      GPIOC                //TRIG      
#define        ECHO_PORT      GPIOC                //ECHO
#define        TRIG_0_PIN       GPIO_Pin_8   //TRIG
#define        TRIG_1_PIN       GPIO_Pin_2   //TRIG
#define        ECHO_0_PIN       GPIO_Pin_7        //ECHO
#define        ECHO_1_PIN       GPIO_Pin_1        //ECHO

float UltrasonicWave_Distance0;      //¼ÆËã3öμľààë
float UltrasonicWave_Distance1;


/*
* oˉêyÃû£oUltrasonicWave_Configuration
* Ãèêö  £o3¬éù2¨Ä£¿éμÄ3õê¼»ˉ
* êäèë  £oÎT
* êä3ö  £oÎT       
*/
void UltrasonicWave_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;       
        EXTI_InitTypeDef EXTI_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
       
        GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);        //1رÕjtag
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO, ENABLE);
   
  GPIO_InitStructure.GPIO_Pin = TRIG_0_PIN|TRIG_1_PIN;                                         //PC8£¬2½óTRIG
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                     //éèÎaíÆíìêä3öÄ£ê½
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                
  GPIO_Init(TRIG_PORT, &GPIO_InitStructure);                         //3õê¼»ˉíaéèGPIO

  GPIO_InitStructure.GPIO_Pin = ECHO_0_PIN|ECHO_1_PIN;                                     //PC7£¬1½óECH0
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;                 //éèÎaêäèë
  GPIO_Init(ECHO_PORT,&GPIO_InitStructure);                                                 //3õê¼»ˉGPIO
       
       
       
       
         //GPIOC.7          ÖD¶ÏÏßòÔ¼°ÖD¶Ï3õê¼»ˉÅäÖÃ
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource7);

         EXTI_InitStructure.EXTI_Line=EXTI_Line7;
          EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;       
          EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
          EXTI_InitStructure.EXTI_LineCmd = ENABLE;
          EXTI_Init(&EXTI_InitStructure);                //¸ù¾YEXTI_InitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉíaéèEXTI¼Ä′æÆ÷
               
               
                        GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource1);

         EXTI_InitStructure.EXTI_Line=EXTI_Line1;
          EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;       
          EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
          EXTI_InitStructure.EXTI_LineCmd = ENABLE;
          EXTI_Init(&EXTI_InitStructure);                //¸ù¾YEXTI_InitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉíaéèEXTI¼Ä′æÆ÷
               
                       
        NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;                        //ê1Äü°′¼üËùÔúμÄía2¿ÖD¶Ïí¨μà
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;        //ÇàÕ¼óÅÏè¼¶2
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;                                        //×óóÅÏè¼¶2
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //ê1Äüía2¿ÖD¶Ïí¨μà
          NVIC_Init(&NVIC_InitStructure);            //¸ù¾YNVIC_InitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉíaéèNVIC¼Ä′æÆ÷
               
               
                        NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;                        //ê1Äü°′¼üËùÔúμÄía2¿ÖD¶Ïí¨μà
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;        //ÇàÕ¼óÅÏè¼¶2
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                                        //×óóÅÏè¼¶0
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //ê1Äüía2¿ÖD¶Ïí¨μà
          NVIC_Init(&NVIC_InitStructure);            //¸ù¾YNVIC_InitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉíaéèNVIC¼Ä′æÆ÷
}


void EXTI9_5_IRQHandler(void)
{
        delay_us(10);                                      //Ñóê±10us
     if(EXTI_GetITStatus(EXTI_Line7) != RESET)
        {
                        TIM_SetCounter(TIM2,0);
                        TIM_Cmd(TIM2, ENABLE);             //¿aÆôê±Öó
               
                        while(GPIO_ReadInputDataBit(ECHO_PORT,ECHO_0_PIN));        //μè′yμíμçÆ½

                        TIM_Cmd(TIM2, DISABLE);                              //¶¨ê±Æ÷2ê§Äü
                        UltrasonicWave_Distance0=TIM_GetCounter(TIM2)*34/20.0;        //¼ÆËã¾ààë
                if((UltrasonicWave_Distance0>2)&&(UltrasonicWave_Distance0<20))
                {
                        GPIO_ResetBits(GPIOA,GPIO_Pin_8);
                        GPIO_ResetBits(GPIOD,GPIO_Pin_2);
                        printf("distance0:%f cm\n",UltrasonicWave_Distance0);
                }else
                {
                        GPIO_SetBits(GPIOA,GPIO_Pin_8);
                        GPIO_SetBits(GPIOD,GPIO_Pin_2);
                }
       
       
        EXTI_ClearITPendingBit(EXTI_Line7);  //&#199;&#229;3yEXTI7&#207;&#223;&#194;·1ò&#198;e&#206;&#187;
}

}



void EXTI1_IRQHandler(void)
{
        delay_us(10);                                      //&#209;óê±10us
     if(EXTI_GetITStatus(EXTI_Line1) != RESET)
        {
                        TIM_SetCounter(TIM2,0);
                        TIM_Cmd(TIM2, ENABLE);                                             //&#191;a&#198;&#244;ê±&#214;ó
               
                        while(GPIO_ReadInputDataBit(ECHO_PORT,ECHO_1_PIN));        //μè′yμíμ&#231;&#198;&#189;

                        TIM_Cmd(TIM2, DISABLE);                                        //&#182;¨ê±&#198;÷2ê§&#196;ü
                        UltrasonicWave_Distance1=TIM_GetCounter(TIM2)*34/20.0;        //&#188;&#198;&#203;&#227;&#190;àà&#235;
               
                if((UltrasonicWave_Distance1>2)&&(UltrasonicWave_Distance1<20))
                {
                        GPIO_ResetBits(GPIOA,GPIO_Pin_8);
                        GPIO_ResetBits(GPIOD,GPIO_Pin_2);
                        printf("distance1:%f cm\n",UltrasonicWave_Distance1);
                }else
                {
                        GPIO_SetBits(GPIOA,GPIO_Pin_8);
                        GPIO_SetBits(GPIOD,GPIO_Pin_2);
                }
       
       
        EXTI_ClearITPendingBit(EXTI_Line1);  //&#199;&#229;3yEXTI1&#207;&#223;&#194;·1ò&#198;e&#206;&#187;
}

}

/*
* oˉêy&#195;&#251;£oUltrasonicWave_StartMeasure
* &#195;èê&#246;  £o&#191;aê&#188;2a&#190;à£&#172;·¢&#203;íò&#187;&#184;&#246;>10usμ&#196;&#194;&#246;3&#229;£&#172;è&#187;oó2aá&#191;·μ&#187;&#216;μ&#196;&#184;&#223;μ&#231;&#198;&#189;ê±&#188;&#228;
* ê&#228;è&#235;  £o&#206;T
* ê&#228;3&#246;  £o&#206;T       
*/
void UltrasonicWave_StartMeasure_0(void)
{
  GPIO_SetBits(TRIG_PORT,TRIG_0_PIN);                   //&#203;í>10USμ&#196;&#184;&#223;μ&#231;&#198;&#189;£TRIG_PORT,TRIG_PIN&#213;aá&#189;&#184;&#246;&#212;údefine&#214;DóD?
  delay_us(20);                                      //&#209;óê±20US
  GPIO_ResetBits(TRIG_PORT,TRIG_0_PIN);
       
}
void UltrasonicWave_StartMeasure_1(void)
{
  GPIO_SetBits(TRIG_PORT,TRIG_1_PIN);                   //&#203;í>10USμ&#196;&#184;&#223;μ&#231;&#198;&#189;£TRIG_PORT,TRIG_PIN&#213;aá&#189;&#184;&#246;&#212;údefine&#214;DóD?
  delay_us(20);                                      //&#209;óê±20US
  GPIO_ResetBits(TRIG_PORT,TRIG_1_PIN);
       
}
[/mw_shl_code]
回复

使用道具 举报

2

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2016-3-25
在线时间
12 小时
发表于 2016-4-13 16:45:05 | 显示全部楼层
用一个定时器的四路捕获就可以了。
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2016-5-27
在线时间
2 小时
发表于 2016-5-27 16:09:09 | 显示全部楼层
我和你一样,想做多个超声波,输入捕获进中断只能进一个,如果这时候其他的超声波开启就会产生误差(其他超声波高电平时间没进中断,只能等第一个算完出来才能进)。不知道楼主现在解决没有,我打算采用轮流开启的方法得出数据,还没试,不知道会怎么样。楼主如果解决了麻烦楼主说说实现方法。谢谢楼主。
回复

使用道具 举报

wuxiangchaonan1 该用户已被删除
发表于 2016-6-19 15:14:48 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

2

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2016-1-8
在线时间
34 小时
发表于 2016-6-19 17:51:08 | 显示全部楼层
我做过4路的,不过那个时候是用51做的,的确是会1路就会4路,不过要注意一个东西,超声波这个东西,你尽量别在一个非常近的平面上用多路,举个例子,两路,第二路和第一路靠得太近,第二路发射的波形,到达障碍物后返回,这个时候万一第一路正好开始接收回波,那这个时候第一路的结果就不是正确的结果了.
回复

使用道具 举报

2

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2016-1-8
在线时间
34 小时
发表于 2016-6-19 17:52:01 | 显示全部楼层
多路尽量是分时多路,这样可以尽量避免上面那种情况下的错误发生.
回复

使用道具 举报

0

主题

0

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2017-12-11
在线时间
1 小时
发表于 2016-10-27 15:11:28 | 显示全部楼层
弦子的弦 发表于 2015-5-12 23:22
超声波测距会一个就会四个了...所以我感觉题主应该不太清楚怎么使用超声波模块进行测距。
他的具体原理是: ...

学习了
回复

使用道具 举报

33

主题

310

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
495
金钱
495
注册时间
2016-12-31
在线时间
63 小时
发表于 2017-3-14 09:26:53 | 显示全部楼层
cancundiudiu 发表于 2016-6-19 17:51
我做过4路的,不过那个时候是用51做的,的确是会1路就会4路,不过要注意一个东西,超声波这个东西,你尽量别在一 ...

你好,就是如果我想通过两个超声波传感器来检测一个小短板平面是否和墙面水平的话该怎么解决这个问题呢?
回复

使用道具 举报

4

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2017-7-12
在线时间
25 小时
发表于 2017-7-13 20:50:55 | 显示全部楼层
参考你的程序修改了点
回复

使用道具 举报

4

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2017-7-12
在线时间
25 小时
发表于 2017-7-13 20:55:12 | 显示全部楼层
。。。。。。。。。

超声波模块程序外中断2路.rar

2.9 MB, 下载次数: 7474

回复

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2019-6-11
在线时间
9 小时
发表于 2019-6-12 16:44:13 来自手机 | 显示全部楼层
爱学拔 发表于 2017-7-13 20:55
。。。。。。。。。

这个程序超声波的传感器是US-100吗
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2021-1-17
在线时间
4 小时
发表于 2021-2-4 21:09:36 | 显示全部楼层
楼主解决了么?我也碰到同样的情况了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 02:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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