找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

帖子
查看: 3827|回復(fù): 1
收起左側(cè)

STM32超聲波定位程序 用兩個(gè)模塊判斷坐標(biāo)位置

[復(fù)制鏈接]
ID:334435 發(fā)表于 2019-7-25 20:42 | 顯示全部樓層 |閱讀模式
利用兩個(gè)超聲波模塊進(jìn)行定位判斷坐標(biāo)位置

STM32單片機(jī)源程序如下:
#include "csbcj.h"
#include "tim.h"
#include "delay.h"
#include "Systick.h"

extern float time;                         //X接收時(shí)間
extern float UltrasonicWave_Distance;      //X距離     

extern float Ytime;                         //Y接收時(shí)間
extern float YUltrasonicWave_Distance;      //Y距離

static void BASIC_CSBC_NVIC_Config(void)
{
          EXTI_InitTypeDef EXTI_InitStructure;
          NVIC_InitTypeDef NVIC_InitStructure;

           GPIO_EXTILineConfig(GPIO_PortSourceGPIOX,GPIO_PinSourcex);    //GPIOC.7          中斷線以及中斷初始化配置
    EXTI_InitStructure.EXTI_Line=EXTI_Linex;                      //外部中斷線7
          EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;                  //設(shè)置 EXTI 線路為中斷請(qǐng)求
          EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;        //設(shè)置輸入線路 上升沿為中斷請(qǐng)求
          EXTI_InitStructure.EXTI_LineCmd = ENABLE;                     //使能
          EXTI_Init(&EXTI_InitStructure);                                            //根據(jù)EXTI_InitStruct中指定的參數(shù)初始化外設(shè)EXTI寄存器

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);                      // 設(shè)置中斷組為2        
    NVIC_InitStructure.NVIC_IRQChannel = EXTIx_IRQn ;                          // 設(shè)置中斷來(lái)源
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;                        // 設(shè)置主優(yōu)先級(jí)為 2
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                         // 設(shè)置搶占優(yōu)先級(jí)為1
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;               //使能中斷
    NVIC_Init(&NVIC_InitStructure);
        
        
          //Y軸
                 GPIO_EXTILineConfig(YGPIO_PortSourceGPIOX,YGPIO_PinSourcex);    //GPIOC.7          中斷線以及中斷初始化配置
    EXTI_InitStructure.EXTI_Line=YEXTI_Linex;                      //外部中斷線7
          EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;                  //設(shè)置 EXTI 線路為中斷請(qǐng)求
          EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;        //設(shè)置輸入線路 上升沿為中斷請(qǐng)求
          EXTI_InitStructure.EXTI_LineCmd = ENABLE;                     //使能
          EXTI_Init(&EXTI_InitStructure);                                            //根據(jù)EXTI_InitStruct中指定的參數(shù)初始化外設(shè)EXTI寄存器

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);                      // 設(shè)置中斷組為2        
    NVIC_InitStructure.NVIC_IRQChannel = YEXTIx_IRQn ;                          // 設(shè)置中斷來(lái)源
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;                        // 設(shè)置主優(yōu)先級(jí)為 2
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;                         // 設(shè)置搶占優(yōu)先級(jí)為1
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;               //使能中斷
    NVIC_Init(&NVIC_InitStructure);
        
}


/*
* 函數(shù)名:UltrasonicWave_Configuration
* 描述  :超聲波模塊的初始化
* 輸入  :無(wú)
* 輸出  :無(wú)        
*/
void UltrasonicWave_Configuration(void)
{
  GPIO_InitTypeDef       GPIO_InitStructure;        
        
  RCC_APBxPeriphClockCmd(RCC_GPIO_Clock, ENABLE);
        
   //X
  GPIO_InitStructure.GPIO_Pin = TRIG_PIN;                                                //PC8接TRIG
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                   //設(shè)為推挽輸出模式
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 
  GPIO_Init(TRIG_PORT, &GPIO_InitStructure);                   //初始化外設(shè)GPIO

  GPIO_InitStructure.GPIO_Pin = ECHO_PIN;                                        //PC7接ECH0
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;                      //設(shè)為輸入
  GPIO_Init(ECHO_PORT,&GPIO_InitStructure);                                                  //初始化GPIOA
        //Y
        GPIO_InitStructure.GPIO_Pin = YTRIG_PIN;                                                //PC8接TRIG
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                   //設(shè)為推挽輸出模式
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 
  GPIO_Init(YTRIG_PORT, &GPIO_InitStructure);                   //初始化外設(shè)GPIO

  GPIO_InitStructure.GPIO_Pin = YECHO_PIN;                                        //PC7接ECH0
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;                      //設(shè)為輸入
  GPIO_Init(YECHO_PORT,&GPIO_InitStructure);                                                  //初始化GPIOA
        
        BASIC_CSBC_NVIC_Config();
        
}

/*
* 函數(shù)名:UltrasonicWave_StartMeasure
* 描述  :開始測(cè)距,發(fā)送一個(gè)>10us的脈沖,然后測(cè)量返回的高電平時(shí)間
* 輸入  :無(wú)
* 輸出  :無(wú)        
*/
void UltrasonicWave_StartMeasure(void)
{
        //X
  GPIO_SetBits(TRIG_PORT,TRIG_PIN);                   //送>10US的高電平
  SysTick_Delay_us(20);                                         //延時(shí)20US高電平觸發(fā)模塊工作
  GPIO_ResetBits(TRIG_PORT,TRIG_PIN);     //開始工作關(guān)閉高電平置低電平
        
}

void YUltrasonicWave_StartMeasure(void)
{
        //Y
        GPIO_SetBits(YTRIG_PORT,YTRIG_PIN);                   //送>10US的高電平
  SysTick_Delay_us(20);                                         //延時(shí)20US高電平觸發(fā)模塊工作
  GPIO_ResetBits(YTRIG_PORT,YTRIG_PIN);     //開始工作關(guān)閉高電平置低電平
}

//中斷服務(wù)函數(shù)


//X軸
//中斷服務(wù)函數(shù)用來(lái)接收信息的處理
void EXTIX_IRQHandler(void)
{
    SysTick_Delay_us(10);                                                                      //延時(shí)10us
   if(EXTI_GetITStatus(EXTI_Linex) != RESET)                              //中斷發(fā)生
           {
                         TIM_SetCounter(TIMX,0);                                            //計(jì)數(shù)器清零
                         TIME_X_Y=0;                                                        //溢出次數(shù)清零
                         TIM_Cmd(TIMX, ENABLE);                                             //開啟時(shí)鐘
                         while(GPIO_ReadInputDataBit(ECHO_PORT,ECHO_PIN));                        //等待低電平
                         TIM_Cmd(TIMX, DISABLE);                                                              //定時(shí)器2失能
                         UltrasonicWave_Distance=TIM_GetCounter(TIMX)*5*34/2000;                                         //距離
             EXTI_ClearITPendingBit(EXTI_Linex);                                //清除EXTI7線路掛起位
                         TIM_SetCounter(YTIMX,0);
     }
                  SysTick_Delay_ms(50);
                        YUltrasonicWave_StartMeasure();
                 
}

//TIMx的中斷服務(wù)函數(shù)   
// TIME_x_y為中斷次數(shù)
void BASE_TIMX_IRQHandle(void )
{
  if (TIM_GetITStatus(TIMX,TIM_IT_Update) != RESET) //檢查指定的TIM中斷發(fā)生與否:TIM 中斷源
                  {
//                          TIME_X_Y++;  //記錄發(fā)生了多少次中斷,一次中斷為60000us
                         TIM_ClearITPendingBit(TIMX,TIM_FLAG_Update );  //清除TIMx的中斷待處理位:TIM 中斷源
                        }
}

//Y軸
//中斷服務(wù)函數(shù)用來(lái)接收信息的處理
void YEXTIX_IRQHandler(void)  
{
    SysTick_Delay_us(10);                                                               //延時(shí)10us
   if(EXTI_GetITStatus(YEXTI_Linex) != RESET)                              //中斷發(fā)生
           {
                         TIM_SetCounter(YTIMX,0);                                            //計(jì)數(shù)器清零
                         YTIME_X_Y=0;                                                        //溢出次數(shù)清零
                         TIM_Cmd(YTIMX, ENABLE);                                             //開啟時(shí)鐘
                         while(GPIO_ReadInputDataBit(YECHO_PORT,YECHO_PIN));                       //等待低電平
                         TIM_Cmd(YTIMX, DISABLE);                                                               //定時(shí)器2失能
                         YUltrasonicWave_Distance=TIM_GetCounter(YTIMX)*5*34/2000;                                         //距離
             EXTI_ClearITPendingBit(YEXTI_Linex);                                //清除EXTI7線路掛起位
                         TIM_SetCounter(YTIMX,0);
     }
}

//TIMx的中斷服務(wù)函數(shù)   
// TIME_x_y為中斷次數(shù)
void YBASE_TIMX_IRQHandle(void )
{
  if (TIM_GetITStatus(YTIMX,TIM_IT_Update) != RESET) //檢查指定的TIM中斷發(fā)生與否:TIM 中斷源
                  {
                          TIM_ClearITPendingBit(YTIMX,TIM_FLAG_Update );  //清除TIMx的中斷待處理位:TIM 中斷源
                        }
}



硬件宏定義
#ifndef __CSBCJ_H
#define __CSBCJ_H
#include "tim.h"


#define  RCC_APBxPeriphClockCmd   RCC_APB2PeriphClockCmd
#define  RCC_GPIO_Clock           (RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO)



//X軸
//發(fā)送啟動(dòng)脈沖大于10us
#define         TRIG_PORT      GPIOC                      //TRIG   
#define         TRIG_PIN       GPIO_Pin_8    //TRIG
//接受到回波信號(hào)引腳
#define         ECHO_PORT      GPIOC                      //ECHO
#define         ECHO_PIN       GPIO_Pin_7          //ECHO
//利用中斷接收超聲波回波信號(hào)
#define  GPIO_PortSourceGPIOX    GPIO_PortSourceGPIOC
#define  GPIO_PinSourcex         GPIO_PinSource7
#define  EXTI_Linex              EXTI_Line7
#define  EXTIx_IRQn              EXTI9_5_IRQn
#define  EXTIX_IRQHandler        EXTI9_5_IRQHandler



//Y軸
//發(fā)送啟動(dòng)脈沖大于10us
#define         YTRIG_PORT      GPIOC                      //TRIG   
#define         YTRIG_PIN       GPIO_Pin_14     //TRIG
//接受到回波信號(hào)引腳
#define         YECHO_PORT      GPIOC                      //ECHO
#define         YECHO_PIN       GPIO_Pin_4            //ECHO
//利用中斷接收超聲波回波信號(hào)
#define  YGPIO_PortSourceGPIOX    GPIO_PortSourceGPIOC
#define  YGPIO_PinSourcex         GPIO_PinSource4
#define  YEXTI_Linex              EXTI_Line4
#define  YEXTIx_IRQn              EXTI4_IRQn
#define  YEXTIX_IRQHandler        EXTI4_IRQHandler



static void BASIC_CSBC_NVIC_Config(void);
void UltrasonicWave_Configuration(void);               //對(duì)超聲波模塊初始化
void UltrasonicWave_StartMeasure(void);                //開始測(cè)距,發(fā)送一個(gè)>10us的脈沖,然后測(cè)量返回的高電平時(shí)間
void YUltrasonicWave_StartMeasure(void);

#endif  /*__CSBCJ_H*/
捕獲.PNG

2個(gè)超聲波定位.7z

193.36 KB, 下載次數(shù): 41, 下載積分: 黑幣 -5

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:334435 發(fā)表于 2019-7-25 21:28 | 顯示全部樓層
X軸的中斷服務(wù)函數(shù) TIM_SetCounter(YTIMX,0);  應(yīng)該改為TIM_SetCounter(TIMX,0);才對(duì)
不過(guò)這一句不寫也沒有發(fā)現(xiàn)什么大問題
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表