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

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个回答

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

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