多个超声波测距问题

2019-08-17 09:34发布

网上的程序,在一个超声波模块的情况下可以用,我想把它改成多个超声波,不知怎么改,大神们帮我看看问题出在哪里。[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        TRIG1_PIN       GPIO_Pin_8   //TRIG1
#define        ECHO1_PIN       GPIO_Pin_7        //ECHO1
#define        TRIG2_PIN       GPIO_Pin_4   //TRIG2
#define        ECHO2_PIN       GPIO_Pin_3        //ECHO2
#define        TRIG3_PIN       GPIO_Pin_2   //TRIG3
#define        ECHO3_PIN       GPIO_Pin_1        //ECHO3


float UltrasonicWave1_Distance;      //¼ÆËã3öμľààë   
float UltrasonicWave2_Distance;      //¼ÆËã3öμľààë   
float UltrasonicWave3_Distance;      //¼ÆËã3öμľààë   


/*
* oˉêyÃû£oUltrasonicWave_Configuration
* Ãèêö  £o3¬éù2¨Ä£¿éμÄ3õê¼»ˉ
* êäèë  £oÎT
* êä3ö  £oÎT       
*/
void UltrasonicWave1_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 = TRIG1_PIN;                                         //PC8½ó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 = ECHO1_PIN;                                     //PC7½óECHO
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;                 //éèÎaêäèë
  GPIO_Init(ECHO_PORT,&GPIO_InitStructure);                                                 //3õê¼»ˉGPIOA
       
         //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¼Ä′æÆ÷
               
                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¼Ä′æÆ÷
}
//
void UltrasonicWave2_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 = TRIG2_PIN;                                         //PC8½ó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 = ECHO2_PIN;                                     //PC7½óECHO
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;                 //éèÎaêäèë
  GPIO_Init(ECHO_PORT,&GPIO_InitStructure);                                                 //3õê¼»ˉGPIOA
       
                GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource3);
                EXTI_InitStructure.EXTI_Line=EXTI_Line3;
          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 = EXTI3_IRQn;                        //ê1Äü°′¼üËùÔúμÄía2¿ÖD¶Ïí¨μà
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;        //ÇàÕ¼óÅÏ輶2
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;                                        //×óóÅÏ輶2
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //ê1Äüía2¿ÖD¶Ïí¨μà
          NVIC_Init(&NVIC_InitStructure);            //¸ù¾YNVIC_InitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉíaéèNVIC¼Ä′æÆ÷
}
//
void UltrasonicWave3_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 = TRIG3_PIN;                                         //PC8½ó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 = ECHO3_PIN;                                     //PC7½óECHO
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;                 //éèÎaêäèë
  GPIO_Init(ECHO_PORT,&GPIO_InitStructure);                                                 //3õê¼»ˉGPIOA
       
                        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 = EXTI1_IRQn;                        //ê1Äü°′¼üËùÔúμÄía2¿ÖD¶Ïí¨μà
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;        //ÇàÕ¼óÅÏ輶2
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                                        //×óóÅÏ輶2
          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,ECHO1_PIN));                       //μè′yμíμçƽ

                        TIM_Cmd(TIM2, DISABLE);                                                               //¶¨ê±Æ÷2ê§Äü
                        UltrasonicWave1_Distance=TIM_GetCounter(TIM2)*34/20.0;                                                                         //&#188;&#198;&#203;&#227;&#190;àà&#235;&&UltrasonicWave_Distance<150
               
                if((UltrasonicWave1_Distance>2)&&(UltrasonicWave1_Distance<20))
                {
                        GPIO_ResetBits(GPIOA,GPIO_Pin_8);
                        GPIO_ResetBits(GPIOD,GPIO_Pin_2);
                        printf("distance1:%f cm ",UltrasonicWave1_Distance);
                }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 EXTI3_IRQHandler(void)
{
        delay_us(10);                                      //&#209;óê±10us
     if(EXTI_GetITStatus(EXTI_Line3) != RESET)
        {
                        TIM_SetCounter(TIM2,0);
                        TIM_Cmd(TIM2, ENABLE);                                             //&#191;a&#198;&#244;ê±&#214;ó
               
                        while(GPIO_ReadInputDataBit(ECHO_PORT,ECHO2_PIN));                       //μè′yμíμ&#231;&#198;&#189;

                        TIM_Cmd(TIM2, DISABLE);                                                               //&#182;¨ê±&#198;÷2ê§&#196;ü
                        UltrasonicWave2_Distance=TIM_GetCounter(TIM2)*34/20.0;                                                                         //&#188;&#198;&#203;&#227;&#190;àà&#235;&&UltrasonicWave_Distance<150
               
                if((UltrasonicWave2_Distance>2)&&(UltrasonicWave2_Distance<20))
                {
                        GPIO_ResetBits(GPIOA,GPIO_Pin_8);
                        GPIO_ResetBits(GPIOD,GPIO_Pin_2);
                        printf("distance2:%f cm ",UltrasonicWave2_Distance);
                }else
                {
                        GPIO_SetBits(GPIOA,GPIO_Pin_8);
                        GPIO_SetBits(GPIOD,GPIO_Pin_2);
                }
        EXTI_ClearITPendingBit(EXTI_Line3);  //&#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,ECHO3_PIN));                       //μè′yμíμ&#231;&#198;&#189;

                        TIM_Cmd(TIM2, DISABLE);                                                               //&#182;¨ê±&#198;÷2ê§&#196;ü
                        UltrasonicWave3_Distance=TIM_GetCounter(TIM2)*34/20.0;                                                                         //&#188;&#198;&#203;&#227;&#190;àà&#235;&&UltrasonicWave_Distance<150
               
                if((UltrasonicWave3_Distance>2)&&(UltrasonicWave3_Distance<20))
                {
                        GPIO_ResetBits(GPIOA,GPIO_Pin_8);
                        GPIO_ResetBits(GPIOD,GPIO_Pin_2);
                        printf("distance3:%f cm ",UltrasonicWave3_Distance);
                }else
                {
                        GPIO_SetBits(GPIOA,GPIO_Pin_8);
                        GPIO_SetBits(GPIOD,GPIO_Pin_2);
                }
        EXTI_ClearITPendingBit(EXTI_Line1);  //&#199;&#229;3yEXTI7&#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 UltrasonicWave1_StartMeasure(void)
{
  GPIO_SetBits(TRIG_PORT,TRIG1_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,TRIG1_PIN);
       
}
//
void UltrasonicWave2_StartMeasure(void)
{
  GPIO_SetBits(TRIG_PORT,TRIG2_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,TRIG2_PIN);
       
}
//
void UltrasonicWave3_StartMeasure(void)
{
  GPIO_SetBits(TRIG_PORT,TRIG3_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,TRIG3_PIN);
       
}
[/mw_shl_code]

————————————————————————————————————————————————————————————————
分割线
————————————————————————————————————————————————————————————————
下面是网上一个超声波的情况:
[mw_shl_code=c,true]#define        TRIG_PORT      GPIOC                //TRIG      
#define        ECHO_PORT      GPIOC                //ECHO
#define        TRIG_PIN       GPIO_Pin_8   //TRIG      
#define        ECHO_PIN       GPIO_Pin_7        //ECHO   

float UltrasonicWave_Distance;      //&#188;&#198;&#203;&#227;3&#246;μ&#196;&#190;àà&#235;   


/*
* oˉêy&#195;&#251;£oUltrasonicWave_Configuration
* &#195;èê&#246;  £o3&#172;éù2¨&#196;£&#191;éμ&#196;3&#245;ê&#188;&#187;ˉ
* ê&#228;è&#235;  £o&#206;T
* ê&#228;3&#246;  £o&#206;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&#216;±&#213;jtag
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO, ENABLE);
   
  GPIO_InitStructure.GPIO_Pin = TRIG_PIN;                                         //PC8&#189;óTRIG
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                     //éè&#206;aí&#198;íìê&#228;3&#246;&#196;£ê&#189;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                
  GPIO_Init(TRIG_PORT, &GPIO_InitStructure);                         //3&#245;ê&#188;&#187;ˉíaéèGPIO

  GPIO_InitStructure.GPIO_Pin = ECHO_PIN;                                     //PC7&#189;óECH0
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;                 //éè&#206;aê&#228;è&#235;
  GPIO_Init(ECHO_PORT,&GPIO_InitStructure);                                                 //3&#245;ê&#188;&#187;ˉGPIOA
       
         //GPIOC.7          &#214;D&#182;&#207;&#207;&#223;ò&#212;&#188;°&#214;D&#182;&#207;3&#245;ê&#188;&#187;ˉ&#197;&#228;&#214;&#195;
        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);                //&#184;ù&#190;YEXTI_InitStruct&#214;D&#214;&#184;&#182;¨μ&#196;2&#206;êy3&#245;ê&#188;&#187;ˉíaéèEXTI&#188;&#196;′&#230;&#198;÷
               
                       
        NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;                        //ê1&#196;ü°′&#188;ü&#203;ù&#212;úμ&#196;ía2&#191;&#214;D&#182;&#207;í¨μà
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;        //&#199;à&#213;&#188;ó&#197;&#207;è&#188;&#182;2
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;                                        //×óó&#197;&#207;è&#188;&#182;2
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //ê1&#196;üía2&#191;&#214;D&#182;&#207;í¨μà
          NVIC_Init(&NVIC_InitStructure);            //&#184;ù&#190;YNVIC_InitStruct&#214;D&#214;&#184;&#182;¨μ&#196;2&#206;êy3&#245;ê&#188;&#187;ˉíaéèNVIC&#188;&#196;′&#230;&#198;÷
}


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

                        TIM_Cmd(TIM2, DISABLE);                                                         //&#182;¨ê±&#198;÷2ê§&#196;ü
                        UltrasonicWave_Distance=TIM_GetCounter(TIM2)*5*34/200.0;                                                                         //&#188;&#198;&#203;&#227;&#190;àà&#235;&&UltrasonicWave_Distance<150
               
        if(UltrasonicWave_Distance>0)
        {
                printf("distance:%f cm",UltrasonicWave_Distance);
        }
               
       
       
        EXTI_ClearITPendingBit(EXTI_Line7);  //&#199;&#229;3yEXTI7&#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(void)
{
  GPIO_SetBits(TRIG_PORT,TRIG_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_PIN);
       
}[/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
名字要起的长点
1楼-- · 2019-08-17 11:10
问题已经解决,在论坛里改的一个程序,用定时器的4路捕获坐的,在这里感谢原作者。
名字要起的长点
2楼-- · 2019-08-17 12:53
自己顶一下,搞了3天了,定时器和中断用不好啊
名字要起的长点
3楼-- · 2019-08-17 18:30
 精彩回答 2  元偷偷看……
忍无心恋
4楼-- · 2019-08-17 19:16
技术有限,看不懂
wuduode
5楼-- · 2019-08-17 21:30
本帖最后由 wuduode 于 2016-6-12 17:39 编辑

你好,给你发站内消息了
524569121
6楼-- · 2019-08-17 21:42
楼主,我现在正在做毕设,要用到4路超声波测距,通过论坛的程序可以实现一路,请问怎么通过四路捕获实现四路超声波测距呢。

一周热门 更多>