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

2019-07-20 23:57发布

有没有大侠会多个超声波测距,最少四个,怎么用?初学者,求指导,求源程序
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
17条回答
思雨轩
1楼-- · 2019-07-22 04:33
 精彩回答 2  元偷偷看……
名字要起的长点
2楼-- · 2019-07-22 09:24
正点原子 发表于 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 ",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 ",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]
名字要起的长点
3楼-- · 2019-07-22 12:49
用一个定时器的四路捕获就可以了。
asdkder
4楼-- · 2019-07-22 12:51
我和你一样,想做多个超声波,输入捕获进中断只能进一个,如果这时候其他的超声波开启就会产生误差(其他超声波高电平时间没进中断,只能等第一个算完出来才能进)。不知道楼主现在解决没有,我打算采用轮流开启的方法得出数据,还没试,不知道会怎么样。楼主如果解决了麻烦楼主说说实现方法。谢谢楼主。
cancundiudiu
5楼-- · 2019-07-22 17:57
 精彩回答 2  元偷偷看……
cancundiudiu
6楼-- · 2019-07-22 18:31
多路尽量是分时多路,这样可以尽量避免上面那种情况下的错误发生.

一周热门 更多>