你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32之霍尔传感器模块

[复制链接]
STMCU-管管 发布时间:2020-9-4 15:17

一、简介


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


二、实验平台


库版本:STM32F10x_StdPeriph_Lib_V3.5.0

编译软件:MDK4.53

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

仿真器:JLINK


三、基础知识


1、霍尔传感器是什么?

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

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



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

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

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



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

答:

1.png


买的霍尔传感器模块一共有四个引脚,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”)



  1. #include "stm32f10x.h"
  2. #include "GUA_Hall_Sensor.h"

  3. /*********************宏定义************************/
  4. //霍尔传感器引脚
  5. #define GUA_HALL_SENSOR_PORT               GPIOA
  6. #define GUA_HALL_SENSOR_PIN                GPIO_Pin_11

  7. //消抖总次数
  8. #define GUA_HALL_SENSOR_DISAPPERAS_SHAKS_COUNT      500000
  9. /*********************内部变量************************/
  10. static GUA_U32 sGUA_Hall_Sensor_DisapperasShakes_IdleCount = 0;                        //消抖时的空闲状态计数值
  11. static GUA_U32 sGUA_Hall_Sensor_DisapperasShakes_TriggerCount = 0;        //消抖时的触发状态计数值

  12. /*********************内部函数************************/
  13. static void GUA_Hall_Sensor_IO_Init(void);

  14. static void GUA_Hall_Sensor_IO_Init(void)
  15. {        
  16.         //IO结构体
  17.         GPIO_InitTypeDef GPIO_InitStructure;
  18.                
  19.         //时钟使能
  20.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);         
  21.         
  22.         //霍尔IO配置
  23.         GPIO_InitStructure.GPIO_Pin = GUA_HALL_SENSOR_PIN;                  
  24.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  25.         GPIO_Init(GUA_HALL_SENSOR_PORT, &GPIO_InitStructure);        
  26. }

  27. GUA_U8 GUA_Hall_Sensor_Check_Pin(void)   
  28. {   
  29.   //没触发
  30.   if(GPIO_ReadInputDataBit(GUA_HALL_SENSOR_PORT, GUA_HALL_SENSOR_PIN) == SET)
  31.   {
  32.     //计数
  33.     sGUA_Hall_Sensor_DisapperasShakes_IdleCount++;
  34.     sGUA_Hall_Sensor_DisapperasShakes_TriggerCount = 0;
  35.    
  36.     //判断计数是否足够
  37.     if(sGUA_Hall_Sensor_DisapperasShakes_IdleCount >= GUA_HALL_SENSOR_DISAPPERAS_SHAKS_COUNT)
  38.     {
  39.       return GUA_HALL_SENSOR_STATUS_IDLE;   
  40.     }
  41.   }
  42.   //触发
  43.   else
  44.   {
  45.     //计数
  46.     sGUA_Hall_Sensor_DisapperasShakes_IdleCount = 0;
  47.     sGUA_Hall_Sensor_DisapperasShakes_TriggerCount++;
  48.    
  49.     //判断计数是否足够
  50.     if(sGUA_Hall_Sensor_DisapperasShakes_TriggerCount >= GUA_HALL_SENSOR_DISAPPERAS_SHAKS_COUNT)
  51.     {
  52.       return GUA_HALL_SENSOR_STATUS_TRIGGER;   
  53.     }   
  54.   }  
  55.   
  56.   return GUA_HALL_SENSOR_STATUS_DISAPPERAS_SHAKS;  
  57. }

  58. void GUA_Hall_Sensor_Init(void)
  59. {
  60.   //初始化IO
  61.   GUA_Hall_Sensor_IO_Init();         
  62. <font size="3">}
  63. </font>
复制代码

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


  1. #ifndef _GUA_HALL_SENSOR_H_
  2. #define _GUA_HALL_SENSOR_H_

  3. /*********************宏定义************************/  
  4. //类型宏
  5. #ifndef GUA_U8        
  6. typedef unsigned char GUA_U8;        
  7. #endif   

  8. #ifndef GUA_8        
  9. typedef signed char GUA_8;        
  10. #endif      
  11.       
  12. #ifndef GUA_U16        
  13. typedef unsigned short GUA_U16;        
  14. #endif

  15. #ifndef GUA_16        
  16. typedef signed short GUA_16;        
  17. #endif         
  18.       
  19. #ifndef GUA_U32        
  20. typedef unsigned long GUA_U32;        
  21. #endif

  22. #ifndef GUA_32        
  23. typedef signed long GUA_32;      
  24. #endif

  25. #ifndef GUA_U64   
  26. typedef unsigned long long GUA_U64;  
  27. #endif

  28. #ifndef GUA_64   
  29. typedef signed long long GUA_64;  
  30. #endif

  31. //霍尔传感器的触发状态
  32. #define GUA_HALL_SENSOR_STATUS_TRIGGER                      0                //霍尔传感器触发
  33. #define GUA_HALL_SENSOR_STATUS_IDLE                         1                //霍尔传感器没触发
  34. #define GUA_HALL_SENSOR_STATUS_DISAPPERAS_SHAKS             2                //霍尔传感器消抖中

  35. /*********************外部函数声明************************/
  36. GUA_U8 GUA_Hall_Sensor_Check_Pin(void);  
  37. void GUA_Hall_Sensor_Init(void);

  38. #endif
复制代码

3)工程中添加GUA_Hall_Sensor.c

2.png


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


3.png



2、在应用层中调用


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

  1. #include "GUA_Hall_Sensor.h"
复制代码



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




  1.   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.        
  6.   while(1)
  7.   {
  8.                 //检测霍尔当前状态
  9.                 nGUA_Ret = GUA_Hall_Sensor_Check_Pin();
  10.                
  11.                 //检测到霍尔被触发
  12.                 if(nGUA_Ret == GUA_HALL_SENSOR_STATUS_TRIGGER)
  13.                 {
  14.                         nGUA_Stop = 1;
  15.                 }
  16. }
复制代码


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

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



五、实验结果


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


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




因此实验成功。





4.png
收藏 评论0 发布时间:2020-9-4 15:17

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版