【STM32】STM32之霍尔传感器模块

本篇博文最后修改时间:2017年03月06日,23:50。


一、简介

本文介绍如何在STM32上使用霍尔传感器模块


二、实验平台

库版本:STM32F10x_StdPeriph_Lib_V3.5.0

编译软件:MDK4.53

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

仿真器:JLINK


版权声明

博主:甜甜的大香瓜

声明:喝水不忘挖井人,转载请注明出处。

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

联系方式:[email protected]

香瓜BLE之CC2541群:127442605

香瓜BLE之CC2640群:557278427

香瓜BLE之Android群:541462902

香瓜单片机之STM8/STM32群:164311667
甜甜的大香瓜的小店(淘宝店):https://shop217632629.taobao.com/?spm=2013.1.1000126.d21.hd2o8i

四、 实验前提
1、在进行本文步骤前,请先 阅读 以下博文:
暂无

2、在进行本文步骤前,请先 实现以下博文:

暂无


五、基础知识

1、霍尔传感器是什么?

答:霍尔传感器是根据霍尔效应制作的一种磁场传感器

用磁铁去靠近霍尔传感器时,霍尔传感器的引脚电平会产生变化。


2、霍尔传感器主要用在什么地方?

答:霍尔传感器可测速、计数、限位上。

举例限位功能:两个霍尔传感器形成45°的夹角,电机边缘粘着一个磁铁,一旦电机转动导致磁铁触发任意其中一个霍尔传感器,则STM32检测到触发后立刻停止电机,不能再继续往此方向转动。以此达到限制电机转动角度的作用。


3、本文使用的是什么霍尔传感器模块

答:

【STM32】STM32之霍尔传感器模块_第1张图片

香瓜买的霍尔传感器模块一共有四个引脚,GND、VCC、D0、A0。

其中只需要用到三根线,GND、VCC、D0。(A0不知做啥用的,计数?)

使用方法:

1)5V供电。

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

3)D0默认是高电平,但磁铁的特定一面(磁铁另一面无用)去靠近霍尔传感器模块时,D0会被拉低。


4、霍尔传感器与限位开关有什么区别?

答:

1)限位开关

①优点:无功耗。

②缺点:易损坏。


2)霍尔传感器

①优点:不易损坏。

②缺点:有功耗。


六、实验步骤

1、编写并添加霍尔传感器驱动

1)编写驱动GUA_Hall_Sensor.c(存放在“……\HARDWARE”)

//******************************************************************************              
//name:             GUA_Hall_Sensor.c             
//introduce:        霍尔传感器驱动      
//author:           甜甜的大香瓜                     
//email:            [email protected]     
//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:            [email protected]     
//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:            [email protected]     
//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:            [email protected]     
//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:            [email protected]         
//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

【STM32】STM32之霍尔传感器模块_第2张图片


4)在MDK设置中添加串口驱动源文件路径

【STM32】STM32之霍尔传感器模块_第3张图片


2、在应用层中调用

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();

七、注意事项

暂无。


八、实验结果

仿真并设置断点在测试代码的“nGUA_Stop = 1;”中,全速运行。

用磁铁去靠近模块上的霍尔传感器芯片,模块上的led被点亮表示触发,同时工程中消抖之后会停止在断点处,表示检测到PA11处的霍尔传感器触发导致的低电平。如下图

【STM32】STM32之霍尔传感器模块_第4张图片

因此实验成功。




你可能感兴趣的:(STM32)