|
利用兩個超聲波模塊進(jìn)行定位判斷坐標(biāo)位置
STM32單片機源程序如下:
#include "csbcj.h"
#include "tim.h"
#include "delay.h"
#include "Systick.h"
extern float time; //X接收時間
extern float UltrasonicWave_Distance; //X距離
extern float Ytime; //Y接收時間
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 線路為中斷請求
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //設(shè)置輸入線路 上升沿為中斷請求
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è)置中斷來源
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; // 設(shè)置主優(yōu)先級為 2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 設(shè)置搶占優(yōu)先級為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 線路為中斷請求
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //設(shè)置輸入線路 上升沿為中斷請求
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è)置中斷來源
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; // 設(shè)置主優(yōu)先級為 2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; // 設(shè)置搶占優(yōu)先級為1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中斷
NVIC_Init(&NVIC_InitStructure);
}
/*
* 函數(shù)名:UltrasonicWave_Configuration
* 描述 :超聲波模塊的初始化
* 輸入 :無
* 輸出 :無
*/
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
* 描述 :開始測距,發(fā)送一個>10us的脈沖,然后測量返回的高電平時間
* 輸入 :無
* 輸出 :無
*/
void UltrasonicWave_StartMeasure(void)
{
//X
GPIO_SetBits(TRIG_PORT,TRIG_PIN); //送>10US的高電平
SysTick_Delay_us(20); //延時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); //延時20US高電平觸發(fā)模塊工作
GPIO_ResetBits(YTRIG_PORT,YTRIG_PIN); //開始工作關(guān)閉高電平置低電平
}
//中斷服務(wù)函數(shù)
//X軸
//中斷服務(wù)函數(shù)用來接收信息的處理
void EXTIX_IRQHandler(void)
{
SysTick_Delay_us(10); //延時10us
if(EXTI_GetITStatus(EXTI_Linex) != RESET) //中斷發(fā)生
{
TIM_SetCounter(TIMX,0); //計數(shù)器清零
TIME_X_Y=0; //溢出次數(shù)清零
TIM_Cmd(TIMX, ENABLE); //開啟時鐘
while(GPIO_ReadInputDataBit(ECHO_PORT,ECHO_PIN)); //等待低電平
TIM_Cmd(TIMX, DISABLE); //定時器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ù)用來接收信息的處理
void YEXTIX_IRQHandler(void)
{
SysTick_Delay_us(10); //延時10us
if(EXTI_GetITStatus(YEXTI_Linex) != RESET) //中斷發(fā)生
{
TIM_SetCounter(YTIMX,0); //計數(shù)器清零
YTIME_X_Y=0; //溢出次數(shù)清零
TIM_Cmd(YTIMX, ENABLE); //開啟時鐘
while(GPIO_ReadInputDataBit(YECHO_PORT,YECHO_PIN)); //等待低電平
TIM_Cmd(YTIMX, DISABLE); //定時器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ā)送啟動脈沖大于10us
#define TRIG_PORT GPIOC //TRIG
#define TRIG_PIN GPIO_Pin_8 //TRIG
//接受到回波信號引腳
#define ECHO_PORT GPIOC //ECHO
#define ECHO_PIN GPIO_Pin_7 //ECHO
//利用中斷接收超聲波回波信號
#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ā)送啟動脈沖大于10us
#define YTRIG_PORT GPIOC //TRIG
#define YTRIG_PIN GPIO_Pin_14 //TRIG
//接受到回波信號引腳
#define YECHO_PORT GPIOC //ECHO
#define YECHO_PIN GPIO_Pin_4 //ECHO
//利用中斷接收超聲波回波信號
#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); //對超聲波模塊初始化
void UltrasonicWave_StartMeasure(void); //開始測距,發(fā)送一個>10us的脈沖,然后測量返回的高電平時間
void YUltrasonicWave_StartMeasure(void);
#endif /*__CSBCJ_H*/
|
-
捕獲.PNG
(27.12 KB, 下載次數(shù): 51)
下載附件
2019-7-25 20:41 上傳
-
-
2個超聲波定位.7z
2019-7-26 02:42 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
193.36 KB, 下載次數(shù): 41, 下載積分: 黑幣 -5
評分
-
查看全部評分
|