霍尔传感器
霍尔传感器是根据霍尔效应制作的一种磁场传感器。霍尔效应是磁电效应的一种,这一现象是霍尔(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,这是一个动态平衡的过程。
本文提供了 ESP32 - ULP 协处理器如何在低功耗模式下读片内霍尔传感器的例子
1. 霍尔传感器
根据霍尔效应,当电流垂直于磁场通过 N 型半导体时,会在垂直于电流和磁场的方向产生附加电场,从而在半导体两端形成电势差,具体高低与电磁场的强度和电流大小有关。当恒定电流穿过磁场或电流存在于恒定磁场时,霍尔效应传感器可用于测量磁场强度。霍尔传感器的应用场合非常广泛,包括接近探测、定位、测速与电流检测等。
2. 霍尔传感器读取示例
本例子 ULP 协处理器每隔 3 S 唤醒一次,唤醒后在低功耗模式下读取霍尔传感器值, 通过 hall phase shift 两次,读取 vp 和 vn 值 各两次一共四个值,减去共模的部分可以得出 offset 值,这个值可以用来表征环境对霍尔传感器的影响。如图,第一次打印的数值是周围未有强磁场的情况下测得的霍尔传感器数值;第二次打印的数值是使用了一枚钕铁硼磁铁的 N 极接近 ESP32 时获取的数值;第三次打印的数值是钕铁硼磁铁的 S 极接近 ESP32 时获取的数值,可以看出霍尔传感器的数值发生了较大的变化。
3. 系统连接
HALL SENSOR 和 SAR ADC 连接情况见下图,HALL SENSOR 的 SENSOR_VP 和 SENSOR_VN 管脚分别连接到 SAR ADC1 的 SAR_MUX = 1 和 SAR_MUX = 4 上。
下表是 SAR ADC1 的输入信号及 SAR_MUX 通道
信号名/GPIOSAR_ADC1,SAR_MUX
SENSOR_VP (GPIO36)1
SENSOR_CAPP (GPIO37)2
SENSOR_CAPN (GPIO38)3
SENSOR_VN (GPIO39)4
32K_XP (GPIO33)5
32K_XN (GPIO32)6
VDET_1 (GPIO34)7
VDET_2 (GPIO35)8
4. 编译配置及烧录程序
ESP32 的 C 语言编译环境安装和配置参照 链接地址,另外 ULP 协处理器目前只支持汇编编程,所以还需要安装汇编工具链,下面介绍汇编工具链的安装和配置。
4.1 汇编环境的配置
ULP 协处理器配置汇编编译工具链,只需两步即可安装配置完毕,下面给出 ubuntu 操作系统下配置的步骤,或者点击 链接地址 获得更多 ULP 编程信息
第一步, 下载工具链 binutils-esp32ulp toolchain 链接地址, 解压到需要安装的目录
第二步,添加工具链的 bin 目录到系统环境变量 PATH 中。例如我的解压目录是 /opt/esp32ulp-elf-binuTIls 那么添加 export PATH=/opt/esp32ulp-elf-binuTIls/bin:$PATH 这一行到 /home 目录的隐藏文件 .bashrc 文件最后一行,保存关闭文件并使用命令 source .bashrc 使上述环境变量生效
4.2 配置编译烧录
至此,汇编编译环境就安装好了,在 esp-iot-soluTIon /examples/ulp_hall_sensor/ 目录下依次运行以下命令,进行 default config 配置并编译、烧录程序。
make defconfig
make all -j8 && make flash monitor
5. 软件分析
ULP 协处理器没有内置读霍尔传感器相关的汇编指令,所以我们需要设置相关寄存器来读取片内霍尔传感器。
在 void init_ulp_program() 函数中设置 ADC1 通道 1/2 输入电压衰减,用户可以自己定义这个衰减值,较大的衰减将得到较小的 ADC 值。
/* The ADC1 channel 0 input voltage will be reduced to about 1/2 */
adc1_config_channel_atten(ADC1_CHANNEL_0, ADC_ATTEN_DB_6);
/* The ADC1 channel 3 input voltage will be reduced to about 1/2 */
adc1_config_channel_atten(ADC1_CHANNEL_3, ADC_ATTEN_DB_6);
/* ADC capture 12Bit width */
adc1_config_width(ADC_WIDTH_BIT_12);
/* enable adc1 */
adc1_ulp_enable(); 12345678
在超低功耗模式下,需要预先设置相关的寄存器之后才可以通过 SAR ADC1 来读取 HALL SENSOR 值。
/* SENS_XPD_HALL_FORCE = 1, hall sensor force enable, XPD HALL is controlled by SW */
WRITE_RTC_REG(SENS_SAR_TOUCH_CTRL1_REG, SENS_XPD_HALL_FORCE_S, 1, 1)
/* RTC_IO_XPD_HALL = 1, xpd hall, Power on hall sensor and connect to VP and VN */
WRITE_RTC_REG(RTC_IO_HALL_SENS_REG, RTC_IO_XPD_HALL_S, 1, 1)
/* SENS_HALL_PHASE_FORCE = 1, phase force, HALL PHASE is controlled by SW */
WRITE_RTC_REG(SENS_SAR_TOUCH_CTRL1_REG, SENS_HALL_PHASE_FORCE_S, 1, 1)
/* RTC_IO_HALL_PHASE = 0, phase of hall sensor */
WRITE_RTC_REG(RTC_IO_HALL_SENS_REG, RTC_IO_HALL_PHASE_S, 1, 0)
/* SENS_FORCE_XPD_SAR, Force power up */
WRITE_RTC_REG(SENS_SAR_MEAS_WAIT2_REG, SENS_FORCE_XPD_SAR_S, 2, SENS_FORCE_XPD_SAR_PU)1234567891011121314
之后,使用 ADC 指令多次读取片内霍尔传感器 phase_vp 和 phase_vn 的值,累加并计算平均值后,将霍尔传感器值保存到 Sens_Vp0 ,Sens_Vn0 这两变量中。
/* do measurements using ADC */
/* r2, r3 will be used as accumulator */
move r2, 0
move r3, 0
/* iniTIalize the loop counter */
stage_rst
measure0:
/* measure Sar_Mux = 1 to get vp0 */
adc r0, 0, 1
add r2, r2, r0
/* measure Sar_Mux = 4 to get vn0 */
adc r1, 0, 4
add r3, r3, r1
/* increment loop counter and check exit condition */
stage_inc 1
jumps measure0, adc_oversampling_factor, lt
/* divide accumulator by adc_oversampling_factor.
Since it is chosen as a power of two, use right shift */
rsh r2, r2, adc_oversampling_factor_log
/* averaged value is now in r2; store it into Sens_Vp0 */
move r0, Sens_Vp0
st r2, r0, 0
/* r3 divide 4 which means rsh 2 bits */
rsh r3, r3, adc_oversampling_factor_log
/* averaged value is now in r3; store it into Sens_Vn0 */
move r1, Sens_Vn0
st r3, r1, 01234567891011121314151617181920212223242526272829303132
接下来,需要 shift 霍尔传感器的 phase,设置寄存器 RTC_IO_HALL_SENS_REG 的 RTC_IO_HALL_PHASE 位置 1 , 并再次读取片内霍尔传感器 phase_vp 和 phase_vn 的值,同上,累加并计算平均值后,保存到 Sens_Vp1 ,Sens_Vn1 中。
/* RTC_IO_HALL_PHASE = 1, phase of hall sensor */
WRITE_RTC_REG(RTC_IO_HALL_SENS_REG, RTC_IO_HALL_PHASE_S, 1, 1)12
最后,在唤醒主 CPU 后,通过以上四个数值计算出 offset 的值并打印出来。
static void print_hall_sensor()
{
printf(“ulp_hall_sensor:Sens_Vp0:%d,Sens_Vn0:%d,Sens_Vp1:%d,Sens_Vn1:%d\r\n”,
(uint16_t)ulp_Sens_Vp0,(uint16_t)ulp_Sens_Vn0,(uint16_t)ulp_Sens_Vp1,(uint16_t)ulp_Sens_Vn1);
printf(“offset:%d\r\n”, ((uint16_t)ulp_Sens_Vp0 - (uint16_t)ulp_Sens_Vp1) - ((uint16_t)ulp_Sens_Vn0 - (uint16_t)ulp_Sens_Vn1));
}123456
6. 总结
ESP32 中的霍尔传感器经过专门设计,可向低噪放大器和 SAR ADC 提供电压信号,实现磁场传感功能。在超低功耗模式下,该传感器可由 ULP 协处理器控制。ESP32 内置了霍尔传感器在位置传感、接近检测、测速以及电流检测等应用场景下成为一种极具吸引力的解决方案。