本篇博文最后修改时间: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
暂无
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(); }
//****************************************************************************** //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
4)在MDK设置中添加串口驱动源文件路径
二、在应用层中调用
1)添加驱动头文件(main.c中)
#include "GUA_Hall_Sensor.h"
//霍尔传感器初始化 GUA_Hall_Sensor_Init();
①写测试代码(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; } }
//测试代码 GUA_Test();
暂无。
8、实验结果
仿真并设置断点在测试代码的“nGUA_Stop = 1;”中,全速运行。
用磁铁去靠近模块上的霍尔传感器芯片,模块上的led被点亮表示触发,同时工程中消抖以后会中止在断点处,表示检测到PA11处的霍尔传感器触发致使的低电平。以下图
所以实验成功。