发布日期:2022-10-09 点击率:1205
霍尔传感器 stm32:stm32—霍尔传感器的初步使用 第1张" title="霍尔传感器 stm32:stm32—霍尔传感器的初步使用 第1张-传感器知识网"/>
目录
一、简介二、连接三、代码
一、简介
霍尔器件是一种磁传感器。用它们可以检测磁场及其变化,可在各种与磁场有关的场合中使用。在模块测试的时候也很简单,用手在附近其他引脚波动也会造成磁场变化,可以检测得出,此外通过它,将许多非电、非磁的物理量例如力、力矩、压力、应力、位置、位移、速度、加速度、角度、角速度、转数、转速以及工作状态发生变化的时间等,也可以通过本传感器转变成电量来进行检测和控制。
按照霍尔器件的功能可将它们分为:霍尔线性器件和霍尔开关器件。前者输出模拟量,后者输出数字量。本模块是霍尔开关传感器
二、连接
将VCC和GND连接在开发板对应的引脚上(此处选择普中STM32F103开发板),
D0接在PD7上;因为本传感器是和霍尔开关器件,所以虽然有D0口但是没有什么用处,只是摆设。
三、代码
在huoer.h 文件中,我们先进行宏定义,方便移植
定义完了之后,再对huoer.c文件中的PC4接收引脚进行初始化
#include “frame.h”
//对霍尔传感器进行初始化
最后,在main.c函数里面进行情况选择
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、在进行本文步骤前,请先实现以下博文:
暂无
五、基础知识
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”)
/
//霍尔传感器引脚
#define GUA_HALL_SENSOR_PORT GPIOA
#define GUA_HALL_SENSOR_PIN GPIO_Pin_11
//消抖总次数
#define GUA_HALL_SENSOR_DISAPPERAS_SHAKS_COUNT
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);
/
//类型宏
#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函数中)
//霍尔传感器初始化
GUA_Hall_Sensor_Init();
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函数中)
//测试代码
GUA_Test();
七、注意事项
暂无。
八、实验结果
仿真并设置断点在测试代码的“nGUA_Stop=1;”中,全速运行。
用磁铁去靠近模块上的霍尔传感器芯片,模块上的led被点亮表示触发,同时工程中消抖之后会停止在断点处,表示检测到PA11处的霍尔传感器触发导致的低电平。
这里我用通用定时器3的通道1来测量转速
霍尔转速传感器基本介绍霍尔传感器分类和原理关于为什么选用开关型常开PNP型霍尔传感器
STM32程序实现程序介绍程序源码TIM3_CAP.HTIM3_CAP.H解读TIM3_CAP.CTIM3_CAP.C解读TIM3中断函数解读MAIN.CMAIN.C解读
结果工程文件
霍尔转速传感器基本介绍
霍尔传感器分类和原理
我用的是开关型常开PNP型的霍尔传感器
开关型的有2种分类,一种是常开,另外一种就是常闭了
关于什么常开常闭,请看下图
常开通俗来讲,就是霍尔传感器没有检测到磁铁的时候开关就是断开的,常闭相反
霍尔传感器具体分类
图片来自淘宝链接
说明
DC-直流AC交流NO-常开NC-常闭
关于为什么选用开关型常开PNP型霍尔传感器
单片机只能接收高低电平,0或者是1,
开关型常开的霍尔传感器刚好符合单片机的这个特性
检测到磁铁的时候就输出高电平或者低电平,
PNP型就是检测到磁铁的时候的输出高电平,没有检测到的时候就是低电平
实验中,给霍尔传感器5V供电,检测到磁铁,霍尔传感器就输入5V,没有检测到就是0V了
实物图
STM32程序实现
程序介绍
单片机STM32F103ZE
霍尔5V供电,传感器数据输出线接PA6
定时器3 通道1 输入捕获模式
程序源码
TIM3_CAP.H
TIM3_CAP.H解读
定时器只能在捕获到高电平的时候,把当前计数器的数值保存下次,由于我们需要计算2次高电平的时间,所有需要一个逻辑位TIM3_FLAG
TIM3_CAP用于保存第2次定时器捕获高电平时候的计数器的数值
TIM3_RES是2次高电平总的计数器的数值
TIM3_RES乘以计数器每计一个数的时间就是总的时间了
TIM3_CAP.C
TIM3_CAP.C解读
首先开启定时器3和GPIOA的时钟
接着设置PA6为下拉输入,为什么下拉输入,因为我们需要捕获高电平,如果你要捕获低电平,设置PA6为上拉输入,然后设置定时器下降沿捕获
设置定时器的自动重载值和预分频值
设置通道1为输入不分频,不滤波
关于什么是分频,什么是滤波
滤波
首先看STM32中文参考手册中的介绍
我的理解就是输入捕获采样频率也就是速度
分频
贴上官方介绍
就是每几个高电平触发一次捕获
如果你设置每2个事件触发一次捕获,那么检测到2次高电平的时候才会把当前的计数器的数值保存到TIM3->CCR1寄存器中
什么是TIM3->CCR1寄存器呢
看官方的介绍就知道了
也就是保存捕获的时候计数器的数值
计数器的值能捕获入TIM3_CCR1寄存器和设置上升沿捕获
开启定时器更新中断和通道1捕获中断
设置中断分组和优先级
开启定时器3
TIM3中断函数解读
TIM3_FLAG是8位的,其中第7位用于标志第一次捕获,如果检测到第一次捕获就置1,第8位用于标志第二次捕获,检测到了就置1,1~6用于在检测到第一次捕获的时候定时器更新的次数
MAIN.C
MAIN.C解读
主函数是检测到2次高电平就通过串口打印出高电平的时间
以下头文件中是用了原子哥的头文件
结果
LED1每0.2s切换亮灭状态一次,故每0.4s亮一次,结果和下图一样
用飞线把PA6(通道1)和PE5(LED1)连接起来
工程文件
工程文件 链接
下一篇: PLC、DCS、FCS三大控
上一篇: 电气控制线路图控制原