【STM32】STM32之霍爾傳感器模塊

本篇博文最後修改時間:2017年03月06日,23:50。
java


1、簡介app

本文介紹如何在STM32上使用霍爾傳感器模塊函數


2、實驗平臺測試

庫版本:STM32F10x_StdPeriph_Lib_V3.5.0spa

編譯軟件:MDK4.53.net

硬件平臺:STM32開發板(主芯片stm32f103c8t6)3d

仿真器:JLINKcode


版權聲明blog

博主:甜甜的大香瓜ip

聲明:喝水不忘挖井人,轉載請註明出處。

原文地址:http://blog.csdn.NET/feilusia

聯繫方式:897503845@qq.com

香瓜BLE之CC2541羣:127442605

香瓜BLE之CC2640羣:557278427

香瓜BLE之Android羣:541462902

香瓜單片機之STM8/STM32羣:164311667
甜甜的大香瓜的小店(淘寶店):https://shop217632629.taobao.com/?spm=2013.1.1000126.d21.hd2o8i

4、 實驗前提
一、在進行本文步驟前,請先 閱讀 如下博文:
暫無

二、在進行本文步驟前,請先 實現如下博文:

暫無


5、基礎知識

一、霍爾傳感器是什麼?

答:霍爾傳感器是根據霍爾效應制做的一種磁場傳感器

用磁鐵去靠近霍爾傳感器時,霍爾傳感器的引腳電平會產生變化。


二、霍爾傳感器主要用在什麼地方?

答:霍爾傳感器可測速、計數、限位上。

舉例限位功能:兩個霍爾傳感器造成45°的夾角,電機邊緣粘着一個磁鐵,一旦電機轉動致使磁鐵觸發任意其中一個霍爾傳感器,則STM32檢測到觸發後馬上中止電機,不能再繼續往此方向轉動。以此達到限制電機轉動角度的做用。


三、本文使用的是什麼霍爾傳感器模塊

答:


香瓜買的霍爾傳感器模塊一共有四個引腳,GND、VCC、D0、A0。

其中只須要用到三根線,GND、VCC、D0。(A0不知作啥用的,計數?)

使用方法:

1)5V供電。

2)用跳線鏈接D0和STM32的IO口(本文鏈接的是PA11)。

3)D0默認是高電平,但磁鐵的特定一面(磁鐵另外一面無用)去靠近霍爾傳感器模塊時,D0會被拉低。


四、霍爾傳感器與限位開關有什麼區別?

答:

1)限位開關

①優勢:無功耗。

②缺點:易損壞。


2)霍爾傳感器

①優勢:不易損壞。

②缺點:有功耗。


6、實驗步驟

一、編寫並添加霍爾傳感器驅動

1)編寫驅動GUA_Hall_Sensor.c(存放在「……\HARDWARE」)

//******************************************************************************              
//name:             GUA_Hall_Sensor.c             
//introduce:        霍爾傳感器驅動      
//author:           甜甜的大香瓜                     
//email:            897503845@qq.com     
//QQ group          香瓜單片機之STM8/STM32(164311667)                  
//changetime:       2017.03.06                     
//******************************************************************************
#include "stm32f10x.h" 
#include "GUA_Hall_Sensor.h"

/*********************宏定義************************/
//霍爾傳感器引腳
#define GUA_HALL_SENSOR_PORT               GPIOA
#define GUA_HALL_SENSOR_PIN                GPIO_Pin_11

//消抖總次數
#define GUA_HALL_SENSOR_DISAPPERAS_SHAKS_COUNT      500000
/*********************內部變量************************/
static GUA_U32 sGUA_Hall_Sensor_DisapperasShakes_IdleCount = 0;			//消抖時的空閒狀態計數值
static GUA_U32 sGUA_Hall_Sensor_DisapperasShakes_TriggerCount = 0;	//消抖時的觸發狀態計數值

/*********************內部函數************************/ 
static void GUA_Hall_Sensor_IO_Init(void);

//******************************************************************************            
//name:             GUA_Hall_Sensor_IO_Init           
//introduce:        霍爾傳感器的IO初始化         
//parameter:        none                 
//return:           none         
//author:           甜甜的大香瓜                 
//email:            897503845@qq.com     
//QQ group          香瓜單片機之STM8/STM32(164311667)                  
//changetime:       2017.03.06                     
//******************************************************************************
static void GUA_Hall_Sensor_IO_Init(void)
{	
	//IO結構體
	GPIO_InitTypeDef GPIO_InitStructure;
		
	//時鐘使能
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); 	
	
	//霍爾IO配置
	GPIO_InitStructure.GPIO_Pin = GUA_HALL_SENSOR_PIN;  		
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; 
	GPIO_Init(GUA_HALL_SENSOR_PORT, &GPIO_InitStructure);	
}

//******************************************************************************        
//name:             GUA_Hall_Sensor_Check_Pin        
//introduce:        霍爾傳感器檢測觸發狀態     
//parameter:        none       
//return:           GUA_HALL_SENSOR_STATUS_IDLE or GUA_HALL_SENSOR_STATUS_TRIGGER     
//author:           甜甜的大香瓜             
//email:            897503845@qq.com     
//QQ group          香瓜單片機之STM8/STM32(164311667)                  
//changetime:       2017.03.06                     
//******************************************************************************  
GUA_U8 GUA_Hall_Sensor_Check_Pin(void)    
{    
  //沒觸發
  if(GPIO_ReadInputDataBit(GUA_HALL_SENSOR_PORT, GUA_HALL_SENSOR_PIN) == SET) 
  {
    //計數
    sGUA_Hall_Sensor_DisapperasShakes_IdleCount++;
    sGUA_Hall_Sensor_DisapperasShakes_TriggerCount = 0;
    
    //判斷計數是否足夠
    if(sGUA_Hall_Sensor_DisapperasShakes_IdleCount >= GUA_HALL_SENSOR_DISAPPERAS_SHAKS_COUNT)
    {
      return GUA_HALL_SENSOR_STATUS_IDLE;    
    }
  }
  //觸發
  else
  {
    //計數
    sGUA_Hall_Sensor_DisapperasShakes_IdleCount = 0;
    sGUA_Hall_Sensor_DisapperasShakes_TriggerCount++;
    
    //判斷計數是否足夠
    if(sGUA_Hall_Sensor_DisapperasShakes_TriggerCount >= GUA_HALL_SENSOR_DISAPPERAS_SHAKS_COUNT)
    {
      return GUA_HALL_SENSOR_STATUS_TRIGGER;    
    }    
  }  
  
  return GUA_HALL_SENSOR_STATUS_DISAPPERAS_SHAKS;  
} 

//******************************************************************************        
//name:             GUA_Limit_Switch_Init        
//introduce:        霍爾傳感器初始化     
//parameter:        none       
//return:           none      
//author:           甜甜的大香瓜             
//email:            897503845@qq.com     
//QQ group          香瓜單片機之STM8/STM32(164311667)                  
//changetime:       2017.03.06                     
//****************************************************************************** 
void GUA_Hall_Sensor_Init(void)
{
  //初始化IO
  GUA_Hall_Sensor_IO_Init();	  
}

2) 編寫驅動頭文件GUA_ Hall_Sensor.h(存放在「 …… \HARDWARE 」)
//******************************************************************************              
//name:             GUA_Hall_Sensor.h             
//introduce:        霍爾傳感器驅動的頭文件      
//author:           甜甜的大香瓜                     
//email:            897503845@qq.com         
//QQ group          香瓜單片機之STM8/STM32(164311667)                      
//changetime:       2017.03.06                     
//****************************************************************************** 
#ifndef _GUA_HALL_SENSOR_H_
#define _GUA_HALL_SENSOR_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_HALL_SENSOR_STATUS_TRIGGER                      0		//霍爾傳感器觸發
#define GUA_HALL_SENSOR_STATUS_IDLE                         1		//霍爾傳感器沒觸發
#define GUA_HALL_SENSOR_STATUS_DISAPPERAS_SHAKS             2		//霍爾傳感器消抖中

/*********************外部函數聲明************************/ 
GUA_U8 GUA_Hall_Sensor_Check_Pin(void);  
void GUA_Hall_Sensor_Init(void);

#endif

3) 工程中添加GUA_Hall_Sensor.c



4)在MDK設置中添加串口驅動源文件路徑



二、在應用層中調用

1)添加驅動頭文件(main.c中)

#include "GUA_Hall_Sensor.h"

2) 添加驅動初始化代碼(main.c的main函數中)

//霍爾傳感器初始化
  GUA_Hall_Sensor_Init();

3) 添加測試代碼

①寫測試代碼main.c中

static void GUA_Test(void)
{   
  U8 nGUA_Ret = 0;
  U8 nGUA_Stop = 0;
	
  while(1)
  {
		//檢測霍爾當前狀態
		nGUA_Ret = GUA_Hall_Sensor_Check_Pin();
		
		//檢測到霍爾被觸發
		if(nGUA_Ret == GUA_HALL_SENSOR_STATUS_TRIGGER)
		{
			nGUA_Stop = 1;
		} 
}

②調用測試代碼 main.c的main函數中

//測試代碼
	GUA_Test();

7、注意事項

暫無。


8、實驗結果

仿真並設置斷點在測試代碼的「nGUA_Stop = 1;」中,全速運行。

用磁鐵去靠近模塊上的霍爾傳感器芯片,模塊上的led被點亮表示觸發,同時工程中消抖以後會中止在斷點處,表示檢測到PA11處的霍爾傳感器觸發致使的低電平。以下圖


所以實驗成功。