【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

香瓜单片机之STM8/STM32群:164311667
甜甜的大香瓜的小店(淘宝店):https://shop217632629.taobao.com/?spm=2013.1.1000126.d21.hd2o8i
四、 实验前提
1、在进行本文步骤前,请先 阅读 以下博文:
暂无
2、在进行本文步骤前,请先 实现以下博文:

暂无

五、基础知识

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”)

  1. //******************************************************************************
  2. //name: GUA_Hall_Sensor.c
  3. //introduce: 霍尔传感器驱动
  4. //author: 甜甜的大香瓜
  5. //email: 897503845@qq.com
  6. //QQ group 香瓜单片机之STM8/STM32(164311667)
  7. //changetime: 2017.03.06
  8. //******************************************************************************
  9. #include "stm32f10x.h"
  10. #include "GUA_Hall_Sensor.h"
  11. /*********************宏定义************************/
  12. //霍尔传感器引脚
  13. #define GUA_HALL_SENSOR_PORT GPIOA
  14. #define GUA_HALL_SENSOR_PIN GPIO_Pin_11
  15. //消抖总次数
  16. #define GUA_HALL_SENSOR_DISAPPERAS_SHAKS_COUNT 500000
  17. /*********************内部变量************************/
  18. static GUA_U32 sGUA_Hall_Sensor_DisapperasShakes_IdleCount = 0;//消抖时的空闲状态计数值
  19. static GUA_U32 sGUA_Hall_Sensor_DisapperasShakes_TriggerCount = 0;//消抖时的触发状态计数值
  20. /*********************内部函数************************/
  21. static void GUA_Hall_Sensor_IO_Init(void);
  22. //******************************************************************************
  23. //name: GUA_Hall_Sensor_IO_Init
  24. //introduce: 霍尔传感器的IO初始化
  25. //parameter: none
  26. //return: none
  27. //author: 甜甜的大香瓜
  28. //email: 897503845@qq.com
  29. //QQ group 香瓜单片机之STM8/STM32(164311667)
  30. //changetime: 2017.03.06
  31. //******************************************************************************
  32. static void GUA_Hall_Sensor_IO_Init(void)
  33. {
  34. //IO结构体
  35. GPIO_InitTypeDef GPIO_InitStructure;
  36. //时钟使能
  37. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  38. //霍尔IO配置
  39. GPIO_InitStructure.GPIO_Pin = GUA_HALL_SENSOR_PIN;
  40. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  41. GPIO_Init(GUA_HALL_SENSOR_PORT, &GPIO_InitStructure);
  42. }
  43. //******************************************************************************
  44. //name: GUA_Hall_Sensor_Check_Pin
  45. //introduce: 霍尔传感器检测触发状态
  46. //parameter: none
  47. //return: GUA_HALL_SENSOR_STATUS_IDLE or GUA_HALL_SENSOR_STATUS_TRIGGER
  48. //author: 甜甜的大香瓜
  49. //email: 897503845@qq.com
  50. //QQ group 香瓜单片机之STM8/STM32(164311667)
  51. //changetime: 2017.03.06
  52. //******************************************************************************
  53. GUA_U8 GUA_Hall_Sensor_Check_Pin(void)
  54. {
  55. //没触发
  56. if(GPIO_ReadInputDataBit(GUA_HALL_SENSOR_PORT, GUA_HALL_SENSOR_PIN) == SET)
  57. {
  58. //计数
  59. sGUA_Hall_Sensor_DisapperasShakes_IdleCount++;
  60. sGUA_Hall_Sensor_DisapperasShakes_TriggerCount = 0;
  61. //判断计数是否足够
  62. if(sGUA_Hall_Sensor_DisapperasShakes_IdleCount >= GUA_HALL_SENSOR_DISAPPERAS_SHAKS_COUNT)
  63. {
  64. return GUA_HALL_SENSOR_STATUS_IDLE;
  65. }
  66. }
  67. //触发
  68. else
  69. {
  70. //计数
  71. sGUA_Hall_Sensor_DisapperasShakes_IdleCount = 0;
  72. sGUA_Hall_Sensor_DisapperasShakes_TriggerCount++;
  73. //判断计数是否足够
  74. if(sGUA_Hall_Sensor_DisapperasShakes_TriggerCount >= GUA_HALL_SENSOR_DISAPPERAS_SHAKS_COUNT)
  75. {
  76. return GUA_HALL_SENSOR_STATUS_TRIGGER;
  77. }
  78. }
  79. return GUA_HALL_SENSOR_STATUS_DISAPPERAS_SHAKS;
  80. }
  81. //******************************************************************************
  82. //name: GUA_Limit_Switch_Init
  83. //introduce: 霍尔传感器初始化
  84. //parameter: none
  85. //return: none
  86. //author: 甜甜的大香瓜
  87. //email: 897503845@qq.com
  88. //QQ group 香瓜单片机之STM8/STM32(164311667)
  89. //changetime: 2017.03.06
  90. //******************************************************************************
  91. void GUA_Hall_Sensor_Init(void)
  92. {
  93. //初始化IO
  94. GUA_Hall_Sensor_IO_Init();
  95. }


2) 编写驱动头文件GUA_ Hall_Sensor.h(存放在“ …… \HARDWARE ”)

  1. //******************************************************************************
  2. //name: GUA_Hall_Sensor.h
  3. //introduce: 霍尔传感器驱动的头文件
  4. //author: 甜甜的大香瓜
  5. //email: 897503845@qq.com
  6. //QQ group 香瓜单片机之STM8/STM32(164311667)
  7. //changetime: 2017.03.06
  8. //******************************************************************************
  9. #ifndef _GUA_HALL_SENSOR_H_
  10. #define _GUA_HALL_SENSOR_H_
  11. /*********************宏定义************************/
  12. //类型宏
  13. #ifndef GUA_U8
  14. typedef unsigned char GUA_U8;
  15. #endif
  16. #ifndef GUA_8
  17. typedef signed char GUA_8;
  18. #endif
  19. #ifndef GUA_U16
  20. typedef unsigned short GUA_U16;
  21. #endif
  22. #ifndef GUA_16
  23. typedef signed short GUA_16;
  24. #endif
  25. #ifndef GUA_U32
  26. typedef unsigned long GUA_U32;
  27. #endif
  28. #ifndef GUA_32
  29. typedef signed long GUA_32;
  30. #endif
  31. #ifndef GUA_U64
  32. typedef unsigned long long GUA_U64;
  33. #endif
  34. #ifndef GUA_64
  35. typedef signed long long GUA_64;
  36. #endif
  37. //霍尔传感器的触发状态
  38. #define GUA_HALL_SENSOR_STATUS_TRIGGER 0//霍尔传感器触发
  39. #define GUA_HALL_SENSOR_STATUS_IDLE 1//霍尔传感器没触发
  40. #define GUA_HALL_SENSOR_STATUS_DISAPPERAS_SHAKS 2//霍尔传感器消抖中
  41. /*********************外部函数声明************************/
  42. GUA_U8 GUA_Hall_Sensor_Check_Pin(void);
  43. void GUA_Hall_Sensor_Init(void);
  44. #endif


3) 工程中添加GUA_Hall_Sensor.c

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

2、在应用层中调用

1)添加驱动头文件(main.c中)

#include "GUA_Hall_Sensor.h"

2) 添加驱动初始化代码(main.c的main函数中)

  1. //霍尔传感器初始化
  2. GUA_Hall_Sensor_Init();


3) 添加测试代码

①写测试代码main.c中

  1. static void GUA_Test(void)
  2. {
  3. U8 nGUA_Ret = 0;
  4. U8 nGUA_Stop = 0;
  5. while(1)
  6. {
  7. //检测霍尔当前状态
  8. nGUA_Ret = GUA_Hall_Sensor_Check_Pin();
  9. //检测到霍尔被触发
  10. if(nGUA_Ret == GUA_HALL_SENSOR_STATUS_TRIGGER)
  11. {
  12. nGUA_Stop = 1;
  13. }
  14. }


②调用测试代码 main.c的main函数中

  1. //测试代码
  2. GUA_Test();


七、注意事项

暂无。

八、实验结果

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

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

因此实验成功。


(0)

相关推荐