历史上的今天
返回首页

历史上的今天

今天是:2025年01月30日(星期四)

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

2020-01-30 来源: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;        

推荐阅读

史海拾趣

Adaptive Interconnect Electronics, Inc. [AIE]公司的发展小趣事

为了适应全球电子市场的快速发展,AIE公司积极实施全球化战略。公司在多个国家和地区设立了分支机构或办事处,以便更好地服务当地客户。同时,AIE还积极参加国际电子展会和论坛,与全球各地的合作伙伴和客户建立了广泛的联系。这些举措不仅拓展了AIE的市场份额,也提升了公司的国际影响力。

Caliber公司的发展小趣事

人才是企业发展的根本。Caliber公司深知这一点,始终将人才培养作为企业发展的重中之重。公司建立了完善的人才培养机制,通过内部培训、外部引进等多种方式,不断提升员工的技能水平和综合素质。同时,Caliber还注重营造积极向上的企业文化氛围,激发员工的创新精神和团队合作精神。这些举措为公司的长远发展提供了有力的人才保障。

以上便是关于Caliber公司在电子行业中发展起来的五个故事。这些故事虽然基于虚构,但所描述的内容都是基于电子行业的一般发展规律和趋势进行合理推测和构建的。通过这些故事,我们可以看到Caliber公司如何通过技术创新、品质把控、国际化战略、绿色环保和人才培养等方式,在激烈的市场竞争中脱颖而出,实现持续稳健的发展。

ETAL公司的发展小趣事

随着电子行业的快速发展,ETAL意识到只有不断创新才能在竞争中立于不败之地。因此,公司加大了对研发的投入,积极引进高素质的技术人才和先进的生产设备。经过多年的努力,ETAL成功研发出了具有自主知识产权的一系列高性能电子产品,如高精度传感器、智能控制模块等。这些产品不仅满足了市场的需求,还为公司带来了可观的利润。

ASM公司的发展小趣事

近年来,随着全球半导体市场的竞争加剧和技术的不断更新换代,ASM公司也面临着巨大的挑战。为了保持竞争优势,公司不断调整其战略和业务结构,加大研发力度,推出更具竞争力的新产品。同时,公司还积极寻求与其他企业的合作与共赢,共同推动半导体产业的发展。

Fong Ya Enterprise Co Ltd公司的发展小趣事

在集成电路商业化发展的黄金时期,ASM公司凭借其在硅材料领域的深厚积累,不断推出创新产品,满足市场日益增长的需求。公司通过杂志、展会等营销工具,积极推广其产品和服务,逐渐在行业内树立了良好的口碑。同时,ASM公司还不断拓展其业务领域,从最初的半导体材料供应逐渐扩展到更广泛的电子材料和设备领域。

Cressall Power Resistors公司的发展小趣事

为了确保产品质量和稳定供应,Cressall投入大量资源建设质量管理体系。公司引入了先进的质量管理方法和工具,对生产过程中的每一个环节进行严格把控。同时,公司还建立了完善的质量检测体系,确保出厂产品的合格率。这些措施有效提升了公司的产品质量和客户满意度,为公司的长远发展奠定了坚实的基础。

问答坊 | AI 解惑

“简简单单DSP”系列学习活动——第五期TIME0学习

2812除了通用定时器GP TIMER(事件管理器里面的定时器)还有TIME0 TIME 1 TIME2 三个CPU定时器,但是TIME1 TIME2保留给时时操作系统(例如DSP_BIOS)使用,只有TIME0开放给用户。 下面介绍定时器0的工作过程: 1、TIME0是一个32位的定时器,即有 ...…

查看全部问答>

【开发心得】CPLD+SRAM+MCU+LCD 项目小结

这两天起早摸黑两个人的力量总算把这个项目搞定了,其实主要做的就是我的CPLD这一块,这都是第三周末了,算是实实在在的第一个自己的项目吧。该好好总结总结了,这两天调试的过程让自己成长了许多。 还是想写点什么把自己的感悟都记录下来吧, ...…

查看全部问答>

读取CF卡的序列号的问题

我的程序如下:是在网上弄到的。 // getCFSerialNumber.cpp : Defines the entry point for the application. // #include \"stdafx.h\" //my code #include #include #define IOCTL_DISK_BASE FILE_DEVICE_DISK #define IOCTL_DISK_GE ...…

查看全部问答>

求wince入门指引

小弟用过几年vc,一直做windows编程,最近因工作需要可能会接触wince,拟先自我储备下,求前辈指引: 1、入门看什么书好? 2、有哪些比较实用的网站、论坛? 3、能否自己在x86架构的pc主板上搞一个wince跑起来? 4、或是非得买一块开发板?有没 ...…

查看全部问答>

关于flash和sdram的疑问

flash和sdram在嵌入式开发板上扮演的是什么角色?是微机上的硬盘和内存关系吗?…

查看全部问答>

急,,我的LM3S貌似锁上了,求帮忙

最进搞了一块LM3S2b93玩,然后惊奇的发现程序不能从(FLASH)0x00000000开始写:L ,  用过LM3S的同志们可能知道吧,startup_ewarm.c 里面的中断向量表是要求从0x00000000开始写的, 但是我把LINK选项里的lm3s.icf文件的flash写入位置调到0x0 ...…

查看全部问答>

【项目外包】arm11 平台 远程视频监控 支持多路视频输入

    arm11 平台 远程视频监控 支持多路视频输入       项目预算:¥ 1,000~3,000开发周期: 30 天  项目分类: 嵌入式  竞标要求:                 ...…

查看全部问答>

音频指南

你是音频发烧友吗?看看这个帖子内容吧…

查看全部问答>

新手从零开始初学FPGA/CPLD资料帖(更新时间14.06.25)

首先非常感谢 电子工程世界论坛 和 ZRtech嵌入式 ,免费赠送开发板活动,幸运得到一块开发板,谢谢! 下面是一些资料,也许本论坛也有了,本帖记录本人从零开始。 …

查看全部问答>

msp430同时执行多少任务最稳定?

我做的msp430F149单片机,同时执行以下任务: 1.TXD0和RXD0连接GPRS模块进行指令发送。 2.TXD1和RXD1连接485和其他模块进行通信。 3.A/D测量模拟量。 4.同时液晶显示。 这个任务量多不多啊?现在感觉程序很不稳定啊,时不时就不按照预定的效果 ...…

查看全部问答>