×
单片机 > 单片机程序设计 > 详情

STM32之限位开关

发布时间:2020-12-25 发布时间:
|

一、简介


本文介绍如何在STM32上使用限位开关。


二、实验平台


库版本:STM32F10x_StdPeriph_Lib_V3.5.0


编译软件:MDK4.53


硬件平台:STM32开发板(主芯片stm32f103c8t6)


仿真器:JLINK


三、版权声明


四、实验前提


五、基础知识

1、限位开关是什么?


答:限位开关其实就是会复原开关的开关按键。


也就是说按下限位开关的开关能触发STM32的IO中断,而松开手指时限位开关会复原。


2、限位开关有什么用?


答:通常被用于限制电机转动角度来使用。


例如两个限位开关形成45°的夹角,一旦电机转动触发任意其中一个限位开关,STM32检测到限位开关的中断则停止电机,不能再继续往此方向转动。


3、限位开关有什么优缺点?


答:限位开关的优点是以物理的方式触发单片机中断,因此不增加功耗。缺点是经常使用的话限位开关易损坏。


4、限位开关在软件上应如何开发?


答:由于限位开关通常是两个,因此按照普通按键的形式写两个按键,在按键中断中做停止电机等处理即可。


六、实验步骤


1、编写并添加限位开关驱动


1)编写驱动GUA_Limit_Switch.c(存放在“……HARDWARE”)


//******************************************************************************              

//name:             GUA_Limit_Switch.c             

//introduce:        限位开关驱动      

//author:           甜甜的大香瓜                     

//email:            897503845@qq.com         

//QQ group          香瓜单片机之STM8/STM32(164311667)                      

//changetime:       2016.12.28                     

//******************************************************************************      

#include "stm32f10x.h" 

#include "GUA_Limit_Switch.h"

 

/*********************宏定义************************/

//引脚宏定义

#define GUA_LIMIT_SWITCH_UP_PORT GPIOA

#define GUA_LIMIT_SWITCH_UP_PIN GPIO_Pin_1

 

#define GUA_LIMIT_SWITCH_DOWN_PORT GPIOA

#define GUA_LIMIT_SWITCH_DOWN_PIN GPIO_Pin_4

 

/*********************内部函数************************/ 

static void GUA_Limit_Switch_IO_Init(void);

static void GUA_Limit_Switch_Exti_Init(void);

 

//******************************************************************************            

//name:             GUA_Limit_Switch_IO_Init           

//introduce:        限位开关的IO初始化         

//parameter:        none                 

//return:           none         

//author:           甜甜的大香瓜                 

//email:            897503845@qq.com     

//QQ group          香瓜单片机之STM8/STM32(164311667)                  

//changetime:       2016.12.28                     

//****************************************************************************** 

static void GUA_Limit_Switch_IO_Init(void)

{

//IO结构体

GPIO_InitTypeDef GPIO_InitStructure;

//时钟使能

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);

//UP配置

GPIO_InitStructure.GPIO_Pin = GUA_LIMIT_SWITCH_UP_PIN; 

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; 

GPIO_Init(GUA_LIMIT_SWITCH_UP_PORT, &GPIO_InitStructure);

//DOWN配置

GPIO_InitStructure.GPIO_Pin = GUA_LIMIT_SWITCH_DOWN_PIN; 

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; 

GPIO_Init(GUA_LIMIT_SWITCH_DOWN_PORT, &GPIO_InitStructure);

}

 

//******************************************************************************            

//name:             GUA_Limit_Switch_Exti_Init           

//introduce:        限位开关的IO中断初始化         

//parameter:        none                 

//return:           none         

//author:           甜甜的大香瓜                 

//email:            897503845@qq.com     

//QQ group          香瓜单片机之STM8/STM32(164311667)                  

//changetime:       2016.12.28                     

//****************************************************************************** 

static void GUA_Limit_Switch_Exti_Init(void)

{

EXTI_InitTypeDef EXTI_InitStructure;

 

//UP中断配置

EXTI_ClearITPendingBit(EXTI_Line1);

GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource1);  

 

EXTI_InitStructure.EXTI_Line = EXTI_Line1;

EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;  

EXTI_InitStructure.EXTI_LineCmd = ENABLE;

EXTI_Init(&EXTI_InitStructure);

//DOWN中断配置

EXTI_ClearITPendingBit(EXTI_Line4);

GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource4);  

 

EXTI_InitStructure.EXTI_Line = EXTI_Line4;

EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;  

EXTI_InitStructure.EXTI_LineCmd = ENABLE;

EXTI_Init(&EXTI_InitStructure);

}

 

//******************************************************************************        

//name:             GUA_Limit_Switch_Check_Pin        

//introduce:        限位开关检测触发状态    

//parameter:        nGUA_Limit_Switch_Status:GUA_LIMIT_SWITCH_STATUS_UP or GUA_LIMIT_SWITCH_STATUS_DOWN       

//return:           GUA_LIMIT_SWITCH_STATUS_IDLE or GUA_LIMIT_SWITCH_STATUS_TRIGGER      

//author:           甜甜的大香瓜             

//QQ group          香瓜单片机之STM8/STM32(164311667)                      

//changetime:       2016.12.28                     

//******************************************************************************   

GUA_U8 GUA_Limit_Switch_Check_Pin(GUA_U8 nGUA_Limit_Switch_Status)    

{    

  //UP限位开关

  if(nGUA_Limit_Switch_Status == GUA_LIMIT_SWITCH_STATUS_UP)

  {

    //没触发

    if(GPIO_ReadInputDataBit(GUA_LIMIT_SWITCH_UP_PORT, GUA_LIMIT_SWITCH_UP_PIN) == Bit_SET) 

    {

      return GUA_LIMIT_SWITCH_STATUS_IDLE;

    }

    //触发

    else

    {

      return GUA_LIMIT_SWITCH_STATUS_TRIGGER;    

    }  

  }

  //DOWN限位开关

  else

  {

    //没触发

    if(GPIO_ReadInputDataBit(GUA_LIMIT_SWITCH_DOWN_PORT, GUA_LIMIT_SWITCH_DOWN_PIN) == Bit_SET) 

    {

      return GUA_LIMIT_SWITCH_STATUS_IDLE;

    }

    //触发

    else

    {

      return GUA_LIMIT_SWITCH_STATUS_TRIGGER;    

    }    

  }  

 

//******************************************************************************        

//name:             GUA_Limit_Switch_Init        

//introduce:        限位开关初始化     

//parameter:        none       

//return:           none      

//author:           甜甜的大香瓜             

//email:            897503845@qq.com           

//QQ group          香瓜单片机之STM8/STM32(164311667)                      

//changetime:       2016.12.28                     

//****************************************************************************** 

void GUA_Limit_Switch_Init(void)

{

  //初始化IO

  GUA_Limit_Switch_IO_Init();

  //初始化IO的中断配置

  GUA_Limit_Switch_Exti_Init();

}


2)编写驱动头文件GUA_Limit_Switch.h


关键字:STM32  限位开关  库版本 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机电子密码锁仿真 可修改密码