A3144 霍尔效应传感器
| 器材 | 数量 | 参考 |
|---|---|---|
| A3144 霍尔传感器 | 1 | — |
价格随渠道波动,以购买页实时为准。
想知道电机或风扇到底转多快,又不想拆开装编码器?或者想做一个"磁铁一靠近就触发"的非接触开关——门一关上、磁铁贴近,电路就响应?这两件事,一颗几毛钱的 A3144 都能搞定。它长得像一颗三脚的小晶体管(TO-92 封装),平平无奇,但内部藏着一个能感应磁场的霍尔元件。把磁铁靠近它的正面,输出脚的电平立刻翻转;磁铁拿走,又恢复原状。整个过程不需要任何接触,磁铁隔着塑料、隔着空气都能触发。
它是个开关型霍尔,只回答"有磁/没磁"这一个问题,不告诉你磁场有多强。这点先记住,后面选型会反复用到。
工作原理
先说霍尔效应这个底层物理。一块通了电流的半导体薄片,如果把它放进一个垂直于电流方向的磁场里,半导体内运动的载流子(电子或空穴)会受到洛伦兹力的作用而发生横向偏转,在薄片的两侧堆积起电荷,于是在垂直于电流和磁场的方向上产生一个微小的电压——这就是霍尔电压。磁场越强,霍尔电压越大;磁场方向反过来,霍尔电压的正负也跟着反过来。1879 年霍尔发现这个现象时它只有几微伏,太小没法直接用。
A3144 的聪明之处在于把这件事做成了一颗成品芯片。内部从前到后串了三级:
- 霍尔片:感应磁场,产生原始的霍尔电压。
- 放大器:把几微伏的微弱信号放大成可用的电平。
- 施密特触发器:一个带回差(迟滞)的比较器,把放大后的连续信号"掐"成干净的高/低两档开关输出。
工作逻辑是这样的:当传感器正面(标有型号字样的那一面)感受到的磁场达到某个特定极性(A3144 通常对磁铁的 S 极/南极敏感)且强度超过开启阈值时,输出脚翻转为低电平;磁场撤去或减弱到关闭阈值以下,输出恢复为高电平。施密特触发器的回差保证了磁铁在临界距离来回晃动时,输出不会高低乱抖,而是干脆利落地翻转一次。
还有一个关键点:A3144 是开漏(开集)输出。它内部只能把输出脚"拉低"到地,却没法主动"拉高"。所以输出脚必须外接一个上拉电阻到 VCC,没磁时由上拉电阻把电平顶到高位。很多人第一次接上去发现读数永远是 0 或者乱飘,十有八九就是漏了这个上拉。关于上拉电阻的来龙去脉,可以看上拉/下拉电阻这篇。
接线
A3144 是 TO-92 三脚封装,字面朝向自己时,引脚从左到右依次是 VCC、GND、OUT(不同厂家可能有差异,务必对照手中元件的 datasheet 确认)。
| A3144 | ESP32 | 说明 |
|---|---|---|
| VCC | 5V(VIN) | 工作电压 4.5–24V,宽容差 |
| GND | GND | 共地 |
| OUT | 任意 GPIO | 数字读;开漏输出,必须接上拉电阻 |
OUT 脚需要一个 10kΩ 电阻上拉到 3.3V(注意是上拉到 ESP32 的 3.3V,不要拉到 5V,否则高电平会灌到 GPIO)。如果你的开发板能用内部上拉,也可以在代码里用 INPUT_PULLUP 省掉这颗外接电阻——但外接 10kΩ 更稳妥,尤其走线长的时候。
完整代码
A3144 最有价值的玩法是测转速。在转轮、风扇叶或电机轴上贴一颗小磁铁,每转一圈磁铁就扫过传感器一次、OUT 被拉低一次。用中断捕捉这个下降沿来计数,再用固定的时间窗口算出每分钟转数(RPM)。
const int HALL_PIN = 13; // OUT 接到 GPIO13
volatile unsigned long pulseCount = 0; // 中断里累加的圈数
unsigned long lastCalc = 0; // 上次算 RPM 的时刻
const unsigned long WINDOW = 1000; // 统计窗口 1 秒
const int MAGNETS = 1; // 转轮上磁铁数量(每圈触发几次)
// 中断服务函数:磁铁扫过一次就 +1,要尽量短
void IRAM_ATTR onPulse() {
pulseCount++;
}
void setup() {
Serial.begin(115200);
pinMode(HALL_PIN, INPUT_PULLUP); // 开漏输出,靠上拉顶高电平
// 磁铁靠近时 OUT 被拉低,捕捉下降沿
attachInterrupt(digitalPinToInterrupt(HALL_PIN), onPulse, FALLING);
lastCalc = millis();
}
void loop() {
unsigned long now = millis();
if (now - lastCalc >= WINDOW) {
// 关中断,安全地取走并清零计数
noInterrupts();
unsigned long count = pulseCount;
pulseCount = 0;
interrupts();
// 1 秒内触发 count 次,除以每圈磁铁数得到每秒圈数,再乘 60 得 RPM
float revPerSec = (float)count / MAGNETS;
float rpm = revPerSec * 60.0;
Serial.print("脉冲: ");
Serial.print(count);
Serial.print(" 转速: ");
Serial.print(rpm, 0);
Serial.println(" RPM");
lastCalc = now;
}
}
如果只想做一个磁控开关(磁铁靠近就触发动作),不必上中断,一个 digitalRead 就够:读到 LOW 就是检测到磁铁。要让 AI 帮你扩展,可以这样描述:「ESP32 用 GPIO13 接 A3144(INPUT_PULLUP),磁铁靠近 OUT 变低时点亮继电器并打印一次,磁铁移开后关闭」,把引脚、上拉方式、触发动作说清楚,生成的代码基本能直接跑。
你应该看到什么
先验证开关功能:烧录磁开关版本后,把一颗磁铁慢慢靠近传感器正面。当磁铁的某一面(S 极)距离传感器约几毫米到一两厘米时,OUT 会"啪"地翻转,串口或 LED 立刻响应。磁铁拿开,又恢复。如果靠近没反应,把磁铁翻个面再试——A3144 有极性,只对一个磁极敏感。
再看测速:把贴了磁铁的转轮(或风扇)转起来,串口会每秒打印一次脉冲数和换算出的 RPM。手动慢慢转,数字小;用手指弹快一点,RPM 跟着往上跳。停下来不转,几秒后读数归零。一颗磁铁每圈触发一次,这就是最基本的非接触测速。
读数解读
A3144 是开关型,它给你的只有"有磁(OUT 低)"和"无磁(OUT 高)"两种状态,不反映磁场的强弱,也不告诉你磁铁离得多近。想靠它判断距离或磁场大小,做不到。
测速的"读数"其实是你自己算出来的,核心公式是:RPM = (单位时间脉冲数 ÷ 每圈磁铁数)× 单位时间换算成分钟的系数。代码里用了 1 秒窗口,所以 每秒脉冲 ÷ 磁铁数 × 60 就是 RPM。转速很低时窗口里脉冲太少、读数会跳,可以把窗口拉长到 2–3 秒;转速很高时则相反,窗口可以缩短让响应更快。
选型 / 避坑
霍尔家族里 A3144 只是入门款,选型前先想清楚你要的是"开关"还是"数值":
- 只要判断"有磁 / 没磁"——磁控开关、限位、计数、按圈测速——开关型 A3144 完全够用,几毛钱搞定。
- 要测"磁场有多强 / 磁铁在什么角度"——比如做磁力计、油门旋钮、无接触电位器——得用线性霍尔(如 49E,输出随磁场强度连续变化的模拟电压),或更精密的磁编码器 AS5600(直接给出 0–360° 角度,做无接触旋钮、云台、旋转编码器替代方案很好用)。
- 要测"电路里流过多大电流"——那是另一条路:用霍尔电流传感器 ACS712,它把电流产生的磁场转成模拟电压,非接触测电流不破坏原电路。
① 有极性,装反不灵:A3144 只对一个磁极(通常 S 极)敏感,磁铁朝向不对就一点反应没有。测不到先翻面、或换个磁铁试,别急着判死。
② 开漏输出必须上拉:OUT 只能拉低不能拉高,不接上拉电阻(或不用 INPUT_PULLUP)读数会一直为 0 或乱飘。这是新手最常见的坑。
③ 距离要够近:霍尔是近场感应,普通小磁铁有效触发距离通常只有几毫米到一两厘米。测速时磁铁和传感器间隙要留小一点、且稳定,否则会漏脉冲。
故障排查
| 现象 | 可能原因 | 排查 |
|---|---|---|
| 磁铁靠近完全没反应 | 磁极装反 / 距离太远 / 漏了上拉 | 翻转磁铁试另一面;靠到几毫米内;确认上拉电阻或 INPUT_PULLUP |
| OUT 读数一直为 0 | 开漏输出未上拉 | 加 10kΩ 上拉到 3.3V,或用 INPUT_PULLUP |
| OUT 读数乱飘不稳定 | 没上拉 / 走线太长受干扰 | 加外接上拉电阻;缩短 OUT 走线 |
| 测速 RPM 时大时小 | 转速低、窗口内脉冲太少 | 把统计窗口拉长到 2–3 秒;多贴几颗磁铁提高分辨率 |
| RPM 比实际偏小 | 高速时漏脉冲 / 磁铁离太远 | 缩小磁铁与传感器间隙;确认中断是下降沿且 ISR 够短 |
| 引脚接对了仍无输出 | VCC/GND/OUT 顺序与手册不符 | 对照实物 datasheet 重新确认三脚定义 |
进阶 / 变体
- 多磁铁提高测速分辨率:在转轮上等间距贴 N 颗磁铁,每圈就触发 N 次,把代码里的
MAGNETS改成 N。低转速时读数更平滑、更新更快,但要注意磁铁间距别太近导致两次触发粘连。 - 做里程计 / 计数器:把它装在自行车轮上、每圈贴一颗磁铁,累计脉冲数 × 轮周长就是行驶距离,这正是码表测速测距的原理。
- 磁控限位开关:在滑轨的端点贴磁铁、滑块上装 A3144,到位即触发,做电动门、3D 打印机归零这类无接触限位,比机械微动开关耐用。
- 接入逻辑:A3144 是数字输出,读法和按键一样简单,可配继电器控强电,或把转速/状态接入 AI 应用做异常监测。
典型应用
- 转速表 / 测速:电机、风扇、水泵转速监测,贴磁铁非接触测 RPM。
- 门磁开关:门框贴磁铁、门体装霍尔,开门即触发报警或亮灯。
- 无接触限位:电动门、滑轨、机械臂归零,磁铁到位即触发。
- 磁控开关:隔着外壳用磁铁触发,防水设备的隐藏式开关常用它。
- 流量计:水流推动带磁铁的叶轮旋转,每转一圈触发一次,按脉冲频率算流量。
小结
A3144 是一颗"看磁场的开关":磁铁(特定极性)靠近到位、磁场超过阈值,输出脚翻转为低电平,撤去恢复——靠的是霍尔效应加施密特比较。用好它记住三件事:它有极性、装反不灵,磁极不对先翻面;它是开漏输出、OUT 脚必须上拉(外接 10kΩ 或 INPUT_PULLUP);它感应距离很近,磁铁要凑到几毫米内。最经典的玩法是用中断计数加时间窗口测转速。它是典型的数字信号传感器,需要测磁场大小或角度请换线性霍尔 49E / 磁编码器 AS5600,测电流请用 ACS712。
相关阅读:理解上拉/下拉电阻(开漏输出的关键)、数字与模拟信号的区别、GPIO 基础,以及用霍尔替代接触式的旋转编码器。更多模块见传感器总览与原理篇。
参数以 datasheet 为准;本页为公开资料整理,接线与代码请结合实物验证。