docs(adc): 更正步骤 0 判据——端子对 AGND 不是 1 kΩ

原判据写"端子侧应量到 1 kΩ 量级(串阻 + 转换器输入阻抗并联)",两处错:

1. 端子到 AGND 是串联通路:R31(1k) → AIN_7P → 芯片内部 1 MΩ →
   AIN_7GND → R32(1k) → AGND,合计约 1.002 MΩ。1 kΩ 只在串阻两端成立。
2. 芯片输入阻抗是 1 MΩ 恒定(TPAFE5160 手册 "Analog Input
   Impedance" 节),量级上与 1 kΩ 并联不出 1 kΩ。

改为三行分测表:串阻两端 ≈1 kΩ / TPAFE 侧对 AGND ≈1 MΩ /
STM32 侧对 AGND 高阻不定量。并写明本步只排除短路、不验收正确性。

顺带把手册的匹配要求写进去:AIN_nP 与 AIN_nGND 两侧外接源阻抗
要相等以抵消失调误差,R31 / R32 各 1 kΩ 即为此——这就是 R32 的
存在理由(匹配,不是分压),补强"本板无分压"的结论。

ADC通道映射说明.md §7「前端偏置」行同步补 1 MΩ 与匹配依据。
This commit is contained in:
2026-10-27 17:12:54 +08:00
parent 9163a92d3b
commit dc9ae01f50
2 changed files with 20 additions and 5 deletions
@@ -86,12 +86,25 @@
### 5.1 步骤 0:断电核阻(5 分钟)
断电,万用表电阻档逐路量 **注入点对 AGND**:
断电,万用表电阻档量两处,**期望值不一样**:
- 端子侧应量到 **1 kΩ 量级**(串阻 + 转换器输入阻抗并联,不会精确 1 k);
- 引脚侧应量到 **高阻**(只有滤波电容和转换器输入)。
| 量哪里 | 期望 | 验的是什么 |
|---|---|---|
| **串阻两端**(1 脚 ↔ 2 脚,即端子侧焊盘 ↔ 引脚侧焊盘) | **≈ 1 kΩ** | 串阻焊好、没虚焊 |
| **注入点 ↔ AGND**(TPAFE 侧,UA/UN/IA) | **≈ 1 MΩ 量级** | 无意外短路;**不是 1 kΩ** |
| **注入点 ↔ AGND**(STM32 侧,UB/UC/IB/IC/IN) | 高阻,不定量 | 无设计直流通路,只作短路排查 |
任一路量到 **0 Ω 或几十 Ω** → 停,先查焊接/短路,不要通电。
**为什么端子对 AGND 不是 1 kΩ**:端子到 AGND 是一条**串联**通路,不是串阻与输入阻抗并联——
R31(1 kΩ) → TPAFE `AIN_7P` →(芯片内部 **1 MΩ** 恒定输入阻抗)→ `AIN_7GND` → R32(1 kΩ) → AGND,
合计 ≈ **1.002 MΩ**。1 kΩ 只在**串阻两端**成立。
TPAFE 手册 "Analog Input Impedance" 节原文:*"Each analog input channel in the device presents a
constant resistive impedance of 1 MΩ"*,并要求 *"Matching the external source impedance on the
AIN_nP input pin with an equivalent resistance on the AIN_nGND pin"*——R31 与 R32 各 1 kΩ 就是这条
匹配要求,用来抵消外部电阻引入的失调误差。**它同时解释了 R32 的存在理由:匹配,不是分压。**
⚠ 任一路量到 **0 Ω 或几十 Ω** → 停,先查焊接/短路,不要通电。这一条才是本步的真正用途:
绝对阻值还受万用表测试电压与芯片未上电状态影响,**只用来排除短路,不用来验收正确性**。
### 5.2 步骤 1:零点(这一步是整套测试的分水岭)
@@ -191,6 +204,7 @@ TPAFE 是双极性、二进制补码,可以注负压;STM32 是单极性,
| `meas: ua_mv=0` | 基波有效值,直流注入下本就为 0 | 正常;验交流要等信号源 |
| `adc:` 行某路恒 0 而 `frames` 在涨 | 该路取数失败 | 查该路是否真的接线/短路 |
| 斜率恰好差一倍 | 误用了 2:1 分压口径(305.18 / 1611.3) | 本板无分压,见 §2;按 152.59 / 805.66 重算 |
| 端子对 AGND 量到 ~1 MΩ,以为串阻没焊 | 串阻与芯片 1 MΩ 输入阻抗是**串联**,不是并联;1 kΩ 只在串阻两端成立 | 改量串阻 1 脚↔2 脚,≈1 kΩ 即正常(§5.1) |
## 9. 记录表(台架现场填)
@@ -246,3 +260,4 @@ TPAFE 是双极性、二进制补码,可以注负压;STM32 是单极性,
| ---------- | ---------------------------------------------------------------------------------------------------------------------------- |
| 2026-10-27 | 建档。承接 `docs/任务规划/数据可信.md` 卡 0 的执行侧;固化"前端无分压"的网表结论、端子侧注入点清单、期望码值表与五步流程。同日 `App/task/adc_task.c` 心跳新增 `adc:` 行(9 路原始码值),使全程免复位 |
| 2026-10-27 | §2 的 ASCII 拓扑图换成 SVG(`docs/images/ADC前端电路.svg`,生成器 `tools/arch_diagram/gen_adc_frontend_svg.py`)。ASCII 版把 C44 / R32 画成挂在 ADC7 下的一根竖线,读起来像 2:1 分压——正是本节要否掉的结论;新图把 `ADC7` 与 `ADC7_GND` 画成两个节点,并加 STM32 侧对照面板 |
| 2026-10-27 | **§5.1 步骤 0 判据更正**:原写"端子侧应量到 1 kΩ 量级(串阻 + 转换器输入阻抗**并联**)"两处错——① 端子到 AGND 是**串联**通路(1k + 芯片 1 MΩ + 1k ≈ 1.002 MΩ),1 kΩ 只在**串阻两端**成立;② 芯片输入阻抗是 **1 MΩ 恒定**(`docs/芯片手册/TPAFE5160.md` "Analog Input Impedance" 节),不是可与 1 kΩ 并联出 1 kΩ 的量级。改为三行分测表(串阻两端 / TPAFE 侧对 AGND / STM32 侧对 AGND),并写明本步**只排除短路、不验收正确性**;§8 已知坑补对应一行。`docs/硬件平台/ADC通道映射说明.md` §7"前端偏置"行同步补 1 MΩ 与源阻抗匹配依据 |
+1 -1
View File
@@ -134,7 +134,7 @@ STM32(U17)为 LQFP144 脚号。
| ADC 时钟 | CubeMX 的 F4 ADC 面板**有** Clock Prescaler 一项(此前"面板没有该项、固定 DIV2"的判断有误),已选 **PCLK2/4 → ADCCLK = 21 MHz** ✓。面板里 **DIV2 是灰的、选不到**:DB 里 `FadcConstraint Max=36000000`,APB2 = 84 MHz → DIV2 = 42 MHz 超限,该候选值被 `Action="DISABLE"` 禁掉,超规值进不来 | **不设额外防护(2026-10-09 决定)**:约束已由 CubeMX 把关;`.ioc` 虽不保存 `ADC1.ClockPrescaler` 键,重生成也只会回落到约束允许的值。按 144+12 cycles 算 ≈ 7.4 µs/通道、9 通道一轮 ≈ 67 µs |
| `adc_task` | **已实现(B1,2026-10-10;L1 层 v2.3;P1-5 事件驱动消费,2026-10-10)**:`App/task/adc_task.c` 每拍调 `adc_input_poll()`(`App/algo/adc_input.c`)= TPAFE `tpafe5160_snapshot()` 原子快照(8 通道)+ 消费一帧 STM32 ADC1 DMA 乒乓缓冲,**经 `adc_input_raw()` 按语义取数**(不再直接索引驱动缓冲);**消费唤醒由 TIM3 ISR 置位 `ADC_WAKE_FLAG`**(不再 1 ms 轮询);任务在 `Src/freertos.c` 的 `USER CODE` 区创建为 `adcTask`(512 words / **AboveNormal**) | 数据路径已通(台架 `@test`:`frames` 严格 1000 Hz 递增、**`idle=0`**、`adc1_rc=0` / `adc1_err=0`) |
| TPAFE 采样触发 | **周期 CONVST 已实现(2026-10-10)**:`Src/main.c` 的 `HAL_TIM_PeriodElapsedCallback` 在 **TIM3 更新事件(1 kHz)** 内调 `tpafe5160_start_conv_irq()`;`app_main_init()` 用 `HAL_TIM_Base_Start_IT(&htim3)` 启动节拍(在 `tpafe5160_init()` 之后)。同一 TIM3 更新事件还经 **TRGO** 硬件触发 ADC1 一轮 9 通道(DMA 搬运),并调 `adc_tick_irq_notify()` **唤醒消费者**(P1-5 方案 a,2026-10-10;内含"消费者就绪"门)→ 两片转换器由同一硬件事件同源对齐 | 连续波形(1 kHz);详见 `docs/子系统设计/ADC采样节拍设计说明.md` §4(DMA 乒乓搬运)与 §6(事件驱动唤醒) |
| 前端偏置 | 每路 1k 串联 + 滤波 C 跨接差分输入;差分负端(`*_GND` 网)经 1k 拴 AGND。**不是对地分压**(2026-10-27 网表追线定死,拓扑图见 §7.1),**无中点偏置** | STM32 侧只能测 **0~3.3 V 单极性**,交流量负半周被削顶;主板侧只做监视可接受,若要算 RMS/功率需硬件补偏置或明确算法口径 |
| 前端偏置 | 每路 1k 串联 + 滤波 C 跨接差分输入;差分负端(`*_GND` 网)经 1k 拴 AGND。**不是对地分压**(2026-10-27 网表追线定死,拓扑图见 §7.1),**无中点偏置** | TPAFE 输入阻抗 **1 MΩ 恒定**(`../芯片手册/TPAFE5160.md` "Analog Input Impedance" 节),故端子对 AGND 的直流通路 = 1k + 1 MΩ + 1k ≈ **1.002 MΩ**,不是 1 kΩ。两侧各 1 kΩ 是手册要求的**源阻抗匹配**(AIN_nP / AIN_nGND 外接源阻抗相等以抵消失调),**不是分压**。STM32 侧只能测 **0~3.3 V 单极性**,交流量负半周被削顶;主板侧只做监视可接受,若要算 RMS/功率需硬件补偏置或明确算法口径 |
| TPAFE 量程(**2026-10-25 卡 1 定死**) | 板上 RANGE 接 GND → **±5 V 双极性量程**(芯片手册输入量程表:RANGE = 0 → −5 ~ +5 V),16 位二进制补码,**±5 V 满量程 = 10 V 跨度**,LSB = 10 V / 65536 ≈ **152.59 µV/码(@ 转换器引脚)**。“±10 V” 是芯片的另一可选档(RANGE = HIGH,跨度 20 V、LSB ≈ 305.18 µV),**本板未用**——历史版本曾把本板误标为“±10 V 双极性”,与 §7 本行矛盾、且会让 TPAFE 侧系数差一倍,更正记录见 §9 | 用 `tpafe5160_to_voltage()` 换算;端到端口径见 §7.1 |
| 取数契约(**2026-10-10 已修**,E-44 / E-45 / E-58 闭环) | 旧的 `get_buf` / `data_ready` / `clear_ready` **已删除**(删除前确认全仓库零调用者):`get_buf` 只给指针、任务再拷 → 被 BUSY EXTI 抢占就是**两帧混合**;`s_ready` 电平标志被 `start_conv_irq` 触发前清 0 → **重触发即丢未消费帧**;`read_all` 从不看 FRSTDATA(宏有定义、代码零引用)→ 芯片死亡时返回 OK + 常量垃圾。现口径:**`tpafe5160_snapshot(dst, count)`**(临界区原子拷贝,返回 1/0/-1,**仅任务上下文**)+ **`tpafe5160_frame_seq()`**(帧序号只增不清)+ **`tpafe5160_frstdata_err()`**(无跳变帧计数);`tpafe5160_init()` 增**首帧自检**——一帧读下来 FRSTDATA 无跳变(芯片不驱动并行总线;板上 R24 4.7k 上拉会把它钉死为高)→ 返回 `-3` + `[ERR]` | 消费者**只能**用 `snapshot()` 取数(`AGENTS.md` 已立为铁律);真机实测开机 `[ADC] Init OK` 现只在自检帧通过后才打印 → 判据在本板成立、非空转 |