历史上的今天
返回首页

历史上的今天

今天是:2025年01月29日(星期三)

2020年01月29日 | STM32之限位开关

2020-01-29 来源:eefocus

一、简介


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


二、实验平台


库版本:STM32F10x_StdPeriph_Lib_V3.5.0


编译软件:MDK4.53


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


仿真器:JLINK


三、版权声明


四、实验前提


在进行本文步骤前,请先阅读并实现以下博文:


1、《STM32之NVIC》:http://blog.csdn.net/feilusia/article/details/52819709


五、基础知识

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(存放在“……HARDWARE”)

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

//name:             GUA_Limit_Switch.h             

//introduce:        限位开关驱动头文件      

//author:           甜甜的大香瓜                     

//email:            897503845@qq.com         

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

//changetime:       2016.12.28                     

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

#ifndef _GUA_LIMIT_SWITCH_H_

#define _GUA_LIMIT_SWITCH_H_

 

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

#ifndef GUA_U8        

typedef unsigned char GUA_U8;        

推荐阅读

史海拾趣

Codeco Corporation Of Vermont公司的发展小趣事

随着电子行业的快速发展和变革,Codeco面临着新的挑战和机遇。为了应对这些变革,公司及时调整战略,加大在人工智能、物联网等领域的投入。通过与高校、研究机构的合作,Codeco不断吸收新的技术和理念,推出了一系列符合市场需求的创新产品。这些举措使得Codeco在行业中保持了领先地位。

CMOSIS公司的发展小趣事

随着CMOS图像传感器在智能手机、安防监控、汽车等领域的广泛应用,CMOSIS公司看到了巨大的市场潜力。公司加大了市场拓展力度,不仅在国内市场取得了显著成绩,还积极开拓海外市场。同时,公司注重品牌建设,通过提升产品质量、加强售后服务等方式,树立了良好的企业形象和口碑。

Hei Inc Optoelectronic Division公司的发展小趣事
市场上存在多种数字定时器芯片,它们具有高精度、可编程性强等优点。通过配置定时器芯片的参数,可以方便地实现定时加热功能,并可以根据需要进行调整。
Advanced Ceramic X Corporation公司的发展小趣事
通过电阻和电容组成的充放电电路来实现定时功能。当控制信号到来时,电容开始充电或放电,当电容电压达到某一阈值时,触发可控硅等电子开关元件的通断,从而实现定时加热。
格瑞宝(GP)公司的发展小趣事

格瑞宝公司致力于功率器件的研发与销售,其产品线不断丰富和完善。从最初的MOSFET产品系列,到后来逐渐扩展到DIODE、BJT、IC集成电路等多个领域,格瑞宝始终坚持技术创新,不断推出符合市场需求的新产品。特别是在SGT MOST工艺方面,格瑞宝达到了国内领先水平,这一技术突破不仅提升了产品的性能和质量,也进一步巩固了公司在行业内的地位。

Babcock Inc公司的发展小趣事

随着技术的不断积累,Babcock开始将研发重点转向市场需求旺盛的产品领域。通过深入分析市场趋势和客户需求,公司成功推出了一系列具有创新性和竞争力的电子产品。这些产品不仅性能卓越,而且设计新颖,很快便赢得了市场的广泛认可,为公司带来了可观的收益。

问答坊 | AI 解惑

2010.1期的<<无线电>>有魏坤的新文章

RT, 有兴趣的,可以买来看下啊,呵呵…

查看全部问答>

PB在编译时会编译PUBLIC下的源代码吗?

PB在编译NK的时候会编译PUBLIC下的内容吗,如果不编译,那些自带的DLL之类的东西又是什么地方来的呢 谢谢…

查看全部问答>

1602不显示是什么原因?

小弟是菜鸟初学单片机,写了个1602的程序可是不能用,于是借用别人写好的程序(那个人的程序可以用),可是载到我的单片机里面就不能用,1602就第一行全部显示方块,第二行空白,这是什么原因,哪位高手可以点拨点拨小弟,小弟感激不尽。…

查看全部问答>

关于EVC中显示中文的问题

我有两个EVC工程,在一个中我在静态文本框中输入中文就可以显示,可在另一个工程中也是静态文本框可中文就是乱码,请问各位大侠是怎么回事了。是不是少按了啥东西哟。还是要在那设置哟,小女子先谢谢各位大侠了哟,…

查看全部问答>

keil+ulink是否可以调试CortexSTM32的CPU

                                  …

查看全部问答>

STM32与ARM的关系?

                                 STM32与平常说的ARM到底是怎么样的关系?求解释…

查看全部问答>

我对FPGA设计的一些想法

  去年开始接触EDA至今,我依然感觉自己还在FPGA的门外。我自己对EDA很感兴趣,学习之路不易。经过一段时间的学习,我发现EDA的关键不是用HDL设计而是用HDL描述。   HDL的全称是硬件描述(describe)语言而不是硬件设计(design)语言! ...…

查看全部问答>

基于msp430x15x的多路温度采集怎样实现

采用DS18B20温度传感器     之前用一片传感器采集的温度,并显示在1602上。现在想用多片传感器不知道怎么实现  请大家指导一下  不胜感激。 这里有采集一路温度的程序 [ 本帖最后由 泡泡鱼会飞 于 2012-1 ...…

查看全部问答>

经常发现运放电源与输出之间加二极管,求解

如此图,两个二极管是什么用处呢?欢迎大家广泛讨论该电路…

查看全部问答>