找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3122|回复: 1
打印 上一主题 下一主题
收起左侧

STM32超声波定位程序 用两个模块判断坐标位置

[复制链接]
跳转到指定楼层
楼主
利用两个超声波模块进行定位判断坐标位置

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;                  //设置 EXTI 线路为中断请求
          EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;        //设置输入线路 上升沿为中断请求
          EXTI_InitStructure.EXTI_LineCmd = ENABLE;                     //使能
          EXTI_Init(&EXTI_InitStructure);                                            //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);                      // 设置中断组为2        
    NVIC_InitStructure.NVIC_IRQChannel = EXTIx_IRQn ;                          // 设置中断来源
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;                        // 设置主优先级为 2
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                         // 设置抢占优先级为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;                  //设置 EXTI 线路为中断请求
          EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;        //设置输入线路 上升沿为中断请求
          EXTI_InitStructure.EXTI_LineCmd = ENABLE;                     //使能
          EXTI_Init(&EXTI_InitStructure);                                            //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);                      // 设置中断组为2        
    NVIC_InitStructure.NVIC_IRQChannel = YEXTIx_IRQn ;                          // 设置中断来源
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;                        // 设置主优先级为 2
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;                         // 设置抢占优先级为1
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;               //使能中断
    NVIC_Init(&NVIC_InitStructure);
        
}


/*
* 函数名: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;                   //设为推挽输出模式
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 
  GPIO_Init(TRIG_PORT, &GPIO_InitStructure);                   //初始化外设GPIO

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

  GPIO_InitStructure.GPIO_Pin = YECHO_PIN;                                        //PC7接ECH0
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;                      //设为输入
  GPIO_Init(YECHO_PORT,&GPIO_InitStructure);                                                  //初始化GPIOA
        
        BASIC_CSBC_NVIC_Config();
        
}

/*
* 函数名:UltrasonicWave_StartMeasure
* 描述  :开始测距,发送一个>10us的脉冲,然后测量返回的高电平时间
* 输入  :无
* 输出  :无        
*/
void UltrasonicWave_StartMeasure(void)
{
        //X
  GPIO_SetBits(TRIG_PORT,TRIG_PIN);                   //送>10US的高电平
  SysTick_Delay_us(20);                                         //延时20US高电平触发模块工作
  GPIO_ResetBits(TRIG_PORT,TRIG_PIN);     //开始工作关闭高电平置低电平
        
}

void YUltrasonicWave_StartMeasure(void)
{
        //Y
        GPIO_SetBits(YTRIG_PORT,YTRIG_PIN);                   //送>10US的高电平
  SysTick_Delay_us(20);                                         //延时20US高电平触发模块工作
  GPIO_ResetBits(YTRIG_PORT,YTRIG_PIN);     //开始工作关闭高电平置低电平
}

//中断服务函数


//X轴
//中断服务函数用来接收信息的处理
void EXTIX_IRQHandler(void)
{
    SysTick_Delay_us(10);                                                                      //延时10us
   if(EXTI_GetITStatus(EXTI_Linex) != RESET)                              //中断发生
           {
                         TIM_SetCounter(TIMX,0);                                            //计数器清零
                         TIME_X_Y=0;                                                        //溢出次数清零
                         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的中断服务函数   
// TIME_x_y为中断次数
void BASE_TIMX_IRQHandle(void )
{
  if (TIM_GetITStatus(TIMX,TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源
                  {
//                          TIME_X_Y++;  //记录发生了多少次中断,一次中断为60000us
                         TIM_ClearITPendingBit(TIMX,TIM_FLAG_Update );  //清除TIMx的中断待处理位:TIM 中断源
                        }
}

//Y轴
//中断服务函数用来接收信息的处理
void YEXTIX_IRQHandler(void)  
{
    SysTick_Delay_us(10);                                                               //延时10us
   if(EXTI_GetITStatus(YEXTI_Linex) != RESET)                              //中断发生
           {
                         TIM_SetCounter(YTIMX,0);                                            //计数器清零
                         YTIME_X_Y=0;                                                        //溢出次数清零
                         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的中断服务函数   
// TIME_x_y为中断次数
void YBASE_TIMX_IRQHandle(void )
{
  if (TIM_GetITStatus(YTIMX,TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否: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轴
//发送启动脉冲大于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轴
//发送启动脉冲大于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);                //开始测距,发送一个>10us的脉冲,然后测量返回的高电平时间
void YUltrasonicWave_StartMeasure(void);

#endif  /*__CSBCJ_H*/

捕获.PNG (27.12 KB, 下载次数: 42)

捕获.PNG

2个超声波定位.7z

193.36 KB, 下载次数: 41, 下载积分: 黑币 -5

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:334435 发表于 2019-7-25 21:28 | 只看该作者
X轴的中断服务函数 TIM_SetCounter(YTIMX,0);  应该改为TIM_SetCounter(TIMX,0);才对
不过这一句不写也没有发现什么大问题
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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