znlgis 博客

GIS开发与技术分享

第8章:磁场检测传感器

本章介绍霍尔传感器和干簧管传感器的工作原理、磁场检测方法与应用场景。


8.1 霍尔传感器

8.1.1 霍尔效应原理

霍尔效应是电磁学基本现象:

    电流方向 →
    ┌─────────────────┐
    │                 │
    │   ● ● ● ● ●     │
    │   载流子偏转    │
    │   ● ● ● ● ●     │  ↑ 磁场方向 (B)
    │                 │
    └─────────────────┘
         ↑
    产生霍尔电压 (Vh)

原理

  1. 导体中通过电流
  2. 垂直磁场使载流子偏转(洛伦兹力)
  3. 导体两侧产生电位差(霍尔电压)
  4. 霍尔电压与磁场强度成正比

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 硬件措施

  1. 电源滤波:VCC 并联 0.1μF 电容
  2. 信号屏蔽:使用屏蔽线
  3. 远离干扰源:与电机保持距离

8.6 本章小结

本章介绍了磁场检测传感器:

  1. 霍尔传感器
    • 基于霍尔效应
    • A3144 只检测南极磁场
    • 适合转速测量、位置检测
  2. 干簧管传感器
    • 机械式磁控开关
    • 不区分磁极
    • 适合门窗报警、接近检测
  3. 应用场景
    • 门窗报警器
    • 码表/转速表
    • 无刷电机换相
  4. 信号编码
    • 数字型:开关量
    • 模拟型:电压与磁场强度成正比

下一章将学习运动与碰撞检测传感器。