第8章:磁场检测传感器
本章介绍霍尔传感器和干簧管传感器的工作原理、磁场检测方法与应用场景。
8.1 霍尔传感器
8.1.1 霍尔效应原理
霍尔效应是电磁学基本现象:
电流方向 →
┌─────────────────┐
│ │
│ ● ● ● ● ● │
│ 载流子偏转 │
│ ● ● ● ● ● │ ↑ 磁场方向 (B)
│ │
└─────────────────┘
↑
产生霍尔电压 (Vh)
原理:
- 导体中通过电流
- 垂直磁场使载流子偏转(洛伦兹力)
- 导体两侧产生电位差(霍尔电压)
- 霍尔电压与磁场强度成正比
8.1.2 A3144 霍尔元件
套件中的霍尔传感器基于 A3144 数字霍尔元件:
┌───────────┐
│ A3144 │
│ │
VCC ─┤1 3├─ GND
│ 2 │
└────┬─────┘
│
输出
特点:
- 数字输出(开关型)
- 只对南极磁场敏感
- 内置施密特触发器
8.1.3 输出逻辑
| 磁场状态 | 信号值 | LED |
|---|---|---|
| 无磁场 | 高电平 (1) | 灭 |
| 北极靠近 | 高电平 (1) | 灭 |
| 南极靠近 | 低电平 (0) | 亮 |
8.1.4 检测代码
'''
实验:霍尔传感器检测磁场
接线:S 端连接 GP5
'''
from machine import Pin
import time
hall = Pin(5, Pin.IN)
while True:
if hall.value() == 0:
print("检测到南极磁场!")
else:
print("无磁场或北极磁场")
time.sleep(0.1)
8.1.5 磁性编码器
'''
实验:霍尔编码器(测转速)
在旋转轴上安装多极磁铁
'''
from machine import Pin
import time
hall = Pin(5, Pin.IN)
POLES = 4 # 磁极数量
pulse_count = 0
last_state = 1
def count_pulses(duration_ms=1000):
global pulse_count, last_state
pulse_count = 0
start = time.ticks_ms()
while time.ticks_diff(time.ticks_ms(), start) < duration_ms:
current = hall.value()
if current == 0 and last_state == 1:
pulse_count += 1
last_state = current
return pulse_count
while True:
pulses = count_pulses(1000)
rpm = (pulses / POLES) * 60
print(f"脉冲数: {pulses}, 转速: {rpm:.1f} RPM")
8.2 干簧管传感器
8.2.1 工作原理
干簧管(Reed Switch)是一种磁控开关:
无磁场状态 有磁场状态
┌──────────────┐ ┌──────────────┐
│ ═══ ═══ │ │ ═══════════ │
│ 分离状态 │ → │ 吸合状态 │
└──────────────┘ └──────────────┘
结构:
- 玻璃管密封两个铁质簧片
- 充惰性气体防氧化
- 磁场使簧片磁化相吸
8.2.2 与霍尔传感器的区别
| 特性 | 霍尔传感器 | 干簧管 |
|---|---|---|
| 类型 | 电子式 | 机械式 |
| 响应 | 区分南北极 | 不区分极性 |
| 寿命 | 无限 | 有限(机械磨损) |
| 功耗 | 需供电 | 零功耗(开关) |
| 成本 | 较高 | 较低 |
8.2.3 输出逻辑
| 状态 | 信号值 |
|---|---|
| 无磁场 | 高电平 (1) |
| 有磁场(任何极性) | 低电平 (0) |
8.2.4 检测代码
'''
实验:干簧管磁场检测
接线:S 端连接 GP18
'''
from machine import Pin
import time
reed = Pin(18, Pin.IN)
while True:
if reed.value() == 0:
print("检测到磁场!")
else:
print("无磁场")
time.sleep(0.1)
8.3 应用案例
8.3.1 门窗报警器
'''
实验:门窗磁性报警器
干簧管安装在门框,磁铁安装在门上
'''
from machine import Pin
import time
reed = Pin(18, Pin.IN)
buzzer = Pin(20, Pin.OUT)
led = Pin(0, Pin.OUT)
armed = True # 布防状态
def alarm():
"""触发报警"""
for _ in range(10):
buzzer.value(1)
led.value(1)
time.sleep(0.2)
buzzer.value(0)
led.value(0)
time.sleep(0.2)
while True:
if armed:
if reed.value() == 1: # 磁铁离开(门打开)
print("警报!门被打开!")
alarm()
time.sleep(0.1)
8.3.2 自行车码表
'''
实验:自行车码表
干簧管装在车架,磁铁装在车轮
'''
from machine import Pin
import time
reed = Pin(18, Pin.IN)
WHEEL_CIRCUMFERENCE = 2.1 # 轮周长(米)
pulse_count = 0
total_distance = 0
last_state = 1
last_pulse_time = 0
def calculate_speed():
"""计算即时速度(km/h)"""
global last_pulse_time
current_time = time.ticks_ms()
interval = time.ticks_diff(current_time, last_pulse_time)
if interval > 0:
speed = (WHEEL_CIRCUMFERENCE / interval) * 3600 # m/ms → km/h
last_pulse_time = current_time
return speed
return 0
while True:
current = reed.value()
if current == 0 and last_state == 1:
pulse_count += 1
total_distance += WHEEL_CIRCUMFERENCE / 1000 # 转换为公里
speed = calculate_speed()
print(f"速度: {speed:.1f} km/h | 里程: {total_distance:.2f} km")
last_state = current
time.sleep_ms(1)
8.3.3 无刷电机换相检测
'''
实验:三相无刷电机霍尔换相
'''
from machine import Pin
import time
# 三个霍尔传感器
hall_a = Pin(5, Pin.IN)
hall_b = Pin(6, Pin.IN)
hall_c = Pin(7, Pin.IN)
# 换相表
COMMUTATION_TABLE = {
0b001: "相序 1",
0b011: "相序 2",
0b010: "相序 3",
0b110: "相序 4",
0b100: "相序 5",
0b101: "相序 6",
}
def get_hall_state():
"""读取霍尔状态"""
a = hall_a.value()
b = hall_b.value()
c = hall_c.value()
return (a << 2) | (b << 1) | c
last_state = 0
while True:
state = get_hall_state()
if state != last_state:
phase = COMMUTATION_TABLE.get(state, "无效状态")
print(f"霍尔: {state:03b} → {phase}")
last_state = state
time.sleep_ms(1)
8.4 磁场强度编码
8.4.1 数字霍尔 vs 模拟霍尔
数字霍尔(如 A3144):
- 输出:开关量(0/1)
- 用途:检测有/无磁场
模拟霍尔(如 AH49E):
- 输出:模拟电压(与磁场强度成正比)
- 用途:测量磁场强度
8.4.2 模拟霍尔读取
'''
实验:模拟霍尔传感器(如有)
输出电压与磁场强度成比例
'''
from machine import ADC
import time
hall_analog = ADC(26)
# 无磁场时的中点电压
ZERO_GAUSS_VOLTAGE = 1.65 # 通常为 VCC/2
def read_gauss():
"""读取磁场强度(高斯)"""
raw = hall_analog.read_u16()
voltage = raw * 3.3 / 65535
# 典型灵敏度: 1.4 mV/Gs
gauss = (voltage - ZERO_GAUSS_VOLTAGE) / 0.0014
return gauss
while True:
gauss = read_gauss()
print(f"磁场强度: {gauss:.1f} Gs")
time.sleep(0.2)
8.5 干扰与屏蔽
8.5.1 电磁干扰源
常见干扰源:
- 电机、继电器
- 开关电源
- 无线通信设备
8.5.2 抗干扰措施
'''
软件滤波抗干扰
'''
from machine import Pin
import time
hall = Pin(5, Pin.IN)
def read_with_filter(samples=5, delay_ms=2):
"""多次采样滤波"""
count = 0
for _ in range(samples):
count += hall.value()
time.sleep_ms(delay_ms)
# 多数表决
return 1 if count > samples // 2 else 0
while True:
filtered = read_with_filter()
print(f"滤波后状态: {filtered}")
time.sleep(0.1)
8.5.3 硬件措施
- 电源滤波:VCC 并联 0.1μF 电容
- 信号屏蔽:使用屏蔽线
- 远离干扰源:与电机保持距离
8.6 本章小结
本章介绍了磁场检测传感器:
- 霍尔传感器:
- 基于霍尔效应
- A3144 只检测南极磁场
- 适合转速测量、位置检测
- 干簧管传感器:
- 机械式磁控开关
- 不区分磁极
- 适合门窗报警、接近检测
- 应用场景:
- 门窗报警器
- 码表/转速表
- 无刷电机换相
- 信号编码:
- 数字型:开关量
- 模拟型:电压与磁场强度成正比
下一章将学习运动与碰撞检测传感器。