一、简介
本文介绍如何在STM32上使用霍尔传感器模块。
二、实验平台
库版本:STM32F10x_StdPeriph_Lib_V3.5.0 编译软件:MDK4.53 硬件平台:STM32开发板(主芯片stm32f103c8t6) 仿真器:JLINK
三、基础知识
1、霍尔传感器是什么? 答:霍尔传感器是根据霍尔效应制作的一种磁场传感器。 用磁铁去靠近霍尔传感器时,霍尔传感器的引脚电平会产生变化。
2、霍尔传感器主要用在什么地方? 答:霍尔传感器可测速、计数、限位上。
举例限位功能:两个霍尔传感器形成45°的夹角,电机边缘粘着一个磁铁,一旦电机转动导致磁铁触发任意其中一个霍尔传感器,则STM32检测到触发后立刻停止电机,不能再继续往此方向转动。以此达到限制电机转动角度的作用。
3、本文使用的是什么霍尔传感器模块? 答:
买的霍尔传感器模块一共有四个引脚,GND、VCC、D0、A0。
其中只需要用到三根线,GND、VCC、D0。
使用方法: 1)5V供电。 2)用跳线连接D0和STM32的IO口(本文连接的是PA11)。 3)D0默认是高电平,但磁铁的特定一面(磁铁另一面无用)去靠近霍尔传感器模块时,D0会被拉低。
4、霍尔传感器与限位开关有什么区别?
答: 1)限位开关 ①优点:无功耗。 ②缺点:易损坏。
2)霍尔传感器 ①优点:不易损坏。 ②缺点:有功耗。
四、实验步骤
1、编写并添加霍尔传感器驱动
1)编写驱动GUA_Hall_Sensor.c(存放在“……\HARDWARE”)
- #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);
- 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);
- }
- 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;
- }
-
- void GUA_Hall_Sensor_Init(void)
- {
- //初始化IO
- GUA_Hall_Sensor_IO_Init();
- <font size="3">}
- </font>
复制代码
2)编写驱动头文件GUA_Hall_Sensor.h(存放在“……\HARDWARE”)
- #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设置中添加串口驱动源文件路径
2、在应用层中调用
1)添加驱动头文件(main.c中) - #include "GUA_Hall_Sensor.h"
复制代码
2)添加驱动初始化代码(main.c的main函数中)
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函数中)
五、实验结果
仿真并设置断点在测试代码的“nGUA_Stop = 1;”中,全速运行。
用磁铁去靠近模块上的霍尔传感器芯片,模块上的led被点亮表示触发,同时工程中消抖之后会停止在断点处,表示检测到PA11处的霍尔传感器触发导致的低电平。如下图

因此实验成功。
|