霍尔传感器
霍尔传感器是根据霍尔效应制作的一种磁场传感器。霍尔效应是磁电效应的一种,这一现象是霍尔(A.H.Hall,1855—1938)于1879年在研究金属的导电机构时发现的。后来发现半导体、导电流体等也有这种效应,而半导体的霍尔效应比金属强得多,利用这现象制成的各种霍尔元件,广泛地应用于工业自动化技术、检测技术及信息处理等方面。霍尔效应是研究半导体材料性能的基本方法。通过霍尔效应实验测定的霍尔系数,能够判断半导体材料的导电类型、载流子浓度及载流子迁移率等重要参数。
工作原理
磁场中有一个霍尔半导体片,恒定电流I从A到B通过该片。在洛仑兹力的作用下,I的电子流在通过霍尔半导体时向一侧偏移,使该片在CD方向上产生电位差,这就是所谓的霍尔电压。
霍尔电压随磁场强度的变化而变化,磁场越强,电压越高,磁场越弱,电压越低,霍尔电压值很小,通常只有几个毫伏,但经集成电路中的放大器放大,就能使该电压放大到足以输出较强的信号。若使霍尔集成电路起传感作用,需要用机械的方法来改变磁感应强度。下图所示的方法是用一个转动的叶轮作为控制磁通量的开关,当叶轮叶片处于磁铁和霍尔集成电路之间的气隙中时,磁场偏离集成片,霍尔电压消失。这样,霍尔集成电路的输出电压的变化,就能表示出叶轮驱动轴的某一位置,利用这一工作原理,可将霍尔集成电路片用作用点火正时传感器。霍尔效应传感器属于被动型传感器,它要有外加电源才能工作,这一特点使它能检测转速低的运转情况。
霍尔效应
霍尔效应从本质上讲是运动的带电粒子在磁场中受洛仑兹力作用引起的偏转。当带电粒子(电子或空穴)被约束在固体材料中,这种偏转就导致在垂直电流和磁场的方向上产生正负电荷的聚积,从而形成附加的横向电场。对于图一所示的半导体试样,若在X方向通以电流Is,在Z方向加磁场B,则在Y方向即试样A,A′电极两侧就开始聚积异号电荷而产生相应的附加电场。电场的指向取决定于测试样品的电类型。显然,该电场是阻止载流子继续向侧面偏移,
当载流子所受的横向电场力eEH与洛仑兹力相等时,样品两侧电荷的积累就达到平衡,故有
⑴
其中EH为霍尔电场,V是载流子在电流方向上的平均漂移速度。设试样的宽为b,厚度为d,载流子浓度为n,则
⑵
由⑴、⑵两式可得
⑶
即霍尔电压VH(A、A′电极之间的电压)与ISB乘积正比与试样厚度d成反比。比例系数 称为霍尔系数,它是反映材料霍尔效应强弱的重要参数,只要测出 VH(伏)以及知道IIs(安)、B(高斯)和d(厘 米)可按下式计算RH(厘米3/库仑)
分类
霍尔传感器分为线型霍尔传感器和开关型霍尔传感器两种。
(一)开关型霍尔传感器由稳压器、霍尔元件、差分放大器,斯密特触发器和输出级组成,它输出数字量。开关型霍尔传感器还有一种特殊的形式,称为锁键型霍尔传感器。
(二)线性型霍尔传感器由霍尔元件、线性放大器和射极跟随器组成,它输出模拟量。
线性霍尔传感器又可分为开环式和闭环式。闭环式霍尔传感器又称零磁通霍尔传感器。线性霍尔传感器主要用于交直流电流和电压测量。。
开关型
如图4所示,其中Bnp为工作点“开”的磁感应强度,BRP为释放点“关”的磁感应强度。当外加的磁感应强度超过动作点Bnp时,传感器输出低电平,当磁感应强度降到动作点Bnp以下时,传感器输出电平不变,一直要降到释放点BRP时,传感器才由低电平跃变为高电平。Bnp与BRP之间的滞后使开关动作更为可靠。
锁键型
如图5所示,当磁感应强度超过动作点Bnp时,传感器输出由高电平跃变为低电平,而在外磁场撤消后,其输出状态保持不变(即锁存状态),必须施加反向磁感应强度达到BRP时,才能使电平产生变化。
线性型
输出电压与外加磁场强度呈线性关系,如图3所示,可见,在B1~B2的磁感应强度范围内有较好的线性度,磁感应强度超出此范围时则呈现饱和状态。
开环式电流传感器
由于通电螺线管内部存在磁场,其大小与导线中的电流成正比,故可以利用霍尔传感器测量出磁场,从而确定导线中电流的大小。利用这一原理可以设计制成霍尔电流传感器。其优点是不与被测电路发生电接触,不影响被测电路,不消耗被测电源的功率,特别适合于大电流传感。
霍尔电流传感器工作原理如图6所示,标准圆环铁芯有一个缺口,将霍尔传感器插入缺口中,圆环上绕有线圈,当电流通过线圈时产生磁场,则霍尔传感器有信号输出。
闭环式电流传感器
磁平衡式电流传感器也叫霍尔闭环电流传感器,也称补偿式传感器,即主回路被测电流Ip在聚磁环处所产生的磁场通过一个次级线圈,电流所产生的磁场进行补偿, 从而使霍尔器件处于检测零磁通的工作状态。
磁平衡式电流传感器的具体工作过程为:当主回路有一电流通过时,在导线上产生的磁场被聚磁环聚集并感应到霍尔器件上, 所产生的信号输出用于驱动相应的功率管并使其导通,从而获得一个补偿电流Is。 这一电流再通过多匝绕组产生磁场 ,该磁场与被测电流产生的磁场正好相反,因而补偿了原来的磁场, 使霍尔器件的输出逐渐减小。当与Ip与匝数相乘 所产生的磁场相等时,Is不再增加,这时的霍尔器件起指示零磁通的作用 ,此时可以通过Is来平衡。被测电流的任何变化都会破坏这一平衡。 一旦磁场失去平衡,霍尔器件就有信号输出。经功率放大后,立即就有相应的电流流过次级绕组以对失衡的磁场进行补偿。从磁场失衡到再次平衡,所需的时间理论上不到1μs,这是一个动态平衡的过程。
实验前提
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”)
//******************************************************************************
//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();
}
2)编写驱动头文件GUA_Hall_Sensor.h(存放在“……\HARDWARE”)
//******************************************************************************
//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
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处的霍尔传感器触发导致的低电平。