# 顺着原理图读懂 HallPos

我们先看直线这款传感器。把磁铁固定在滑块上，PCB 固定在底座上：磁铁经过 U1、U2、U4 时，三路电压发生变化，U3 采集这些电压，算出位置，再由 U6 发给电脑。

复刻前先看 [准备清单](Replication-Checklist.md)：直线版用直径 10 mm、厚 3 mm 的轴向充磁磁铁，旋转版用直径 6 mm、厚 3 mm 的径向充磁磁铁，各一颗；另购一个 USB 转 RS485 模块。测试夹具可打印机械目录中的两个 STEP 模型。

接下来，我们顺着 [HallPos 原理图 PDF](../hardware/schematics/SCH_HallPos.pdf) 看一下。先找到左下角的供电接口 U5，再看稳压器 U7、三颗霍尔、单片机 U3，最后看 RS485。每张局部图都从这张完整图裁出，保留了供电、地和信号网名。

![HallPos 完整原理图](../docs/assets/hardware/linear-schematic.png)

读图先认几个记号：`R` 是电阻，`C` 是电容，`D` 是二极管，`U` 在本图中用于芯片和部分连接器，`TP` 是测试点。`ADC1`、`VCC3.3` 这样的同名网络彼此相连，所以不用在纸上寻找一根横跨整页的导线。线上的实心连接点表示相接；交叉而没有连接点的导线不能直接当作短接。

## 从 U5 的 5 V 输入读到 3.3 V

![U5、输入保护 D1 和 U7 稳压电路](../docs/assets/hardware/linear-power.png)

先看 U5：1 脚是 `VCC_5V`，2 脚是 `GND`。沿着同名 `VCC_5V` 找到右侧 U7，它的 1 脚 `VIN` 接输入，5 脚 `OUT` 接 `VCC3.3`。U7 的型号是 `XC6210B332MR`。三颗霍尔、MCU 和 RS485 收发器都接这条 3.3 V 网。

U7 周围的电容分成输入、输出两组：C7 为 1 µF、C9 为 4.7 µF，接在 5 V 与地之间；C8 为 1 µF，接在 3.3 V 与地之间。它们为电源提供局部储能和去耦。D1 标为 `SMF5.0A`，也跨在 5 V 与地之间，用于输入瞬态抑制。D1 不是串联稳压器，不能把 12 V 或 24 V 变成板子需要的 5 V。

第一次上电就按这条路径测：先测 U5 输入，再测 U7 输出。用带限流的标称 5 V 电源，记下实际电压和电流；若 3.3 V 不正常，先查供电和焊接，再接下载器、排查程序。

图中的 NC1 属于通信终端，虽然画在这一块区域里，却没有接进稳压电路。它的两端是 `485_A` 和 `485_B`，后面再看。

## 三颗霍尔各输出一路电压

![U1、U2、U4 与各自的电源去耦](../docs/assets/hardware/linear-hall.png)

三颗器件都是 `SC4703SO-TR`。每颗只需要认清三根脚：1 脚 `VDD` 接 3.3 V，3 脚 `GND` 接地，2 脚 `OUT` 输出模拟电压。C3、C4、C5 都是 100 nF，跨在各组电源与地之间。这里没有把霍尔输出直接接成数字开关信号。

从 `OUT` 往后追，可以得到固定的通道关系：

- U1 → `ADC1` → U3 的 PA0，芯片 6 脚，ADC 通道 0。
- U2 → `ADC2` → U3 的 PA1，芯片 7 脚，ADC 通道 1。
- U4 → `ADC3` → U3 的 PA4，芯片 10 脚，ADC 通道 4。

注意 `ADC3` 是原理图的网络名字，接到 MCU 后用的是硬件 ADC 通道 4。把网名中的数字当作 ADC 通道号，会在改代码时接错顺序。

“线性霍尔”描述的是磁场与输出电压的关系，电压本身还不是毫米。磁铁离哪一颗近、磁极朝哪边、离 PCB 多高，都会影响读数。先记录磁铁移远时的三路原码，再分别靠近三颗器件，看通道是否与上述连接一致。

## U3 如何采样这些电压

![U3、启动复位电路及其信号网](../docs/assets/hardware/linear-mcu.png)

U3 为 `GD32E230G6U6TR`。先看左边的 PA0、PA1、PA4，它们正好接上刚才的三路 `ADC` 网。再看电源：5 脚 `VDDA` 和 17 脚 `VDD` 接 3.3 V，16 脚 `VSS` 与裸露焊盘 EP 接地；C1、C2 为 100 nF 电源去耦。

[`hall_encoder.c`](../software/firmware/src/hall_encoder.c) 负责两种构型共用的采样：把 PA0、PA1、PA4 放进规则组顺序转换，DMA 通道 0 循环保存结果，数组顺序就是 U1、U2、U4。每路做 64 倍过采样，最后右移 6 位，输出仍为 12 位原码，范围 0～4095。

这三路来自同一个 ADC，按顺序采集。平均能减小部分随机噪声，但需要时间，也不会替你修正磁铁高度变化。先把机械安装固定，再比较不同位置的数据，会比一边移动一边抬高磁铁更容易看出规律。

<div data-hall-animation="signal-chain"></div>

直线模型在 [`hall_line.h`](../software/firmware/inc/hall_line.h) 中约定 U1、U2、U4 沿线排列，间距 10 mm，坐标为 -10、0、+10 mm。`hall_line.c` 先扣除无磁场基线，再根据峰形估算位置。先学会检查原码，再按 [校准与测量](Calibration-and-Measurement.md) 做基线、敏感宽度和机械零点。

## 启动、复位与 SWD

仍看 U3：R2 为 10 kΩ，把 BOOT0 拉向地；R3 也是 10 kΩ，把 NRST 拉到 3.3 V。HallPos 的 TP1 就在 NRST 上。OSCIN、OSCOUT 在这张图中没有接外部晶振。

![CN1 的 SWD、3.3 V 与地连接](../docs/assets/hardware/linear-swd.png)

CN1 是下载调试口，型号标为 `WAFER-0.8-4PLB`。把上图与 U3 右边的 `SWDIO`、`SWCLK` 对上，就能完成接线：

- CN1-1：板内 3.3 V 网，按下载器说明用作目标电压参考或供电。
- CN1-2：GND。
- CN1-3：SWDIO，接 U3 的 PA13，21 脚。
- CN1-4：SWCLK，接 U3 的 PA14，22 脚。

5、6 是接地固定脚。CN1 没有单独引出 NRST，需要复位测点时再找 TP1。接线应按焊盘 1 标记和通断测量确认，插头正反视角可能相反。CN1 的 3.3 V 脚不能接 5 V。

板上若没有固件，先完成 [构建与烧录](Build-and-Flash.md)，再继续下面的通信实验。

## UART 怎样变成 RS485

![U6 的 UART、方向控制、A/B 和电源连接](../docs/assets/hardware/linear-rs485.png)

U6 为 `SIT3088ETK`。左边面对 MCU，右边面对总线。先看发送：U3 的 PA9 经 `UART_TX` 接 U6 的 4 脚 `DI`，U6 再通过 6 脚 A、7 脚 B 驱动总线。接收方向相反：总线信号进入 A/B，由 1 脚 `RO` 经 `UART_RX` 送到 U3 的 PA10。

图上的 `RE#` 和 `DE` 连在一起，接 `RS485_RE`，再连到 U3 的 PB5。`RE#` 是低有效的接收使能，`DE` 是高有效的发送使能。因此 PB5 拉低时接收，拉高时发送；固件初始化会先把 PB5 拉低，具体切换由 [`rs485_proto.c`](../software/firmware/src/rs485_proto.c) 完成。

这张放大图还可以练习辨认连接点：R4 的下端接 `UART_RX` / `RO`，R5 的上端接 `UART_TX` / `DI`，两颗 5.1 kΩ 电阻分别把 UART 接收、发送网拉向 3.3 V。C6 为 100 nF，跨接收发器的 3.3 V 与地。TP2、TP3、TP4 分别落在 UART_RX、RS485_RE、UART_TX 上，方便区分 MCU 侧和总线侧的问题。

<div data-hall-animation="rs485"></div>

![U5 的四个信号脚与跨接 A/B 的 NC1](../docs/assets/hardware/linear-bus-connector.png)

再回到 U5。PCB PDF 的 BOM 将它标为 `WAFER-GH1.25-4PWB`：1 脚 5 V、2 脚 GND、3 脚 A、4 脚 B；5、6 为接地固定脚。电脑端使用 USB-RS485 转换器，把 A/B 接到对应端，并确认参考地接法。USB-TTL 的 TX/RX 不能直接接这里的 A/B。

NC1 标为 120 Ω，跨在 A/B 之间，是终端匹配位置。是否实际焊接要看实板；多节点总线应按物理两端安排终端。R4、R5 位于 UART 一侧，不能把它们当成 A/B 侧的总线偏置电阻。

供电、固件和接线都通过后，先用单板、短线、115200 8N1 查询 `GET_INFO`，再读 `GET_DATA`。这里使用项目自定义帧，格式见 [协议参考](Protocol-Reference.md)。RS485 是电气接口，使用它不代表已经实现 Modbus。

## 把原理图上的位置找回 PCB

![HallPos 元件面，第 4 页裁图](../docs/assets/hardware/linear-pcb-top.png)

这张元件面合成图来自 [PCB_HallPos.pdf](../hardware/pcb/PCB_HallPos.pdf) 第 4 页。右侧三组霍尔焊盘由下到上对应 U1、U2、U4；上部中央是 U3，左上是 U6，中部偏下是 U7，底部是 U5，左侧窄接口为 CN1。需要查位号时，可对照 [第 1 页位号定位图](../docs/assets/hardware/linear-placement.png)。

对照一下就能看到，原理图画的是“谁与谁相连”，PCB 则能看到这些器件实际摆在哪里、导线怎样绕过去。比如霍尔电路在原理图里分成三组，PCB 上却沿同一条边排成直线；U5 与 U7 靠近输入区域，便于把刚才的供电路径与板上位置对应起来。双面图和旋转版的对比放在 [PCB 与机械](PCB-and-Mechanics.md)。

![HallPos 实物元件面，三颗霍尔沿右侧长边排列](../docs/assets/hardware/hallpos-assembled-pcb.webp)

*从实物右边找一遍：底部是 U1，中间是 U2，上面是 U4。再回到原理图，对照它们各自接到哪一路 ADC。*

LED1 不在三路测量链里。它从 5 V 经 LED、R1（5.1 kΩ）接到 `LED_STA`，由 PB4 下拉点亮。程序约每 500 ms 翻转一次，可用于看程序是否还在运行；判断测量是否有效仍要看三路原码、幅值和状态。

## 上电以后先做这几件事

1. 确认 U5 的脚位和芯片方向，断电检查 5 V、3.3 V 对地是否短路，再限流供电。
2. 测 U7 输入、输出，完成 SWD 下载；用 `GET_INFO` 确认设备能通信。
3. 磁铁移远，记录三路原码；分别靠近 U1、U2、U4，核对数组顺序。
4. 固定气隙，沿 U1→U2→U4 移动。切到直线 `profile=2` 后，完成基线校准，在已知位置比较报告值。

详细操作见 [实验 1～3](Labs.md)。先保留这块直线板的测量记录，再换编码器 PCB。后者继续使用上述电源、采样和通信电路，但要改变三颗霍尔的空间排列、磁体的运动方式和解算方法，并重新校准。

## 当前资料到哪一步

原理图、PCB PDF、STEP 和源码可以互相对照；PCB PDF 第 3 页也有 BOM 摘要。磁铁尺寸和充磁方向已列入准备清单，材料/牌号、有效气隙、整板电流和测量误差仍需实物记录。软件的 ±15 mm 钳位与 0.01 mm 编码单位不能当作量程或精度指标。制造前还需补齐可编辑 PCB、核对过的采购/装配 BOM、Gerber、钻孔、板厚叠层和机械尺寸。供电按图中的标称 5 V 处理；12 V、24 V 应先经合适的电源转换。

本页图片的来源、页码和 PDF 裁框保存在 [图像清单](../docs/assets/hardware/manifest.json)，可用 [导出脚本](../scripts/render_hardware_assets.py) 重新生成。
