历史上的今天
今天是: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;
史海拾趣
|
2812除了通用定时器GP TIMER(事件管理器里面的定时器)还有TIME0 TIME 1 TIME2 三个CPU定时器,但是TIME1 TIME2保留给时时操作系统(例如DSP_BIOS)使用,只有TIME0开放给用户。 下面介绍定时器0的工作过程: 1、TIME0是一个32位的定时器,即有 ...… 查看全部问答> |
|
这两天起早摸黑两个人的力量总算把这个项目搞定了,其实主要做的就是我的CPLD这一块,这都是第三周末了,算是实实在在的第一个自己的项目吧。该好好总结总结了,这两天调试的过程让自己成长了许多。 还是想写点什么把自己的感悟都记录下来吧, ...… 查看全部问答> |
|
我的程序如下:是在网上弄到的。 // 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 ...… 查看全部问答> |
|
小弟用过几年vc,一直做windows编程,最近因工作需要可能会接触wince,拟先自我储备下,求前辈指引: 1、入门看什么书好? 2、有哪些比较实用的网站、论坛? 3、能否自己在x86架构的pc主板上搞一个wince跑起来? 4、或是非得买一块开发板?有没 ...… 查看全部问答> |
|
最进搞了一块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嵌入式 ,免费赠送开发板活动,幸运得到一块开发板,谢谢! 下面是一些资料,也许本论坛也有了,本帖记录本人从零开始。 … 查看全部问答> |
|
我做的msp430F149单片机,同时执行以下任务: 1.TXD0和RXD0连接GPRS模块进行指令发送。 2.TXD1和RXD1连接485和其他模块进行通信。 3.A/D测量模拟量。 4.同时液晶显示。 这个任务量多不多啊?现在感觉程序很不稳定啊,时不时就不按照预定的效果 ...… 查看全部问答> |




