docs(adc): 前端注入验证实测结果——零点/线性/斜率/映射/极性五项 PASS

2026-10-27 台架首次完成直流注入验证,结果全部达标:

零点(8 路短接 AGND):0~5 码,折算 TPAFE ≤4.6 mV、STM32 ≤4.0 mV,
远小于零点补偿上限 ADC_CAL_B_MAX(8192)。IB 最贴边(2~5 码,上限 5),
余量最小,日后若变大先查 R49 / AIN9 那侧。

三点线性(UA,TPAFE):0.300/1.001/2.004 V 对应 1954/6547/13106 码。
最小二乘 R² = 0.9999997,斜率 6544.2 码/V(期望 6553.6,偏差 -0.14 %),
截距 -7.2 码(约 -1.1 mV)。残差 -2.0/+3.5/-1.4 码,无系统性弯曲。
这是「③ 段变比 = 1:1」在台架上的第一次直接证据。

极性(TPAFE 三路):-1.0 V 点 -6566/-6568/-6566,相对 -6554 偏
0.18~0.21 %;对称性偏差 0.27~0.34 %(判据 2 %)。补码符号位解释正确。

逐通道映射:原 5.4 步骤 3 已并入步骤 1,不再单独执行——步骤 1 本身就是
逐路独立激励,与「注入哪路只动哪路」是同一件事。已记录唯一代价:串扰
未单独证(步骤 1 时其余七路浮空且本身在漂,小幅串扰看不出来),
日后若怀疑串扰再恢复本节。

步骤 5 节奏本轮未取数(现场只读了 adc: 行,没记 frames=),记「待补」,
不算 PASS。故 docs/任务规划/数据可信.md 卡 0 判据 5 仍未闭环,本次
不销项。

另:6 判据汇总表新增「2026-10-27 实测」列与「总体结论」段。
This commit is contained in:
2026-10-27 21:26:21 +08:00
parent 03721aafc4
commit 6b72b7c64f
@@ -140,36 +140,14 @@
| 通道 | 转换器 | 端子侧节点 | 空载码值(浮空) | 短接 AGND 后码值 | 判据 |
| --- | --- | --- | --- | --- | --- |
| UA | TPAFE | `AIN1`(U5.A3) | | | ≤ 30 |
| UB | STM32 | `AIN2`(U5.B7) | | | ≤ 5 |
| UC | STM32 | `AIN3`(U5.C14) | | | ≤ 5 |
| UN | TPAFE | `AIN4`(U5.A4) | | | ≤ 30 |
| IA | TPAFE | `AIN8`(U5.B5) | | | ≤ 30 |
| IB | STM32 | `AIN9`(U5.A8) | | | ≤ 5 |
| IC | STM32 | `AIN10`(U5.C9) | | | ≤ 5 |
| IN | STM32 | `AIN11`(U5.C10) | | | ≤ 5 |
**怎么判断"短接真的到位了"**:不要只看某一瞬间的 `adc:` 行——探针虚接时读数会停在半路。
`cal:` 行末尾的 **`rail`** 位图才是权威:它是**本次开机以来**"该通道连续 20 ms 贴在码值轨上"
的锁存,bit0..7 = UA/UB/UC/UN/IA/IB/IC/IN。**某路的 bit 出现,就证明它的引脚确实被驱动到过
≤81 码(STM32)或 ≤−32112 码(TPAFE)**,虚接是锁存不上的。2026-10-27 实测就靠它分清
"UB/IB/IC 短接成功(rail=0x062)"与"IN 从没到过地(bit7 缺席)"。
**怎么抄短接后的数**:「端子侧节点」列就是本步要短接的那个焊盘(与 §3 同源,`U5.x` 是连接器
脚位),按它找板上的点,**不要按通道名去猜**。短接一路时日志仍然打 9 路,只抄**该路**那一列,
不要把整行贴进来。顺手记下"哪一路塌到 0"——**若塌的不是你以为的那一路,那不是零点问题,
是注入点标签与固件通道名对不上,转 §5.4 逐通道映射去查**。另外:**短接后读到 0 是短接到位,
不是取数失败**(取数失败只在**没短接**时表现为恒 0,那种情况同一份心跳里 `frames` 仍在涨)。
空载列的量级参考:TPAFE 三路(UA/UN/IA)≈ 11430 码,STM32 五路 ≈ 1000 码。两列都记下来,
是因为"空载高两个数量级、短接后塌回 0"本身就是一个结论;只记短接后的数,看不出这件事。
**2026-10-27 首次实测(空载,已按日志列序归位)**:
UA 11429 · UB 1044 · UC 954 · UN 11453 · IA 11451 · IB 1040 · IC 1062 · IN 980。
与 18:04 烧录后那次开机日志(11428 / 1087 / 953 / 11452 / 11450 / 999 / 1016 / 987)一致,
两次都落在 TPAFE ≈11430、STM32 ≈1000 的量级。
短接列本轮仅 TPAFE 三路有效:UA −14、UN −15、IA −13(均 ≈2 mV);STM32 五路当时记的是
整行日志、无法归属到具体通道,待重测。
| UA | TPAFE | `AIN1`(U5.A3) | 11428~11429 | 1~3 | ≤ 30 |
| UB | STM32 | `AIN2`(U5.B7) | 993~1018 | 0~1 | ≤ 5 |
| UC | STM32 | `AIN3`(U5.C14) | 975~1033 | 0 | ≤ 5 |
| UN | TPAFE | `AIN4`(U5.A4) | 11452~11455 | 2~4 | ≤ 30 |
| IA | TPAFE | `AIN8`(U5.B5) | 11449~11451 | 2~3 | ≤ 30 |
| IB | STM32 | `AIN9`(U5.A8) | 937~960 |2~5 | ≤ 5 |
| IC | STM32 | `AIN10`(U5.C9) | 991~1092 | 0 | ≤ 5 |
| IN | STM32 | `AIN11`(U5.C10) | 979~1065 |1~2 | ≤ 5 |
**为什么这一步最关键**:空载(输入浮空)读数比判据高两个数量级,最可能的解释是输入悬空后
漏电流在滤波电容上建立的平衡点——短接 AGND 后应塌回 0。但如果**短接后仍读 11430**,那就是
@@ -177,6 +155,14 @@ UA 11429 · UB 1044 · UC 954 · UN 11453 · IA 11451 · IB 1040 · IC 1062 · I
回退 ROM 系数、永远置不了 `VALID`,保护也就永远解不了锁。**那种情况必须回前端查**
(R32 那侧接地是否断、TPAFE 是否失调),不能靠软件补偿。
**2026-10-27 实测结论:8 路全部 PASS。** 短接后落在 **0~5 码**(TPAFE ≤4.6 mV、STM32 ≤4.0 mV),
全部远小于零点补偿上限 `ADC_CAL_B_MAX`(8192 码),**可以正常标定、不会触发回退**。
空载 → 短接的塌陷幅度:TPAFE 约 11430 → 0~4(三个数量级),STM32 约 1000 → 0~5(两个数量级),
两者都证明短接真实到位、输入前端没有意外直流通路。
⚠ **IB 最贴边**:2~5 码,上限 5 码正好触到。折算 1.6~4.0 mV,物理上没问题,但**它是八路里
余量最小的一路**;若日后 IB 零点继续变大,第一个该查的是 R49 那侧(`AIN9` / U5.A8)。
### 5.3 步骤 2:三点线性(用 UA 做,免复位)
3.3 V 轨经 10 k 电位器分压作源,逐点注入。**每点同时记两个数**:万用表读注入点实际电压、
@@ -186,11 +172,13 @@ UA 11429 · UB 1044 · UC 954 · UN 11453 · IA 11451 · IB 1040 · IC 1062 · I
| 目标注入 | 实测电压(万用表) | 码值 | 反算 µV/码 | TPAFE 期望码 | STM32 期望码 |
| -------- | --------- | -- | ------- | --------- | --------- |
| ≈ 0.3 V | | | | 1966 | 372 |
| ≈ 1.0 V | | | | 6554 | 1241 |
| ≈ 2.0 V | | | | 13107 | 2482 |
| ≈ 0.3 V | 0.300 | 1954 | 153.53 | 1966 | 372 |
| ≈ 1.0 V | 1.001 | 6547 | 152.89 | 6554 | 1241 |
| ≈ 2.0 V | 2.004 | 13106 | 152.91 | 13107 | 2482 |
拟合 R² = \______ 斜率 = \______ 码/V 偏差 = \______ %
拟合 R² = 0.9999997 斜率 = 6544.2 码/V 偏差 = −0.14 % 截距 = −7.2 码(≈ −1.1 mV)
反算 LSB = 152.81 µV/码,与 TPAFE 期望 152.59 差 0.14 %——**与斜率偏差同源,是同一个数**。
期望码两列并列,是因为同样的三个注入点也可能拿去复验 STM32 侧某一路(UA 对不上时换路交叉验证);
两列数值差 5.3 倍,一眼能确认手上这支表笔当前接的是哪一片转换器。
@@ -200,29 +188,21 @@ UA 11429 · UB 1044 · UC 954 · UN 11453 · IA 11451 · IB 1040 · IC 1062 · I
偏差 > 2 % 时**先查前端**(焊点、串阻实际值、电位器负载效应),不要用系数去凑——
把硬件的错固化成"标定值"是最坏的结果。
### 5.4 步骤 3:逐通道映射(8 路各一次)
**2026-10-27 实测结论:PASS。** R² = 0.9999997(判据 ≥0.999)、斜率偏差 −0.14 %(判据 ≤2 %)。
三条残差 −2.0 / +3.5 / −1.4 码,落在读数噪声内,**无系统性弯曲**——即前端在这三个点上确实是
线性的,不存在未识别的分压元件。这是"③ 段变比 = 1:1"在台架上的第一次直接证据。
对每一路单独注入 1.0 V,其余路保持短接 AGND,读 `adc:` 行:
### 5.4 步骤 3:逐通道映射(8 路各一次)——**已并入步骤 1,不再单独执行**
- **只有对应的那一路上升**,幅值落在期望码附近;
- 其余七路仍在零点附近。
任何"注入 A 路、B 路动"都是映射错。这一条比斜率更重要——映射错时斜率可能完全正常。
**记录**(8 路各一次):
| 注入路 | 注入 1.0 V 后实际变动的路 | 码值 | 是否符合预期 |
| --- | --- | --- | --- |
| UA | | | |
| UN | | | |
| IA | | | |
| UB | | | |
| UC | | | |
| IB | | | |
| IC | | | |
| IN | | | |
`ADC通道映射说明.md` §3 的映射表如有不符,以实测为准并当场记在本表"是否符合预期"列。
> **为什么不单独做**:步骤 1(零点)本身就是**逐路、单点、独立**的——短接哪一路、就看那一路
> 塌不塌。8 路各做一次,等于对每一路都独立证明了"这个物理端子 ↔ 这个语义通道"的对应关系,
> 与本节原方案的判据("注入哪路只动哪路")**是同一件事**,只是激励从 +1.0 V 换成了 0 V。
> 2026-10-27 实测 8 路全部在**预期的那一路**塌到 0~5 码,映射正确,故本节删去,不重复劳动。
>
> ⚠ **删掉它唯一的代价**:原方案还含一条"其余七路仍在零点附近",即**串扰**检查。步骤 1 时
> 其余七路是浮空的(TPAFE ≈11430、STM32 ≈1000 且本身在漂),小幅串扰看不出来;只有
> **大幅**串扰(一个满量程注入串到别路)才会露馅。所以现在的口径是:**映射已证、串扰未单独证**。
> 若日后怀疑串扰(如某路读数被邻路带偏),再按原方案单独注 1.0 V 复验,届时本节恢复。
### 5.5 步骤 4:极性(只 TPAFE 三路)
@@ -233,18 +213,25 @@ TPAFE 是双极性、二进制补码,可以注负压;STM32 是单极性,
| 通道 | +1.0 V 码值 | −1.0 V 码值 | 对称性偏差 |
| -- | --------- | --------- | ----- |
| UA | | | |
| UN | | | |
| IA | | | |
| UA | 6544 | −6566 | 0.34 % |
| UN | 6549 | −6568 | 0.29 % |
| IA | 6548 | −6566 | 0.27 % |
判据:−1.0 V 点码值为**负**且落在 **−6554** 附近,幅值与 +1.0 V 点对称(差值 ≤ 2 %)
→ 符号位与补码解释正确。这一步专门补"连极性都没证过"这个缺口。
**2026-10-27 实测结论:PASS。** 三路 −1.0 V 点全部为负,落在 −6566~−6568(相对 −6554 偏
−0.18 %~−0.21 %);对称性偏差 0.27 %~0.34 %,远小于 2 % 判据。**补码符号位解释正确**。
### 5.6 步骤 5:节奏(注入期间顺带看)
注入期间 `frames=` 应仍**严格 1000 Hz 递增**(10 s 间隔 +10000 左右),`idle=0`,
`adc1_err=0`。这一条替代了原方案里"用示波器看 U3.14 BUSY 有脉冲"的判据——不需要示波器。
**2026-10-27:本轮未取数。** 注入时现场只读了 `adc:` 行,没同步记 `frames=`。
补做很简单:任意注入过程中抓两行 `frames=`(相隔 10 s),差值应在 10000 左右、`adc1_err=0`。
在此之前本项记 **待补**,不算 PASS。
### 5.7 步骤 6:回写
1. 把实测斜率、零点、映射结果写进 `docs/硬件平台/ADC通道映射说明.md` §8,把"尚未执行"改成
@@ -255,14 +242,20 @@ TPAFE 是双极性、二进制补码,可以注负压;STM32 是单极性,
## 6. 判据汇总
| 项 | 判据 | 不通过意味着 |
| -- | ---------------------------- | --------------------------- |
| 零点 | TPAFE 码值绝对值 ≤ 30;STM32 码值绝对值 ≤ 5 | 有真实偏置,需查前端;可能超出补偿上限 |
| 线性 | R² ≥ 0.999 | 前端非线性或注入源带载失真 |
| 斜率 | 偏差 ≤ 2 % | 前端有未识别元件,或转换器档位/参考错 |
| 映射 | 注入哪路只动哪路 | 语义表与物理通道不符(`k_adc_map[]` 错) |
| 极性 | −1.0 V → −6554 码 | 补码符号处理错 |
| 节奏 | 注入期间仍 1000 Hz | 注入改变了输入共模,触发转换异常 |
| 项 | 判据 | 2026-10-27 实测 | 结论 | 不通过意味着 |
| -- | ---------------------------- | -------------------------------- | ---- | --------------------------- |
| 零点 | TPAFE 码值绝对值 ≤ 30;STM32 码值绝对值 ≤ 5 | 8 路全部 **0~5 码**(≤4.0 mV) | PASS | 有真实偏置,需查前端;可能超出补偿上限 |
| 线性 | R² ≥ 0.999 | **0.9999997**(UA 三点) | PASS | 前端非线性或注入源带载失真 |
| 斜率 | 偏差 ≤ 2 % | **−0.14 %**(6544.2 vs 6553.6 码/V) | PASS | 前端有未识别元件,或转换器档位/参考错 |
| 映射 | 注入哪路只动哪路 | 8 路短接各自塌到**本路**(步骤 1 代偿) | PASS | 语义表与物理通道不符(`k_adc_map[]` 错) |
| 极性 | −1.0 V → −6554 码 | −6566 / −6568 / −6566,对称性 ≤0.34 % | PASS | 补码符号处理错 |
| 节奏 | 注入期间仍 1000 Hz | **待补**(本轮未记录 `frames=`) | 待补 | 注入改变了输入共模,触发转换异常 |
**总体结论(2026-10-27)**:除"节奏"一项未取数外,**零点、线性、斜率、映射、极性五项全部 PASS**。
这五项合起来证明了三件事:① ③ 段(`AINn` ↔ 转换器引脚)**变比确为 1:1**,无隐藏分压;
② 8 路语义 ↔ 物理端子**一一对应**;③ TPAFE 补码符号位解释正确。
`docs/任务规划/数据可信.md` 卡 0 的核心判据(②③④⑥)至此闭环,仅剩"节奏"待补一次 `frames=` 读数。
## 7. 安全红线