1. 程式人生 > >【STM32】STM32之限位開關

【STM32】STM32之限位開關

五、基礎知識

1、限位開關是什麼?

答:限位開關其實就是會復原開關的開關按鍵。

也就是說按下限位開關的開關能觸發STM32的IO中斷,而鬆開手指時限位開關會復原

2、限位開關有什麼用?

答:通常被用於限制電機轉動角度來使用。

例如兩個限位開關形成45°的夾角,一旦電機轉動觸發任意其中一個限位開關,STM32檢測到限位開關的中斷則停止電機,不能再繼續往此方向轉動。

3、限位開關有什麼優缺點?

答:限位開關的優點是以物理的方式觸發微控制器中斷,因此不增加功耗。缺點是經常使用的話限位開關易損壞。

4、限位開關在軟體上應如何開發?

答:由於限位開關通常是兩個,因此按照普通按鍵的形式寫兩個按鍵,在按鍵中斷中做停止電機等處理即可。

六、實驗步驟

1、編寫並新增限位開關驅動

1)編寫驅動GUA_Limit_Switch.c(存放在“……\HARDWARE”)

//******************************************************************************              
//name:             GUA_Limit_Switch.c             
//introduce:        限位開關驅動      
//author:           甜甜的大香瓜                     
//email:            
[email protected]
//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:
[email protected]
//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: [email protected] //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: [email protected] //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:            [email protected]         
//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;        
#endif    

#ifndef GUA_8        
typedef signed char GUA_8;        
#endif      
      
#ifndef GUA_U16        
typedef unsigned short GUA_U16;        
#endif 

#ifndef GUA_16        
typedef signed short GUA_16;        
#endif         
      
#ifndef GUA_U32        
typedef unsigned long GUA_U32;        
#endif 

#ifndef GUA_32        
typedef signed long GUA_32;       
#endif

#ifndef GUA_U64    
typedef unsigned long long GUA_U64;  
#endif

#ifndef GUA_64    
typedef signed long long GUA_64;  
#endif

//可讀的限位開關
#define GUA_LIMIT_SWITCH_STATUS_UP                    0            //UP限位開關
#define GUA_LIMIT_SWITCH_STATUS_DOWN                  1            //DWON限位開關

//限位開關的觸發狀態
#define GUA_LIMIT_SWITCH_STATUS_TRIGGER               0            //限位開關觸發
#define GUA_LIMIT_SWITCH_STATUS_IDLE                  1            //D位開關沒觸發

/*********************外部函式宣告************************/ 
GUA_U8 GUA_Limit_Switch_Check_Pin(GUA_U8 nGUA_Limit_Switch_Status);  
void GUA_Limit_Switch_Init(void);

#endif

3)工程中新增GUA_Limit_Switch.c

4)在MDK設定中新增串列埠驅動原始檔路徑


2、設定NVIC中斷優先順序(GUA_NVIC.c的GUA_NVIC_Init中

	//限位開關UP鍵
	GUA_NVIC_Config(NVIC_PriorityGroup_2, EXTI1_IRQn, 1, 0, ENABLE);	

	//限位開關DOWN鍵
	GUA_NVIC_Config(NVIC_PriorityGroup_2, EXTI4_IRQn, 1, 1, ENABLE);	

3、寫中斷服務函式(stm32f10x_it.c中)

1)寫中斷服務函式

//******************************************************************************            
//name:             EXTI1_IRQHandler           
//introduce:        中斷服務函式         
//parameter:        none                 
//return:           none         
//author:           甜甜的大香瓜                 
//email:            [email protected]     
//QQ group          香瓜微控制器之STM8/STM32(164311667)                  
//changetime:       2016.10.19                     
//******************************************************************************
void EXTI1_IRQHandler(void)
{
  if(EXTI_GetITStatus(EXTI_Line1) == SET)
  {
		/*
		//Up鍵,反轉才停止
		if(stMotor_Config_2.DirectionSteps < 0)
		{
			stMotor_Config_2.Status = MOTOR_CONFIG_STATUS_IDLE;       //電機Y停止   
		}
    */
    //清除標誌位  
    EXTI_ClearITPendingBit(EXTI_Line1);
  }
}

//******************************************************************************            
//name:             EXTI4_IRQHandler           
//introduce:        中斷服務函式         
//parameter:        none                 
//return:           none         
//author:           甜甜的大香瓜                 
//email:            [email protected]     
//QQ group          香瓜微控制器之STM8/STM32(164311667)                  
//changetime:       2016.10.19                     
//******************************************************************************
void EXTI4_IRQHandler(void)
{
  if(EXTI_GetITStatus(EXTI_Line4) == SET)
  {
		/*
		//Down鍵,正轉才停止  
		if(stMotor_Config_2.DirectionSteps > 0)
		{
			stMotor_Config_2.Status = MOTOR_CONFIG_STATUS_IDLE;       //電機Y停止   
		}
    */
    //清除標誌位  
    EXTI_ClearITPendingBit(EXTI_Line4);
  }
}
這裡分別寫了兩個限位開關,並且簡單舉例限制電機。

4、在應用層中呼叫

1)新增驅動標頭檔案(main.c中)

#include "GUA_Limit_Switch.h"

2)新增驅動初始化程式碼(main.c的main函式中)
  //限位開關初始化
  GUA_Limit_Switch_Init();

七、實驗結果

模擬並設定斷點在兩個限位開關的中斷服務函式中,全速執行後分別按下限位開關,可分別進中斷服務函式。

因此實驗成功。

相關推薦

STM32STM32開關

五、基礎知識 1、限位開關是什麼? 答:限位開關其實就是會復原開關的開關按鍵。 也就是說按下限位開關的開關能觸發STM32的IO中斷,而鬆開手指時限位開關會復原。 2、限位開關有什麼用? 答:通常被用於限制電機轉動角度來使用。 例如兩個限位開關形成45°的夾角,一旦電機轉動觸發任意其中一個限

STM32STM32timer3產生PWM

//****************************************************************************** //name: GUA_Timer3_PWM.c

記錄STM32學習第一個程式(點亮LED)

STM32學習之第一個程式(點亮LED) 開發板:Nucelo L053R8 芯 片:STM32L053R8 軟 件:IAR for ARM 7.4, STM32CubeL0 程式碼示例

STM32STM32電量採集

//****************************************************************************** //name: GUA_ADC1.c //introduce:

STM32STM32藍芽透傳模組(昇潤科技HY-254124 V8)

//****************************************************************************** //name: BLE_Uart.c //introduce: 藍芽串

STM32STM32霍爾感測器模組

1、霍爾感測器是什麼? 答:霍爾感測器是根據霍爾效應制作的一種磁場感測器。 用磁鐵去靠近霍爾感測器時,霍爾感測器的引腳電平會產生變化。 2、霍爾感測器主要用在什麼地方? 答:霍爾感測器可測速、計數、限位上。 舉例限位功能:兩個霍爾感測器形成45°的夾角,電機邊緣粘著一個磁鐵,一旦電機轉動導致

DebugSTM32 HardFault_Handler 故障

          3、還是將中斷函式修改,列印中斷時的一些資訊: HardFault_Hander()定義如下: void HardFault_Handler(void) {   uint

C++C++運算子

位運算子 位運算子作用於位,並逐位執行操作。&、 | 和 ^ 的真值表如下所示: p q p&q p|q p^q 0 0 0

STM32STM32啟動方式

在少量晶片程式下載時,用JLINK或SWD的下載方式比較繁瑣,串列埠下載配合正點原子的FLYMCU比較快捷,STM32的串列埠下載時候需要注意MCU的啟動方式。在復位時,會按照boot的狀態判斷進入哪種模式,boot腳不用保持長狀態。在根據STM407參考手冊來看,STM32

STM32STM32 MCU系列介紹

STM32-32 微控制器(MCU)家族 系列 MCU 主流級別MCU STM32 F0系列-ARM Cortex-M0入門級MCU STM32 F1系列-A

notestm32 keilMDK出現warning: function XX declared implicitly

warning: #223-D: function "CLR_TX_DATA" declared implicitly 解決方法。 以上面錯誤提示為例:  1  找到定義函式 CLR_TX_DATA() 的原始檔 ,這裡假設在 a.c  中;   2  在 a.h

STM32STM32埠複用和重對映(AFIO輔助功能時鐘)

STM32F1xx官方資料:《STM32中文參考手冊V10》-第8章通用和複用功能IO(GPIO和AFIO)埠複用功能埠複用的定義STM32有許多的內建外設(如串列埠、ADC、DCA等等),這些外設的外部引腳都是和GPIO複用的。也就是說,一個GPIO如果可以複用為內建外設的

linuxcp/scp命令+scp命令詳解

特殊 是否 用戶登錄 usr 指定 highlight 顯示 檔案 三種 linux之cp/scp命令+scp命令詳解 名稱:cp 使用權限:所有使用者 使用方式: cp [options] source dest cp [options] source

c#繼承

none 實現 void 運算符重載 調用方法 需要 strong 靜態 顯式 一.繼承的類型   在面向對象的編程中,有兩種截然不同繼承類型:實現繼承和接口繼承   1.實現繼承和接口繼承   *實現繼承:表示一個類型派生於基類型,它擁有該基類型的所有成員字段和函

C#集合

tab 並發集合 get spa style con 都在 src 字典  數組(http://www.cnblogs.com/afei-24/p/6738128.html)的大小是固定的。如果元素的個數是動態的,就應使用集合類。     列表(http://www.cn

SpringSpringMVC異常處理

存儲 targe 存在 cnblogs del file 處理機制 href click java中的異常分為兩類,一種是運行時異常,一種是非運行時異常。在JavaSE中,運行時異常都是通過try{}catch{}捕獲的,這種只能捕獲顯示的異常,通常項目上拋出的異常都是不可

SpringSpringMVC攔截器

https javax request orm bin 支持 exceptio 賬號 intern Spring的HandlerMapping處理器支持攔截器應用。當需要為某些請求提供特殊功能時,例如實現對用戶進行身份認證、登錄檢查等功能。 攔截器必須實現HandlerI

SpringSpringMVCREST編程風格

data springmvc 4.0 gen rip servle truct -name insert REST架構是一個抽象的概念,目前主要是基於HTTP協議實現,其目的是為了提高系統的可伸縮性、降低應用之間的耦合度、便於架構分布式處理程序。 在URL中設置使用

22Vue Vue Devtools

rom 創建 png ins -c 擴展程序 安裝 搜索 項目 vue安裝: # 最新穩定版 $ npm install vue # 全局安裝 vue-cli $ npm install --global vue-cli # 創建一個基於 webpack 模板的新項目 $

轉載linuxsed用法

span 變量 常用 tdi 選擇 包括 div 輸入 記得 linux之sed用法 原文地址:http://www.cnblogs.com/dong008259/archive/2011/12/07/2279897.html sed是一個很好的文件處理工具,本身是