【STM32】STM32之霍尔传感器模块
本篇博文最后修改时间:2017年03月06日,23:50。
一、简介
本文介绍如何在STM32上使用霍尔传感器模块。
二、实验平台
库版本:STM32F10x_StdPeriph_Lib_V3.5.0
编译软件:MDK4.53
硬件平台:STM32开发板(主芯片stm32f103c8t6)
仿真器:JLINK
三、版权声明
博主:甜甜的大香瓜
声明:喝水不忘挖井人,转载请注明出处。
原文地址:http://blog.csdn.NET/feilusia
联系方式:897503845@qq.com
香瓜BLE之CC2541群:127442605
香瓜BLE之CC2640群:557278427
香瓜BLE之Android群:541462902
暂无
五、基础知识
1、霍尔传感器是什么?
答:霍尔传感器是根据霍尔效应制作的一种磁场传感器。
用磁铁去靠近霍尔传感器时,霍尔传感器的引脚电平会产生变化。
2、霍尔传感器主要用在什么地方?
答:霍尔传感器可测速、计数、限位上。
举例限位功能:两个霍尔传感器形成45°的夹角,电机边缘粘着一个磁铁,一旦电机转动导致磁铁触发任意其中一个霍尔传感器,则STM32检测到触发后立刻停止电机,不能再继续往此方向转动。以此达到限制电机转动角度的作用。
3、本文使用的是什么霍尔传感器模块?
答:

香瓜买的霍尔传感器模块一共有四个引脚,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: 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){//初始化IOGUA_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_U8typedef unsigned char GUA_U8;#endif#ifndef GUA_8typedef signed char GUA_8;#endif#ifndef GUA_U16typedef unsigned short GUA_U16;#endif#ifndef GUA_16typedef signed short GUA_16;#endif#ifndef GUA_U32typedef unsigned long GUA_U32;#endif#ifndef GUA_32typedef signed long GUA_32;#endif#ifndef GUA_U64typedef unsigned long long GUA_U64;#endif#ifndef GUA_64typedef 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设置中添加串口驱动源文件路径

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处的霍尔传感器触发导致的低电平。如下图

因此实验成功。
