fix(cfg): 配置热重载吞段缺陷修复 + 两点标定工具链与台架实测落档
修复运行期改配置被打回出厂值的缺陷:cfg_file_poll() 按段循环复用同一 份读缓冲,而 s_parse() 通过 s_split_line()/s_key_value() 就地改写缓冲 (把换行与等号换成 NUL)。第一个段解析完,缓冲里已没有键值行,后续 7 个段静默保持出厂值;随后 run_par_store_save() 又把这份出厂值写回 config.ini,用户的标定值被永久覆盖。开机路径 cfg_file_load() 只解析一 轮,所以该缺陷长期不可见,只在运行中改配置时发作。 - s_parse() 改为非破坏性:入参 const char *,逐行 memcpy 到栈缓冲 (CFG_LINE_TEST_MAX + 1)后再交给会破坏缓冲的解析子函数;超长行跳 过(保存侧已拒绝落盘超长受管键行)。 - 新增 TC-CONFIG-063:同时改两段内容,断言第二个注册段也重载成功、 含负值 INT 键存活,把「热重载吞段」钉成机器面。 新增两点标定台架工具链(test/host/): - cal_two_point.py:整数算术镜像 adc_cal_two_point(),支持单路模式与 从执行卡 CALDATA 表批量求解(--from-doc),带合法带与零点自检拦截。 - cal_write.py:复用 iec104_master 作库,经 104 定值段写 r 后写 b 并 读回校验,是所有写入的唯一入口。 adc_task 的 meas: 心跳行精度提到 4 位小数,标定读数需要。 文档:新增《采样数据校正全流程》(端到端导航)与《ADC 两点标定执行 流程》(台架执行卡,含 CALDATA 可填表);ADC通道映射说明新增 §7.3 台 架实测结果(UA 554.687914、IA 29.634259,出厂默认值保持不变);配置 文件设计说明新增解析器契约 v1.19;采集与算法层设计说明 §13 系列与 README 索引同步。 台架实测:UA r=554.687914(出厂 1000.0 偏大 1.80 倍,根因是接线分压 使 PT 一次侧只拿到一半电压,实测与参数算定 606.06 只差 8.5%)、IA r=29.634259(与出厂 29.4118 只差 0.76%,反证链路未算错)。UN 按用户 裁定本轮不标定,保护闭锁(vl=0x11)是预期行为,未伪造 VALID。 同时入库 .dsh/roles 角色定义(原被 .gitignore 挡住)。
This commit is contained in:
+4
-1
@@ -112,6 +112,7 @@ docs/
|
||||
| [`采集与算法层设计说明.md`](算法/采集与算法层设计说明.md) | **`App/algo/` 的现状设计说明**:语义取数与有效性判定、全周傅氏相量采样环/相量/测频、保护判据定值模型与元件框架的契约、关键机制(双区原子切换、乒乓半区、自适应测频窗、定值封存-自检-闭锁)、精度判据 J1~J6 与资源足迹;**§13 = 标定折算**(码值→工程量、三态可用性、未标定即闭锁、遥测快照、六轮动态验证判据、已定案的前置决策) |
|
||||
| [`继电保护功能复现规划.md`](算法/继电保护功能复现规划.md) | **保护功能复现规划**:把参考系统(CLS100)保护链路映射到本项目(STM32F4)的分层功能/性能/参数清单、平台适配(「双转换器无共同采样触发」等)与分阶段路线图 |
|
||||
| [`采样有效性校验设计说明.md`](算法/采样有效性校验设计说明.md) | **`App/algo/adc_health.c` 单文件深设计**:四类判据(静默 / 丢帧 / 序号倒退 / 错误计数增量)的判据推导与 100 ms 门限依据、电平-锁存-事件三种位语义与位号对齐、闭锁与看门狗兜底的责任划分、观测盲区、主机侧验证分工与现场判读手册(含三张配图生成器) |
|
||||
| [`采样数据校正全流程.md`](算法/采样数据校正全流程.md) | **读者入口**:按一帧数据的真实流向,把端子→码值→三维折算(k/b/r)→相量/测频/遥测快照→104·UI·保护·录波串成一条线;含整定落盘、两点标定现状(板上无一键标定、台架手工路径见 `docs/测试说明/专项验证/ADC两点标定执行流程.md`)、三个判定(VALID/CLIPPED/eng 互不派生);细节归各属主文档 |
|
||||
|
||||
---
|
||||
|
||||
@@ -156,7 +157,8 @@ docs/
|
||||
|
||||
| 文档 | 内容 |
|
||||
|---|---|
|
||||
| [`ADC前端注入验证流程.md`](测试说明/专项验证/ADC前端注入验证流程.md) | **ADC 前端与两片转换器的台架注入验证**(已知电压注入验证的执行侧,实测证据 → `docs/硬件平台/ADC通道映射说明.md` §8.1):注入点清单 / 期望码值表 / 零点·线性·映射·极性·节奏五步(每步自带现场记录表,边做边填);**不需示波器与信号源**,一块万用表即可 |
|
||||
| [`ADC前端注入验证流程.md`](测试说明/专项验证/ADC前端注入验证流程.md) | **ADC 前端与两片转换器的台架注入验证**(已知电压注入验证的执行侧,实测证据 → `docs/硬件平台/ADC通道映射说明.md` §8.1):两轮——直流轮(注入点清单 / 期望码值表 / 零点·线性·映射·极性·节奏五步,每步自带现场记录表,**一块万用表即可**)、交流轮(幅值/波形/相位/测频/削顶/谐波六轮执行卡);**两点标定轮已独立成篇** → `docs/测试说明/专项验证/ADC两点标定执行流程.md` |
|
||||
| [`ADC两点标定执行流程.md`](测试说明/专项验证/ADC两点标定执行流程.md) | **UA/UN/IA 两点标定的执行卡**:开工拍板(保护口径 ≤3~5 %、量级 5 V/50 V 与 0.5 A/2 A 安全裁定、继保仪 ≥0.1 级)→ `meas:` 行三点读数填进文档内 `CALDATA` 标记表 → `test/host/cal_two_point.py --from-doc` 批量求解(`cal_two_point.py` 亦支持单路手填)→ `test/host/cal_write.py` 经 104 定值段 0x8050~/0x8048~ 写入置 VALID 自动落盘 → 三路齐解除保护闭锁(解卡时序红线与回写位置都在卡里);判据属主 `docs/算法/采集与算法层设计说明.md` §13.13 与 `docs/硬件平台/ADC通道映射说明.md` §7.2;**2026-11-12 实跑结果**(UA / IA 已标定、UN 未标 → 保护仍闭锁)登记在 `docs/硬件平台/ADC通道映射说明.md` §7.3 |
|
||||
| [`启动日志原子性复验流程.md`](测试说明/专项验证/启动日志原子性复验流程.md) | **控制台整行独占 / 崩溃遗言原子性**这类**行级完整性**判据的固定动作与口径(`docs/子系统设计/控制台单写者日志设计说明.md` 的验收侧:那边讲怎么修,这边讲怎么证明修好了、以及为什么"标记全中"不等于"日志没坏") |
|
||||
| [`故障录波板级到场轮执行手册.md`](测试说明/专项验证/故障录波板级到场轮执行手册.md) | **录波剩余台架判据的执行手册**(判据属主是 `docs/子系统设计/故障录波设计说明.md` §10,这里只写"人做什么、说哪句话、会看到什么"):四幕(枚举埋点修复 / 注量对表 / 保护触发对时刻(src=P)含两个用户决定 / bench 自抓占卷)各自标清到场与否,配到场检查清单、现场记录表与收工还原清单 |
|
||||
| [`链路延迟测试说明.md`](测试说明/专项验证/链路延迟测试说明.md) | 网络链路时延分段定义、判定基线、执行流程 |
|
||||
@@ -266,6 +268,7 @@ docs/
|
||||
| [`任务规划/`](任务规划/README.md) | **两个文件**:`README.md` = 全项目推进顺序(唯一权威);`登记簿.md` = V0.1 硬件缺陷 → V0.2 改版要求。其余待办跟着所属模块走(各文档「已知限制 / 重开条件」节):采集数据可信度 → `docs/算法/采集与算法层设计说明.md` §13、台阶图 → `docs/硬件平台/ADC通道映射说明.md` §9、RS-485 → `docs/产品需求/产品需求设计文档.md` §5.10 |
|
||||
| `硬件平台/` | 网表详细分析报告与语义图(V0.0 / V0.1);**[`ADC通道映射说明.md`](硬件平台/ADC通道映射说明.md)——V0.1 十七路 ADC 语义/网名/通道号权威映射表(固件取数、UI 显示、自检注入以此为准),含 §7 链路四段口径、§8 注入实测记录与 §9 数据可信五级台阶/波次退出判据** |
|
||||
| `芯片手册/` | 外部芯片数据手册转录(CH395F / GD5F2GQ5UE / SD2506 / TPAFE5160 / RTL8305NBI 等) |
|
||||
| [`嵌入式采集算法工程师_通用知识体系与行业标准.md`](嵌入式采集算法工程师_通用知识体系与行业标准.md) | **外部知识底座**(不是本仓设计说明):采样量化理论 / DFT 与测频 / 保护判据 / 定点化 / 标定方法论 / 常见陷阱 / 验证指标 / 教材与标准索引;读它补背景,本仓落地口径仍以 `docs/算法/采集与算法层设计说明.md` 为准 |
|
||||
| `images/` | 文档技术配图(`.svg` 产物,由 `tools/arch_diagram/`、`tools/refgraph/` 生成) |
|
||||
|
||||
---
|
||||
|
||||
@@ -47,10 +47,10 @@ dhara 失败类 +84;RO 另 +208,全是该失败类名表)→ `ER_IROM1`
|
||||
<!-- MEM_SNAPSHOT:BEGIN generated by scripts/check_mem_numbers.py -->
|
||||
| 区域 | 用量 | 容量 | 占比 |
|
||||
|---|---|---|---|
|
||||
| ER_IROM1 | 287,784 B (281.04 KB) | 1,048,576 B (1024 KB) | 27.4% |
|
||||
| ER_IROM1 | 287,960 B (281.21 KB) | 1,048,576 B (1024 KB) | 27.5% |
|
||||
| RW_IRAM1 | 97,024 B (94.75 KB) | 131,072 B (128 KB) | 74.0% |
|
||||
| RW_CCM | 57,376 B (56.03 KB) | 65,280 B (64 KB) | 87.9% |
|
||||
| **Flash (ROM 合计)** | **289,864 B (283.1 KB)** | 1,048,576 B (1024 KB) | **27.6%** |
|
||||
| **Flash (ROM 合计)** | **290,040 B (283.2 KB)** | 1,048,576 B (1024 KB) | **27.7%** |
|
||||
<!-- MEM_SNAPSHOT:END -->
|
||||
|
||||
各区的容量与常量来源:
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
<!-- MEM_BUDGET:BEGIN generated by scripts/ram_baseline.py -->
|
||||
| 区域 | 用量 | 容量 | 占比 | 门禁(≤92%) |
|
||||
|---|---|---|---|---|
|
||||
| ER_IROM1 (Flash) | 287,784 B | 1,048,576 B | 27.4% | 参考 |
|
||||
| ER_IROM1 (Flash) | 287,960 B | 1,048,576 B | 27.5% | 参考 |
|
||||
| RW_CCM | 57,376 B | 65,280 B | 87.9% | PASS |
|
||||
| UNINIT_CCM | 48 B | 256 B | 18.8% | 参考 |
|
||||
| RW_IRAM1 | 97,024 B | 131,072 B | 74.0% | PASS |
|
||||
|
||||
+2
-27
@@ -217,6 +217,8 @@ flowchart TD
|
||||
|
||||
**(3) 变更检测** —— `cfg_file_poll()`(defaultTask / 模拟器主循环,2s 节拍):`f_stat` 取 (size, mtime-epoch) 与基线比对 → 沉降后**先按真实 `st.size` 查超长**(v1.12):>4096B = 损坏 → 各段复位工厂默认 + 重建模板 + 自检留痕(`cfg poll oversized`),**不触发段回调**(保留 FTP/在线修复通道,下次保存或重启收敛);正常路径重载先过**视图一致性守卫**(v1.17,§5.3):stat → read → 再 stat 三点必须一致且**内容过 `s_view_bad`**——读长 ≠ `st.size`、读期间 (size, mtime) 变化、或视图含 NUL 字节(同尺寸全 0 旧映射块,台架实证形态)= 卷层给了旧/短/坏视图或读中被改写 → 拒绝应用(RAM 不动、基线不刷新,2s 重试自愈);一致后重载 → 段变化则触发该段回调 → 刷新基线。
|
||||
|
||||
重载循环的**解析器契约(v1.19)**:`s_parse()` 必须保持**非破坏性**——入参 `const char *`,逐行拷进本函数栈缓冲(`CFG_LINE_TEST_MAX + 1`)再交给会就地 NUL 化的行切分函数。因为热重载是"对同一份读缓冲按段各解析一轮",旧的就地解析在第一段就把 `=` 与 `\n` 全改写成 NUL,后面各段再也读不到键值行 → 静默全体保持出厂默认,而紧随的落盘会把这份出厂值写回文件、**永久覆盖用户整定**(台架 2026-11-12 实证:104 写入 r/b 当场读得回,约 8 s 后被打回出厂值;开机 `load` 只解析一轮故始终正确,缺陷因此长期不可见)。
|
||||
|
||||
**(4) 段变更回调** —— 未来模块的接入点:
|
||||
|
||||
```c
|
||||
@@ -568,30 +570,3 @@ void adc_cfg_init(void)
|
||||
| O2 | 降级时配置同步策略 | 接受"降级 = 工厂默认" + 文档说明 |
|
||||
| O3 | 其他模块接入顺序 | 按需(ADC / RS-485 / 端口等) |
|
||||
| O4 | 文件格式版本号行(如 `; format=1`) | 本期不加(宽容解析已覆盖演进) |
|
||||
|
||||
---
|
||||
|
||||
## 变更记录
|
||||
|
||||
| 日期 | 变更 |
|
||||
|---|---|
|
||||
| 2026-09-13 | v1.0:初版设计(基于现状调研) |
|
||||
| 2026-09-13 | v1.1:`get_fattime` 由 SD2506 RTC 改为运行时间伪时(零 I2C 流量、无 RTC 依赖);相应回退 SD2506 驱动锁(P2 修正) |
|
||||
| 2026-09-13 | v1.2:`get_fattime` 移入 `App/sys_clock.c` 改用墙钟(与调试日志时间戳同源,mtime 为真实时间;修正伪时的 24h 回绕盲区与日期失真) |
|
||||
| 2026-09-13 | v1.3:`get_fattime` 移入独立适配文件 `App/ff_time.c`(时间子系统不再引用存储头文件);`sys_clock` 新增纯时间 API `sys_clock_get_time()` |
|
||||
| 2026-09-13 | v1.4:`get_fattime` 改为时间提供回调——实现回归 `Lib/FatFs/ffsystem.c`(FatFs 指定的 OS 胶水文件,不引用 App 头),App 启动时注册墙钟时间源;删除 `App/ff_time.c`;保持分层单向(与既有平台后端模式同型) |
|
||||
| 2026-09-13 | v1.5:`get_fattime` 改为直引用(ffsystem.c 直接引用 `sys_clock` 墙钟);去掉回调注册机制(删除 `ffsystem.h`、`app_main.c` 注册步骤);反向依赖在架构总览 §1.2 登记为工程唯一例外 |
|
||||
| 2026-09-13 | v1.6:`sys_clock` 由 ③基础服务层改归 **④中间件层**(通用平台时间服务),文件移入 `App/util/`(与 crc/ringbuf 同目录):`ffsystem` → `sys_clock` 成为**层内引用**,工程反向依赖消除;"反向依赖例外" 措辞同步撤销 |
|
||||
| 2026-09-13 | v1.7:FS 并发定案 **A+**(REENTRANT 互斥 + 三条一致性协议:写 tmp+rename 扩至 FTP STOR / 沉降去抖重载 / 配置文件单写者收敛 netTask);**actor 方案(单所有者队列 + 全代理层)经完整评估否决**(代理 ~400–600 行、RAM +4KB、符号改名/影子头、自死锁纪律——结构优势可由三协议 ~40 行等价中性化);新增 D15,D9 改为"一切写入 tmp+rename",P4 增列 lftpd STOR 改造 |
|
||||
| 2026-09-14 | v1.8:**P3 完成**(双端 0/0):`cfg_file` 段键表引擎 + `cfg_file_store` 双端后端 + `net_cfg` [network] 段集成(对外 API 不变,D14 兑现)+ `net_cfg_legacy` 旧档迁移;无头实测通过(工厂模板生成 / 编辑回读 / 非法键工厂回退 / 未知段容留 / 迁移三态 / 双端 0 警告);§6 接口修订为实现版(store 带路径参数 + 三路径 getter;变更回调随段注册,撤销独立 `cfg_file_register_cb`);§8 静态增量按实测 706 B 修订 |
|
||||
| 2026-09-14 | v1.9:**P5 完成**(sim 0 警告):模拟器主循环接入 2s `cfg_file_poll`(与 MCU netTask 同周期);新增无头自检 `lvgl_sim.exe --cfgtest`(加载/迁移 → 建基线 → 伪造外部编辑 → 两次轮询沉降 → 断言 RAM 更新 + 外科保存回环校验注释/值无损);修复其暴露的两处缺陷:① MSVC `rename()` 不覆盖已存在目标(C1117)——模拟器后端先删目标再 rename(目标丢失时引擎自动重建模板兜底);② **外科保存截断 bug**——`s_split_line` 将 CRLF 行的 `\r`/`\n` 双双 NUL 化,旧 `s_restore_newlines` 只复原一个 `\n` 即遇 NUL 终止,保存产物只剩首行(P3 未触发"对已存在文件保存"故未暴露)——改为 Pass 1 用一次性副本(堆峰值维持约 9KB)、删除复原函数 |
|
||||
| 2026-09-15 | v1.10:**配置引擎属主任务变更** netTask → defaultTask(P1-3 跨任务竞态修复,P1-5 一并落地)——① 上电加载移入 defaultTask 的 STORAGE_READY 屏障之前(屏障语义 = 卷挂载 + 配置就绪);② UI 保存改跨任务交接:`net_cfg_save_request()`("待保存"标志 + `SYS_EVT_CFG_SAVE` 事件唤醒)→ defaultTask `net_cfg_save_run()` 执行写盘、成功触发"立即应用"(`SYS_EVT_NET_RECONFIG` → netTask 重建),保存行随交接状态显示 ENTER/WAIT/OK/ERR(写盘期间的新请求重位置位不丢失);③ 2s poll 收敛 defaultTask——引擎静态状态仅单任务触碰,竞态在结构上消除;④ netTask 只读 RAM 副本、不触碰配置文件引擎;D15-③ 单写者、§5.1~5.4 时序图与并发矩阵同步;双端构建 0/0、UI 五步门禁全绿 |
|
||||
| 2026-09-18 | v1.11:**P0-1 修复(临时缓冲改走平台堆)**——共享核心 4 处 `malloc`(读缓冲 4,097B / 模板输出 5,120B / 外科保存 Pass1 副本 + 输出 5,120B)此前落在 **MicroLIB C 堆**上,而该堆由 `startup_stm32f407xx.s` 的 `Heap_Size EQU 0x200` 限定为 **512 B**,真机必然分配失败 → 配置加载静默回落工厂默认(模拟器用宿主 CRT 堆,两端不一致,故双端 0 警告 0 错也照不出来)。① `cfg_file_store` 新增 `cfg_store_alloc/cfg_store_free/cfg_store_heap_free` 后端三件套(MCU = `pvPortMalloc/vPortFree`,与 `lftpd_io.c` 同模式;模拟器 = `malloc/free`),共享核心不再出现 C 库分配符号;② 新增编译期堆峰值预算 `CFG_HEAP_BUDGET = 10240B`(typedef 负数组实现,ARMCC 5 C99 无 `_Static_assert`),放大 `CFG_FILE_MAX_LEN`/`CFG_OUT_MAX` 直接编译失败;③ 四条失败路径(load 读失败 / 模板写失败 / 保存分配失败 / 保存写盘失败)增 `syslog_post(SYSLOG_SELFTEST, …)` 上报,不再只留串口行;`load: OK` 行附带 `heap free` 实测值;④ 属主任务注释同步为 defaultTask。map 复核:`malloc.o` 不参与链接、`Removing startup_stm32f407xx.o(HEAP), (512 bytes)`,静态区 126,584 → **126,064 B**(余 4,488 → **5,008 B**);双端 0 错 0 警、`--cfgtest` PASS |
|
||||
| 2026-09-22 | v1.12:**E-01 超长守卫根治**(错误码传播审计第一档 #3,commit d030cb0)——poll 的"超长=损坏"检查写在截断后读长(`s_load_file` 读长钉死 4096)上**恒假=死码**,超长文件被截断当有效解析 → 界外静默回工厂默认 → 基线粘住 → 用户配置销毁链。① poll 沉降分支判定改用 `cfg_store_stat` 真实 `st.size` 且**先于读取**,超长走"工厂默认 + 重建模板 + `cfg poll oversized` 自检留痕",**刻意不触发段回调**(避免按工厂 IP 重建网络造成静默失联,保留 FTP 修复通道,保存/重启收敛)② `s_surgical` 输出上限 `CFG_OUT_MAX`(5120) 收紧至 `CFG_FILE_MAX_LEN`(4096),超限走溢出中止路径(原文件不动 + `cfg save overflow` 自检)——消除"合法写出 4097~5120B 文件 = 下次开机销毁"的雷 ③ `s_write_doc` 唯一落盘闸口硬拒 >4096B(结构性保证)④ load 超长分支补 `cfg load oversized` 自检;`cfg_file.h` v1.2 契约同步;模拟器 cfgtest 新增两回归锁(4160B 伪造 → poll 判损坏重建;4000B 注释文件 → save 拒写且原文件未动)。**台架验证暴露并修复**:`cfg_store_write_atomic` MCU 后端 `f_rename` 对已存在目标返回 `FR_EXIST` 不覆盖 → 设备端一切"目标存在的覆盖写"(UI 保存/模板重建)静默失败、仅首启建文件成功——v1.9 已为模拟器后端修过同款(MSVC `rename()` C1117),MCU 侧漏了对称修复;修复 = rename 前先 `unlink` 目标(commit 70f1cc8)。双端 0 错 0 警、cfgtest PASS、台架 FTP 5047B 用例 poll/load 双路径自愈 PASS(重建 523B 工厂模板 + selftest 留痕 + 不掉线)、`@test` 默认闭环 PASS、ST-LINK 全片回读一致 |
|
||||
| 2026-10-03 | v1.13:**真机验证 PASS(A1 闭环)**——v1.11 的 P0-1 堆分配改造在真机上验证通过:`[CFG] load: OK (523B, heap free 8840B)`(**经 FreeRTOS 堆分配**,即 512B C 堆约束的验收点);Forbidden `FAIL`/`[ERR]` 零命中;FTP 改配置 IP→`192.168.1.101` 后**复位即加载生效**(`[NET_CFG] load: OK ip=192.168.1.101` + 芯片 `IP_INF` .101 + 21 端口探测可达),原档恢复后复测回 .100。真机全闭环 `@test` PASS 7/7。**台架步骤与判据见 `docs/测试说明/板级测试/实机测试实施指南.md` §3 / §10** |
|
||||
| 2026-10-04 | **P0-1 真机独立复跑 PASS(二次确认,代码零改动)**——`@build` 0/0(增量,无源文件新于镜像)→ `@test` **VERDICT PASS(rc=0)**:`[2026-10-04 00:01:21][CFG] load: OK (523B, heap free 8840B)` + `[NET_CFG] load: OK ip=192.168.1.100`,Forbidden `FAIL`/`ERROR`/`HardFault`/`[ERR]` 零命中,`selftest: no fault record`(先清掉 2026-10-02/03 故障注入窗口遗留的 67 条台账)→ ST-LINK 全片回读 `No difference found`(`0x08000000~0x08040F9B`)。**本次为 `待处理内容.md` §4.1「待验证」唯一未闭环项(P0-1)的收口**,该节现已清空 |
|
||||
| 2026-10-10 | v1.14:**删除旧档 NCFG 迁移(D10 撤销)**——`Drivers/BSP/NETCFG/net_cfg_legacy.{c,h}` 整体移除、`cfg_store_legacy_path()` 撤销(MCU / 模拟器后端与主机单测 `test/host/cfg_file/cfg_file_test.c` 同步删除),`net_cfg_load` 不再调用 `net_cfg_legacy_migrate()`;旧档 `/cfg/netcfg.bin` 若存在则被**忽略**(不读、不删、不迁移),配置回落工厂默认。理由:该一次性路径把整条配置写链挂进启动期调用图,defaultTask 静态最坏栈链 **+600 B**(该链整体 5312 → 2776 B,另三个杠杆见 `docs/内存管理/RAM使用分析与优化方案.md`),而本仓库不存在携带旧档的设备。连带影响:`App/util` 的 CRC-16/MODBUS 失去唯一调用者(现为零调用者);模拟器 `--cfgtest` 不再覆盖迁移场景;§2 D10 / §3.5 / §4.2 / §5.1 / §6.2 / §6.4 / §7 / §9 / §11.1 同步 |
|
||||
| 2026-10-26 | v1.15:**新增 `[comm]` 段(道G task-8,「UI 补齐」波次里的非 UI 前置项)**——`App/protocol/iec104/iec104_comm.h/.c` 配对模块(104 公共地址 / 监听端口 2 键,getter 合法带自愈,adc_cal 先例);内核前 `iec104_comm_init()` 注册([adc_cal] / [run_par] 同「先注册后 load」契约);生效 = **改后重启**(不挂回调、不新增事件位,区别于 [network] 免重启重建);段占位 5→6 / 8,键表与主站地址不做理由 → `docs/子系统设计/网络配置说明.md` §3.6;机器钉 = `test/host/cfg_file` TC-CONFIG-056/057(段/键上限)+ `test/host/iec104` TC-IEC104-031~033(模板/重载/带外/ca 端到端)
|
||||
| 2026-11-04 | v1.16:**新增 `[sntp]` 段(板端 SNTP 客户端接入,#57 调研结论落地)**——`Drivers/BSP/NETCFG/sntp_cfg.h/.c`(enable / server1 / server2 / poll_min 4 键;出厂默认**关闭 + 服务器留空 + 60 分钟** = "未配置零网络足迹"口径;`poll_min` 带外自愈 1..1440 → 60 不写回 RAM);数据本体 = `Drivers/BSP/NETCFG/sntp_cfg.h/.c`(不依赖引擎头,分层门禁 layer-deps 口径),段描述符由 `net_cfg.c` 的 `s_sntp_register()` 组装,注册编排 = `net_cfg_load()`(与 [ftp] 同编排,先注册后 load);消费方 = `App/sync/time_sntp.c`(挂 timeSyncTask 既有循环,vendor `Lib/coreSNTP` serializer 做 48B 报文编解码/防欺骗校验);保存立即生效 = 每轮直读 RAM 副本 + 网络代次重建弃 UDP socket 重散布,**无段回调、不新增事件位**;段占位 6→7 / 8;键表与生效细则 → `docs/子系统设计/网络配置说明.md` §3.7;机器钉 = `test/host/net_cfg` TC-NETCFG-005/006b..d/007(段注册契约)+ `test/host/sntp`(RFC 4330 §10 节奏 / §5.3 防欺骗 / §5.5 步进策略 / poll 钳位)
|
||||
| 2026-11-05 | v1.17:**热重载/保存路径视图一致性守卫(issue #73 台架实证根治)**——真机 8/8 复现"运行中改配置触发热重载打回出厂默认"且此后任何保存吞段(1066B→986B):卷层在 stat→read 窗口给回旧/短视图,引擎照单应用(全段 memcpy 默认、零解析错误行)或照短视图外科重写文件。① `cfg_file_poll` 沉降读取后三点校验 + 内容判据(读长 == `st.size` + 读后复 stat (size, mtime) 不变 + `s_view_bad`:INI 文本任意偏移含 NUL = 坏块——台架 15:21 再实证**同尺寸整块全 0 旧映射块**可骗过纯三点校验,解析零错误 RAM 照打回,内容判据是该形态唯一引擎侧拦截):不符 → **拒绝应用**(RAM 原样 / 基线不刷新 / 2s 重试自愈),首次拒绝 `cfg poll view stale` 自检 + ERROR 一行(该行打印"读长B != stat B",内容判据或复 stat 命中时两个数可相等,命中的是内容/读中改写项),此后每 30 趟(≈60s)一条 WARN 计数;② `cfg_file_save` 同族守卫:视图与 stat 不符或内容坏 → **拒存返回 -1**(调用方保留 dirty 重试)原文件一字节不动 + `cfg save view stale` 自检——"短/坏视图 → 外科重写 → 非默认段被删"链就此斩断;③ 边界如实披露:一致但陈旧的整卷视图引擎层无法检出(dhara/FTL 属卷层),重启必然收敛,卷层根治前"改过配置后重启一次"仍是最稳口径。机器钉 = TC-CONFIG-058(poll HELD + 自愈)/ 059(save 拒存文件不动)/ 060(读中改写检出 + 日志限速)/ 061(同尺寸全 0 块内容判据拦截 + 自愈)/ 062(save 遇全 0 块拒存不动盘);`cfg_file.c` v1.6 / `cfg_file.h` v1.5 契约同步
|
||||
| 2026-11-11 | v1.18:**新增 `[adc_cal_sec]` 段(端子变比 r,8 键 int32 Q16)**——标定折算由二维 `(code+b)×k` 升为三维 `(code+b)×k×r`(k = 引脚侧 LSB、b = 零点、r = 端子二次值↔引脚电压);**段数 7→8 = 达 `CFG_FILE_MAX_SECTIONS` 上限**,此后第九段必被 `cfg_file_register()` 拒(只留一行 `[ERR]`,且先注册者留位),再加受管段须先抬上限或合并段;注册在 `adc_cal_init()`(内核前,与另两段同批),`p_cb = NULL`、段 ROM 默认**非 0**(电压族 65536000 = 1000.0、电流族 1927532 = 29.4118,台架实测反算);键表 / 合法带 / 与 VALID 的关系 → `docs/算法/采集与算法层设计说明.md` §13.2 / §13.8,台架来源 → `docs/硬件平台/ADC通道映射说明.md` §7.2 |
|
||||
|
||||
@@ -0,0 +1,130 @@
|
||||
# 嵌入式采集算法工程师:通用知识体系与行业标准
|
||||
|
||||
## 1. 核心知识体系(按优先级排列)
|
||||
|
||||
### P0:信号采样与量化理论
|
||||
- **奈奎斯特-香农采样定理**:采样率 ≥ 2×最高信号频率;工业电气量采集通常取 1 kHz~10 kHz(基波50Hz的20~200倍),以满足谐波分析至50次(2.5 kHz)需求。
|
||||
- **量化误差与ENOB**:理解有效位数(ENOB)与信噪比(SNR = 6.02N + 1.76 dB)的关系;计量级采集要求ENOB ≥ 14 bit(TPAFE5160等专用芯片可达16~20 bit)。
|
||||
- **抗混叠滤波器设计**:模拟前端必须配置低通滤波器,截止频率 ≤ fs/2;常用Sallen-Key或Butterworth拓扑,阶数由ADC分辨率和过采样比决定。IEC 60255-181要求保护用CT/VT二次侧滤波器的幅频/相频特性在通带内偏差 < 1%。
|
||||
|
||||
### P1:数字信号处理算法
|
||||
- **全周波傅里叶变换(Full-cycle DFT)**:电力系统相量测量的基石。公式:X(k) = (2/N) Σ x(n)·e^(-j2πkn/N),取k=1得基波相量。需掌握矩形窗、Hanning窗、Hamming窗对频谱泄漏的抑制效果及主瓣宽度代价。
|
||||
- **频率自适应采样**:电网频率偏移时固定采样率会导致非整数周期截断→频谱泄漏。解决方案:① 硬件锁相环(PLL)同步采样时钟;② 软件重采样(插值+FFT);③ 动态调整DFT窗口长度。IEC 60255-181规定频率测量精度 ±0.01 Hz(稳态)。
|
||||
- **功率计算**:P = (1/N)Σu(n)·i(n);Q可用90°移相法或Budeanu定义。注意V0.1硬件缺陷(跨转换器无同步触发)下禁止跨片做相位/功率运算。
|
||||
|
||||
### P2:继电保护判据算法
|
||||
- **过流/过压元件**:I > I_set 持续 t_delay → 动作。需实现反时限特性(IEC 60255-151标准曲线:Normal Inverse / Very Inverse / Extremely Inverse)。
|
||||
- **差动保护**:Id = |I1 + I2|,Ir = |I1 - I2|/2;制动特性 Id > f(Ir) 防止CT饱和误动。二次谐波制动(Id2/Id1 > 15%~20%)识别励磁涌流。
|
||||
- **方向元件**:基于电压电流夹角判定故障方向;需正序/负序/零序分量分解(对称分量法)。
|
||||
|
||||
### P3:实时嵌入式系统约束
|
||||
- **ISR最小化原则**:ADC中断仅置标志位/释放信号量,算法运算全部放在任务级。TIM3 ISR内只做CONVST触发+通知,耗时 < 5 μs。
|
||||
- **确定性时序**:RTOS任务优先级反转防护(优先级继承/天花板协议);保护判据任务(protectTask)节拍抖动 < 100 μs。
|
||||
- **内存安全**:禁用动态堆分配(malloc/free);使用静态缓冲池+环形缓冲区(sample_ring);栈溢出检测(FreeRTOS configCHECK_FOR_STACK_OVERFLOW)。
|
||||
|
||||
---
|
||||
|
||||
## 2. 行业标准与规范
|
||||
|
||||
| 标准号 | 名称 | 对本角色的具体要求 |
|
||||
|--------|------|-------------------|
|
||||
| **IEC 60255-1** | 继电保护设备通用要求 | 定义准确度等级(0.2/0.5/1/3/5P)、额定值、环境条件;算法输出误差须在规定限值内 |
|
||||
| **IEC 60255-181** | 电力系统监测设备性能要求 | 规定相量测量精度(TVE < 1%)、频率响应范围(45~55 Hz)、暂态响应时间 |
|
||||
| **IEC 61850-9-2** | 采样值传输(SV) | 定义ASDU格式、采样率(80点/周波=4kHz@50Hz)、同步精度(±1μs via PTP);嵌入式实现需支持以太网组播+IEEE 1588v2 |
|
||||
| **IEC 61000-4-30** | 电能质量测量方法 | 规定各参数的测量算法(如THD计算窗口=10周波、闪变Pst=10min);是GB/T 14549的技术基础 |
|
||||
| **GB/T 14549-1993** | 电能质量 公用电网谐波 | 规定谐波电压/电流限值及测量方法;算法须支持2~50次谐波分析,加窗FFT减少泄漏 |
|
||||
| **GB/T 20840.8** | 电子式电流互感器 | 定义数字输出接口、额定延迟、准确度等级;影响ADC驱动设计与标定流程 |
|
||||
| **DL/T 860 (IEC 61850国标版)** | 变电站通信网络和系统 | 国内工程实施依据;MMS/GOOSE/SV三套服务栈的嵌入式适配 |
|
||||
| **IEEE C37.90** | 继电器和保护系统标准 | 北美体系参考;定义保护元件测试方法、型式试验项目 |
|
||||
|
||||
---
|
||||
|
||||
## 3. 设计原则与最佳实践
|
||||
|
||||
### 定点化策略
|
||||
- **Q格式统一**:全链路使用Q15/Q31定点运算(ARM CMSIS-DSP库原生支持);避免浮点以节省FPU功耗和确定性。
|
||||
- **中间结果扩位**:乘法后保留双倍字长(int32→int64),累加后再右移归一化,防溢出。
|
||||
- **查表法加速**:sin/cos预计算256/512点正弦表;atan2用CORDIC或分段线性逼近。
|
||||
|
||||
### 抗混叠与滤波
|
||||
- **模拟前端**:RC/有源LPF截止频率设为fs/(2×OSR),OSR为过采样比;TPAFE5160内置可编程数字滤波器,需正确配置抽取率。
|
||||
- **数字抽取滤波**:多级CIC+SINC+FIR组合;注意CIC的通带下垂补偿。
|
||||
- **窗函数选择**:矩形窗(频率分辨率高但泄漏大)→ 适合稳态精确测频;Hanning/Hamming窗(旁瓣衰减好)→ 适合谐波分析;Flat-top窗(幅值精度高)→ 适合校准/计量。
|
||||
|
||||
### 频率自适应
|
||||
- **测频算法**:过零检测(简单但受谐波干扰)→ DFT相位差分法(精度高)→ 改进递归DFT(跟踪速度快)。
|
||||
- **重采样同步**:当实测频率偏离额定值时,通过三次样条/sinc插值将非均匀样本映射到等间隔虚拟采样点,再做FFT。
|
||||
- **PLL设计**:数字锁相环带宽典型1~10 Hz;太快跟踪噪声,太慢跟不上频率突变。
|
||||
|
||||
### 标定方法论
|
||||
- **多点校准**:至少5点(0%/25%/50%/75%/100%量程)线性拟合;高精度场景用分段多项式或查找表。
|
||||
- **温度补偿**:ADC增益/偏置温漂实测建模(一次/二次多项式);板载温度传感器实时修正。
|
||||
- **相位校准**:标准源注入已知相位差信号,测量并补偿通道间延迟(含滤波器群延迟、DMA传输延迟)。
|
||||
|
||||
---
|
||||
|
||||
## 4. 常见陷阱与反模式
|
||||
|
||||
| 陷阱 | 后果 | 正确做法 |
|
||||
|------|------|---------|
|
||||
| **ADC校准遗漏** | 读数带固定失调,小信号时相对误差极大 | 上电必跑自校准(STM32F4的`ADC_CR2_CAL`);定期重校准 |
|
||||
| **采样不同步** | 跨通道相位差随机漂移,功率/功率因数计算错误 | 共用同一触发源(TIM3 TRGO);多片ADC需硬件同步引脚或PTP |
|
||||
| **频谱泄漏** | 谐波幅值虚高/虚低,THD超标 | 整周期截断或加合适窗函数;频率偏移时启用自适应窗 |
|
||||
| **保护误动** | CT饱和/励磁涌流被误判为内部故障 | 二次谐波制动+波形识别+延时确认;定值须经仿真验证 |
|
||||
| **保护拒动** | 算法死区/阈值过高导致真实故障未切除 | 全覆盖测试(边界值+异常波形);冗余判据交叉校验 |
|
||||
| **ISR过重** | 采样节拍抖动,后续算法输入时间戳不准 | ISR只做最小操作(触发+通知);算法放任务级 |
|
||||
| **环形缓冲竞态** | 读写指针冲突导致数据撕裂 | 单生产者单消费者模型;原子操作或临界区保护 |
|
||||
| **定点溢出静默** | 中间结果截断导致算法发散 | 全程监控溢出标志;关键节点插入饱和运算 |
|
||||
| **DMA目的地址错误** | DMA2不可达CCM,数据写入无效区域 | DMA缓冲必须放在SRAM;链接脚本明确分区 |
|
||||
| **窗函数未归一化** | FFT幅值随窗类型变化,标定系数失效 | 每种窗单独标定增益因子;文档记录窗函数+系数对应关系 |
|
||||
|
||||
---
|
||||
|
||||
## 5. 测试与验证方法论
|
||||
|
||||
### 分层验证策略
|
||||
1. **单元仿真(PC端)**:用MATLAB/Python/C生成标准测试向量(纯正弦、含谐波、频率偏移、暂态故障),对比算法输出与理论值;覆盖率 > 95%。
|
||||
2. **主机侧单测**:纯逻辑模块(phasor/freq/prot_elm)脱离硬件运行;mock ADC数据注入;CI门禁自动执行。
|
||||
3. **标准源校验**:Fluke 6105A/Radcom等电能质量标准源注入已知幅值/相位/谐波的信号;比对采集结果,误差须在等级限值内。
|
||||
4. **台架闭环测试**:真机+负载+故障模拟器;验证保护动作时间、选择性、灵敏度。
|
||||
5. **型式试验**:按IEC 60255系列执行EMC、环境、振动、绝缘等试验;算法相关主要是准确度验证和暂态响应测试。
|
||||
|
||||
### 关键验证指标
|
||||
- **稳态精度**:幅值误差 < 0.2%(0.2级),相位误差 < 0.1°
|
||||
- **暂态响应**:阶跃输入后达到稳态的时间 < 2个周波(40ms@50Hz)
|
||||
- **频率跟踪**:45~55 Hz范围内TVE < 1%,跟踪速度 < 200 ms
|
||||
- **保护动作时间**:速断 < 20 ms,过流反时限符合标准曲线±5%
|
||||
- **长期稳定性**:72小时连续运行漂移 < 0.05%
|
||||
|
||||
---
|
||||
|
||||
## 6. 权威参考资源
|
||||
|
||||
### 经典教材
|
||||
- 《电力系统继电保护原理》(贺家李)— 保护判据理论基础
|
||||
- 《Digital Signal Processing in Power System Protection and Control》(Waldemar Rebizant)— DSP算法与保护结合
|
||||
- 《Understanding Digital Signal Processing》(Richard Lyons)— 定点DSP工程实践
|
||||
- 《Embedded Systems Architecture》(Tammy Noergaard)— 实时系统设计方法论
|
||||
|
||||
### 重要论文与技术报告
|
||||
- IEEE Std C37.118.1-2011:同步相量测量标准,定义TVE/FE/RFE指标
|
||||
- IEC 60255-181 Ed.1.0:电力系统监测设备性能要求(2023最新版)
|
||||
- "A Survey of Phasor Estimation Algorithms for Power Systems"(IEEE Trans. Power Delivery, 2020)— 主流相量算法综述
|
||||
- AN-1368: "Optimizing STM32 ADC Performance"(ST Microelectronics)— F4 ADC校准/DMA/触发实战
|
||||
|
||||
### 开源项目
|
||||
- **CMSIS-DSP**(ARM官方):定点FFT/FIR/IIR库,Cortex-M优化
|
||||
- **libiec61850**(MZ Automation):IEC 61850 MMS/GOOSE/SV协议栈,可移植
|
||||
- **OpenPMU**:开源相量测量单元,含完整采集+算法+同步代码
|
||||
- **RT-LAB/eMEGAsim**:电力系统实时仿真平台,用于算法HIL验证
|
||||
|
||||
### 行业白皮书与指南
|
||||
- ST Application Note AN4220:"STM32 MCU ADC introduction and hardware guidelines"
|
||||
- TI Application Report SLAA488:"High-Speed Data Acquisition Using SAR ADCs"
|
||||
- National Instruments White Paper:"Best Practices for High-Accuracy DAQ System Design"
|
||||
- 中国电科院《智能变电站合并单元测试规范》— SV采样值设备国内验收依据
|
||||
|
||||
---
|
||||
|
||||
> **文档版本**:v1.0 | **适用范围**:通用嵌入式电气量采集算法开发 | **不涉及特定项目内部细节**
|
||||
> **编制依据**:IEC/IEEE/GB现行有效版本 + 工业界公认工程实践
|
||||
@@ -0,0 +1,134 @@
|
||||
# ADC 两点标定执行流程(台架)
|
||||
|
||||
给 `UA/UN/IA` 各加两个已知量,解出变比 `r` 与零点 `b`,经 104 定值段写入;三路 `VALID` 齐
|
||||
|
||||
## 1. 开工核对
|
||||
|
||||
| 项 | 判据 |
|
||||
|---|---|
|
||||
| 量级 | 电压族 **5 V / 50 V**、电流族 **0.5 A / 2 A** 误差代价 ≈0.7 % / 0.6 %,在保护 3~5 % 内;0.5 级计量日后另跑高点轮,不混用) |
|
||||
| 仪器 | 继保仪 **≥0.1 级** |
|
||||
| 网络 | PC 与板同网段(192.168.31.100),:2404 可达、FTP :21(admin)可用 |
|
||||
| 接线 | PT 一次侧按下表接;CT 二次**全程不开路**;注入源与板**共地**、先接线后加压 |
|
||||
|
||||
**PT 一次侧接线表**(电压采集板 8 端子 → 继保仪输出):
|
||||
|
||||
| 板端子 | 接继保仪 | 说明 |
|
||||
|---|---|---|
|
||||
| `UA` | `UA` | 相 A 电压 |
|
||||
| `UAN` | `UN` | 中性参考 |
|
||||
| `UB` | `UB` | 相 B 电压 |
|
||||
| `UBN` | `UN` | 中性参考 |
|
||||
| `UC` | `UC` | 相 C 电压 |
|
||||
| `UCN` | `UN` | 中性参考 |
|
||||
| `U0` | `UZ` | 零序电压(N-GND) |
|
||||
| `U0N` | `UN` | 中性参考 |
|
||||
|
||||
要点:每个 `U*N` **各自直接接**继保仪 `UN` 端子,**不要四个连一起**(连一起会经各 200 KΩ 串阻分压,PT 一次侧只拿一半电压)。`U0` 接继保仪 `UZ`(零序电压输出,对应 N-GND),`U0N` 接 `UN`——这样 U0 PT 一次侧跨 `UZ-UN`,台架上能读到零序信号。
|
||||
|
||||
**CT 一次侧接线表**(电流采集板 8 端子 → 继保仪输出):
|
||||
|
||||
| 板端子 | 接继保仪 | 说明 |
|
||||
|---|---|---|
|
||||
| `IA` | `IA` | 相 A 电流 |
|
||||
| `IAN` | `IBN` | 中性参考 |
|
||||
| `IB` | `IB` | 相 B 电流 |
|
||||
| `IBN` | `ICN` | 中性参考 |
|
||||
| `IC` | `IC` | 相 C 电流 |
|
||||
| `ICN` | `I0N` | 中性参考 |
|
||||
| `I0` | `IN` | 零序电流(N) |
|
||||
| `I0N` | `IAN` | 中性参考 |
|
||||
|
||||
要点:`IA`/`IB`/`IC` 各自接对应相输出;`IAN`→`IBN`→`ICN`→`I0N`→`IAN` 串联链,`I0` 接继保仪 `IN`——I0 CT 跨 `IN` 到链上,能读到 IN 电流。**CT 二次全程不开路**;回路中**不得串额外电阻**(串电阻会分压削顶)。
|
||||
|
||||
## 2. 读数
|
||||
|
||||
**读哪行、怎么读**:串口每 10 s 打一行 `meas: seq=… v=… ua_mv=… un_mv=… ia_mv=… f=… fv=…`。电压格单位 mV、电流格单位 mA。每工况稳定后**连读 3 拍取中间值**(第一拍是切换瞬态,最后一拍防漂移;3 拍 ≈ 30 s)。
|
||||
|
||||
**实际案例**:
|
||||
|
||||
```text
|
||||
# 未注入(零点)——连续多拍都是 0:
|
||||
meas: seq=1400 v=1 ua_mv=0 un_mv=0 ia_mv=0 f=0 fv=0
|
||||
|
||||
# 继保仪出 1.000 V(UA + UN 同注)后稳定,连续多拍:
|
||||
meas: seq=1450 v=1 ua_mv=995 un_mv=996 ia_mv=0 f=0 fv=0
|
||||
meas: seq=1500 v=1 ua_mv=995 un_mv=996 ia_mv=0 f=0 fv=0
|
||||
meas: seq=1550 v=1 ua_mv=995 un_mv=996 ia_mv=0 f=0 fv=0
|
||||
```
|
||||
|
||||
解读:注入 1.000 V → `ua_mv` 显示 995 mV(差 5 mV = 零点偏移,正常);`un_mv` 显示 996 mV;`ia_mv` 仍 0(没注电流)。**你填进 CALDATA 表的就是 `995` / `996` 这些数**——脚本内部会换算回码值再解 r/b,你不需要算码值。
|
||||
|
||||
**两点标定实际操作**(继保仪输出按 §1 拍板的 5 V / 50 V / 0.5 A / 2 A):
|
||||
|
||||
| 步骤 | 继保仪输出 | 串口 `meas:` 行读哪格 | 填入 CALDATA 表 |
|
||||
|---|---|---|---|
|
||||
| ① 零点 | 0 V / 0 A | 稳定 3 拍 `ua_mv` / `ia_mv` 取中(预期个位数 mV/mA) | 零点 meas |
|
||||
| ② 低点 | 5.000 V / 0.5 A | 稳定 3 拍取中(预期 ≈ 5000 mV / 500 mA) | 低点 meas |
|
||||
| ③ 高点 | 50.000 V / 2.0 A | 稳定 3 拍取中(预期 ≈ 50000 mV / 2000 mA) | 高点 meas |
|
||||
|
||||
**零点越带怎么办**:如果零点 `meas:` 格绝对值 > 1250(电压路 mV、电流路 mA,对应码值 ±8192),说明前端有偏压——先查共地/接线,**不得用系数凑**(`docs/硬件平台/ADC通道映射说明.md` §7.2 禁则)。
|
||||
|
||||
## 3. 求解:`test/host/cal_two_point.py`
|
||||
|
||||
把每路三个读数填进下表(`CALDATA` 注释标记供 `--from-doc` 提取,勿删改标记;空格=未填会被跳过):
|
||||
|
||||
<!-- CALDATA:BEGIN -->
|
||||
| 路 | 零点 meas | 低点 meas | 高点 meas | 已知低点 | 已知高点 |
|
||||
|---|---|---|---|---|---|
|
||||
| ua | 50 | 9049.7 | 90176.4 | 5 | 50 |
|
||||
| un | 70 | | | 5 | 50 |
|
||||
| ia | 2 | 496.75 | 1985.49 | 0.5 | 2 |
|
||||
<!-- CALDATA:END -->
|
||||
|
||||
> 上表是 **2026-11-12 台架那一轮的实际读数**(留作样例:真实数据长这样、量级对不对可以照此眼校)。
|
||||
> 下次重新标定**先把 meas 三列清空**,填你这次读到的数;`un` 那行留空即代表本轮不测该路。
|
||||
> 那一轮解出 **UA `r = 554.687914` / `b = 0`、IA `r = 29.634259` / `b = 0`**,
|
||||
> 已写入设备(结果登记 → `docs/硬件平台/ADC通道映射说明.md` §7.3)。
|
||||
|
||||
meas 列 = `meas:` 行读数(`ua`/`un` 为 mV、`ia` 为 mA,即 ×1000 那格);已知列 = 继保仪实际输出(伏/安)。填完跑:
|
||||
|
||||
```powershell
|
||||
& '.venv\Scripts\python.exe' test/host/cal_two_point.py --from-doc docs/测试说明/专项验证/ADC两点标定执行流程.md
|
||||
```
|
||||
|
||||
脚本对每路已填行解出新的变比 `r` 与零点偏移 `b`,最后打出一条合并写入命令(`WRITE-ALL:` 开头,直接接给 `cal_write.py`)。
|
||||
|
||||
**怎么判断结果能不能用**(按顺序看):
|
||||
|
||||
| 看什么 | 合格 | 不合格怎么办 |
|
||||
|---|---|---|
|
||||
| 每路 `OK r=…` 行里的 **dev**(新 r 相对旧 r 的偏差) | 在 **±10 %** 内 | 超了 = 读数单位填错或接线有问题,**先排查,不要写** |
|
||||
| 有没有 `REJECT` 行 | 没有 | 有 `REJECT` = 两点填反了(高点比低点还低)或零点超出 ±8192 码,**修正表里对应格再跑** |
|
||||
| 填了零点列时的 `ZERO CHECK` 行 | 独立算出的 b 与求解 b **量级一致**(比如都是个位数) | 量级差很多 = 零点读数来源可疑(共地/接线),先排查 |
|
||||
| 末尾 `WRITE-ALL:` 行 | 存在且包含你填的所有路 | 只包含部分路 = 有路被跳过(看上面的 INCOMPLETE 提示),补齐后重跑 |
|
||||
|
||||
全部路都 OK 才进 §4 写入。
|
||||
|
||||
## 4. 写入:`test/host/cal_write.py`
|
||||
|
||||
| 路 | `r` | `b` |
|
||||
|---|---|---|
|
||||
| `UA` | `0x8050` | `0x8048` |
|
||||
| `UN` | `0x8053` | `0x804B` |
|
||||
| `IA` | `0x8054` | `0x804C` |
|
||||
|
||||
```powershell
|
||||
& '.venv\Scripts\python.exe' test/host/cal_write.py --r 0x8050=995.99 --b 0x8048=-1 --read 0x8050,0x8048 --expect 995.99,-1
|
||||
```
|
||||
|
||||
每路**先 `r` 后 `b`**(`b` 经 `adc_cal_set()` 置 `VALID`;`b` 必须整数码值);`SUMMARY PASS` + C_RD 读回差 <0.1 才进下一路。收到 PN → 看串口 `[ERR] set ch=... rejected`(`r < 1.0` 或 `|b| > 8192`)。
|
||||
|
||||
## 5. 验收与解卡
|
||||
|
||||
1. **每路完成**:`cal:` 行 `vl` 位图对位点亮(`UA` bit0、`UN` bit3、`IA` bit4,三路齐 `0x19`);低/高点复注对表;FTP 取 `/config.ini` 核 `[adc_cal]`/`[adc_cal_ofs]`/`[adc_cal_sec]`;断电重启后 `vl` 与读回不变。
|
||||
2. **解卡(最后一路 `b` 前)**:先把各通道置 **50 V / 0.5 A 附近**——**别留 0**(零压解锁会被判低电压);跳闸回路若接真断路器先确认不驱动。最后一笔 `b` 后应打 `calibration VALID -> protection unlocked` + SOE。**严禁伪造 `valid` 位**。
|
||||
3. **回写**:结果登记进 `docs/硬件平台/ADC通道映射说明.md` §7.3(变比与零点实测表),
|
||||
§9 台阶第 4 级按已标定路数标 🟡/✅(第 5 级留送检);日志按 `docs/测试说明/测试数据/boot_log_data/` 命名归档。
|
||||
|
||||
> **2026-11-12 那一轮的结果与遗留**(照抄现状,别当成"全标完了"):UA / IA 两路标定并落盘,
|
||||
> 断电重启后读回不变;`vl=0x11`(UA bit0 + IA bit4),`cl=0xe6`。**UN 未标**(台架无有效信号),
|
||||
> 三路不齐 → 保护判据仍打 `[PROT] uncalibrated -> protection blocked` 并停走,**属预期**。
|
||||
> 补完 UN 才是"三路齐、自动解卡"的完整验证。**另外**:那一轮暴露出配置引擎热重载吞段的缺陷
|
||||
> (写进去的 `r`/`b` 约 8 s 被打回出厂值并覆写文件),已修复并加机器钉,
|
||||
> 见 `docs/子系统设计/配置文件设计说明.md` §4-(3)。
|
||||
@@ -1,8 +1,8 @@
|
||||
# ADC 前端注入验证流程(台架)
|
||||
# ADC 前端注入验证流程
|
||||
|
||||
> **这篇是什么**:已知电压注入验证的**执行侧**——怎么写表笔、读哪行日志、填哪张表、结果往哪回写。判据与实测记录在属主文档:直流轮 `docs/硬件平台/ADC通道映射说明.md` §8.1、交流轮 `docs/算法/采集与算法层设计说明.md §13.10`;**本文只写怎么跑**,分叉时判据从属主。证不到什么见 `docs/硬件平台/ADC通道映射说明.md` 的 §8.1 结论与「边界」段,本文不重抄。
|
||||
>
|
||||
> **两个轮次**:§1~§7 = **直流轮次**(2026-10-27 六项 PASS,只需万用表 + 电位器 + 串口日志);§8 = **交流轮次**(幅值 / 波形 / 相位 / 测频 / 削顶 / 谐波),一台信号发生器接 §3 同一批注入点就能跑,等标准源的只有**精度等级**。V0.1 五路单极性削顶(`UB/UC/IB/IC/IN`)在交流轮次只作"预期削顶"负向用例。
|
||||
> **两个轮次**:§1~§7 = **直流轮次**(2026-10-27 六项 PASS,只需万用表 + 电位器 + 串口日志);§8 = **交流轮次**(幅值 / 波形 / 相位 / 测频 / 削顶 / 谐波),一台信号发生器接 §3 同一批注入点就能跑,等标准源的只有**精度等级**。V0.1 五路单极性削顶(`UB/UC/IB/IC/IN`)在交流轮次只作"预期削顶"负向用例。**两点标定轮已独立成篇**:`docs/测试说明/专项验证/ADC两点标定执行流程.md`(标准源两点 → 求 r/b → 104 定值段写入置 VALID 落盘 → 三路齐了解除保护闭锁;工具 `test/host/cal_two_point.py` / `test/host/cal_write.py`)。
|
||||
|
||||
## 1. 为什么非做不可
|
||||
|
||||
|
||||
+57
-15
@@ -125,14 +125,14 @@ STM32(U17)为 LQFP144 脚号。
|
||||
|
||||
### 7.1 从端子到码值:链路四段口径
|
||||
|
||||
要把「端子上的电压」换算成「屏上的读数」,得先知道这条链路上**哪一段会改数值**。这里把链路切成四段(一段 = 信号经过的一节),逐段给口径与状态;**下表是本节主表**,后面的内容按同样的段名展开。③ 段已有台架实测——变比 **1:1**(斜率实测见 §8.1);④ 段(子板/端子板变比)已按子板参数算定——电压族 **606.06 : 1**、电流族 **29.4118 A/V**,算式与复核边界见 §7.2,子板原理图仍不在仓库内。
|
||||
要把「端子上的电压」换算成「屏上的读数」,得先知道这条链路上**哪一段会改数值**。这里把链路切成四段(一段 = 信号经过的一节),逐段给口径与状态;**下表是本节主表**,后面的内容按同样的段名展开。③ 段已有台架实测——变比 **1:1**(斜率实测见 §8.1);④ 段(子板/端子板变比)出厂按子板参数登记为电压族 606.06 : 1、电流族 29.4118 A/V,**2026-11-12 已由两点标定在 UA / IA 上实测覆盖**(§7.3);子板原理图仍不在仓库内。
|
||||
|
||||
| 段 | 这一段在问什么 | 关系 | 状态 |
|
||||
|---|---|---|---|
|
||||
| ① 语义 ↔ 网名 ↔ 板级网名 ↔ 转换器代码通道 | “UA 到底是哪个通道号” | §2/§3/§4/§5 的 17 路映射表 | **定死**(本文件为唯一权威) |
|
||||
| ② 转换器引脚电压 ↔ 码值 | “脚上是 1 V,读出来几个码” | TPAFE `U_pin = code × 152.59 µV`(code 带符号);STM32 `U_pin = code × 805.66 µV` | **定死**(纯转换器事实,见下表) |
|
||||
| ③ `AINn` ↔ `ADCn` / 转换器引脚(板内串联电阻那一节) | “串在中间的电阻有没有把电压分掉” | **变比 = 1:1**:`ADCn` 节点只有 {串阻.2, 滤波 C, 转换器引脚},无对地元件 | **定死**(网表 + 台架实测,见 §8.1:端子侧注入斜率 6544.2 码/V vs 引脚侧理论 6553.6,差 0.14 %,不存在分压) |
|
||||
| ④ 语义端子(二次端子)↔ `AINn`(子板/端子板那一节) | “端子上的电压,进到板内还是同一个数值吗” | 子板/端子板变比:电压族 UA/UB/UC/UN **606.06 : 1(V/V)**、电流族 IA/IB/IC/IN **29.4118 A/V**(按子板参数算定,算式见 §7.2) | **定死**(参数算定,非本板双表同测)——端子二次值口径成立,但 `eng` 在电气 8 路 `ADC_CAL_F_VALID` 全置位前**保持 0** |
|
||||
| ④ 语义端子(二次端子)↔ `AINn`(子板/端子板那一节) | “端子上的电压,进到板内还是同一个数值吗” | 子板/端子板变比:出厂登记 电压族 UA/UB/UC/UN **606.06 : 1(V/V)**、电流族 IA/IB/IC/IN **29.4118 A/V**(按子板参数算定,算式见 §7.2);**UA 实测 554.69、IA 实测 29.634**(两点标定,见 §7.3) | **UA / IA 已实测定死**(2026-11-12 台架)+ **UN 待标**(台架无有效信号,用户裁定本轮不测)——屏上已显端子二次值(`eng = 1`),保护判据因 UN 缺 VALID 仍停走 |
|
||||
|
||||
**芯片级口径**(② 段,与前端网络无关):
|
||||
|
||||
@@ -151,10 +151,10 @@ STM32(U17)为 LQFP144 脚号。
|
||||
|
||||
**口径要点**:
|
||||
|
||||
1. **ROM 默认系数按 ② 段(引脚电压 ↔ 码值)冻结**:TPAFE 通道 `k = 152.59 µV/码`、STM32 通道 `k = 805.66 µV/码`;标定折算的输出单位 = **ADC 引脚电压 V**(`eng = 0`)。该口径与 ③④ 变比何时定死无关,冻结当日即成立且此后不因 ④ 到手而改动——这是 M4 承诺边界止于"引脚电压"的依据(`docs/算法/采集与算法层设计说明.md §13.5`)。
|
||||
1. **ROM 默认系数按 ② 段(引脚电压 ↔ 码值)冻结**:TPAFE 通道 `k = 152.59 µV/码`、STM32 通道 `k = 805.66 µV/码`;没有配变比的通道,折算输出 = **ADC 引脚电压 V**(`eng = 0`)。该口径与 ③④ 变比何时定死无关,冻结当日即成立且此后不因 ④ 到手而改动——这是 M4 承诺边界止于"引脚电压"的依据(`docs/算法/采集与算法层设计说明.md §13.5`)。
|
||||
2. **板级系数 = 引脚侧系数**(152.59 / 805.66)。305.18 / 1611.3 µV/码 只属 ±10 V 档的 LSB(芯片手册口径),**不是本板系数**,不得当板级系数用。
|
||||
3. **满量程必须写明参考点**:TPAFE 通道满量程 = ±5 V **@ 引脚**(跨度 10 V);③④ 均已定死(④ 值见 §7.2),端子侧换算允许写"引脚侧数值 × ④ 段变比";但两点标定置 `VALID` 之前**严禁**把"码 × 152.59 µV"当端子二次值写进代码/文档(那是引脚电压),§7.2 的标称系数只是算定值、不是已验证二次值。
|
||||
4. **仍待实测的只有两点标定**(给端子域系数、置 `VALID`,`eng` 随之升 1);完成前 `eng` 保持 0、输出单位仍是 ADC 引脚电压。实测斜率与 ② 段理论值偏差 >2 % 时**先查前端**(分压/变比/焊接),**不得用系数凑错斜率**——那会把硬件的错固化成"标定值"。
|
||||
3. **满量程必须写明参考点**:TPAFE 通道满量程 = ±5 V **@ 引脚**(跨度 10 V);③④ 均已定死(④ 值见 §7.2 / §7.3),端子侧换算允许写"引脚侧数值 × ④ 段变比";但某一路 `VALID` 未置位之前**严禁**把"码 × 152.59 µV × 变比"当**已验收的**端子二次值写进精度承诺——`VALID` 回答的是"准不准",变比回答的是"什么单位",两者互不派生(`docs/算法/采集与算法层设计说明.md` §13.3)。
|
||||
4. **仍待实测的只有 UN 一路的两点标定与精度等级送检**(前者决定保护能否解卡、后者决定能报几级)。实测斜率与 ② 段理论值偏差 >2 % 时**先查前端**(分压/变比/焊接),**不得用系数凑错斜率**——那会把硬件的错固化成"标定值"。
|
||||
|
||||
### 7.2 ④ 段变比登记(2026-11-11 台架实测修正)
|
||||
|
||||
@@ -167,6 +167,10 @@ STM32(U17)为 LQFP144 脚号。
|
||||
> 两者差 60 %,远超屏面分辨能力,**实测为准,606.06 作废**(保留在本节末的「历史值与作废依据」里,
|
||||
> 供后来者判断"是不是又算错了一遍")。子板原理图仍不在仓库内,所以这条比值目前只有实测证据、
|
||||
> 没有图纸旁证。
|
||||
>
|
||||
> ⚠ **本节 1000.0 也已被推翻**:2026-11-12 两点标定实测 UA = **554.69 V/V**
|
||||
> (见 §7.3)。那次单点粗测的接线让 UA 的 PT 一次侧只拿到一半电压,反算比值正好翻倍。
|
||||
> 本节保留原样是为了留证"单点粗测为什么不可信",**当前有效值一律以 §7.3 为准**。
|
||||
|
||||
**实测数据(2026-11-11,继保仪端子注入,屏面 3 位小数)**:
|
||||
|
||||
@@ -197,6 +201,11 @@ STM32(U17)为 LQFP144 脚号。
|
||||
故两点标定**不要用 5 V 这种小注入**:建议取 20 V 与 120 V 两点(都在 TPAFE ±5 V 引脚量程内,
|
||||
且码值足够大)。这也是本节的 1000.0 只能算"粗测"的原因。
|
||||
|
||||
> **实际执行时降了量级**(用户裁定 2026-11-12,安全优先):台架改注 **5 V / 50 V**、
|
||||
> **0.5 A / 2 A**。跨度缩小后每点 1 LSB 摊到结果里约 0.7 %(电压族)/ 0.6 %(电流族),
|
||||
> 仍在保护判据 3~5 % 的口径内,够用;但**够不上 0.5 级计量**——那要日后另跑高点轮,
|
||||
> 两轮结果不混用。执行卡 → `docs/测试说明/专项验证/ADC两点标定执行流程.md`。
|
||||
|
||||
**变比进固件的形式(为什么是独立一维,不并进 `k`)**:`r` 存 int32 Q16 比值,
|
||||
电压族 `ADC_CAL_R_Q16_VOLT = 65 536 000`(= 1000.0 × 65536,无舍入)、
|
||||
电流族 `ADC_CAL_R_Q16_CURR = 1 927 532`(= 29.4118 × 65536)。
|
||||
@@ -205,16 +214,47 @@ Q16 后是 1.0e10,而 int32 上限只有 2.147e9;UB/UC 走 STM32 更到 5.28
|
||||
`docs/算法/采集与算法层设计说明.md` §13.2。
|
||||
|
||||
**精度从哪来**:出厂默认值只保证量纲与量级;**精度**必须靠标准源两点标定:
|
||||
在端子上加两个已知量、读两点的原始码值(串口 `adc:` 行),代进
|
||||
在端子上加两个已知量、读两点的示值(串口 `meas:` 行,二次值域),代进
|
||||
`adc_cal_two_point()` 算出该路的 `r` 与 `b`,经 `adc_cal_set_ratio()` / `adc_cal_set()` 写入
|
||||
并落盘。这一步做完才有 `ADC_CAL_F_VALID`,保护判据才会解卡
|
||||
(`docs/算法/采集与算法层设计说明.md` §13.3 / §13.4)。
|
||||
(`docs/算法/采集与算法层设计说明.md` §13.3 / §13.4)。台架把整条流程做完了两路,
|
||||
求解与写入都已工具化(`test/host/cal_two_point.py` / `test/host/cal_write.py`),
|
||||
执行步骤属主 `docs/测试说明/专项验证/ADC两点标定执行流程.md`,实测结果见 §7.3。
|
||||
|
||||
**历史值与作废依据**(别照着旧数算):原按"子板 PT 2 mA/2 mA、输入侧 200 kΩ、输出侧 330 Ω"算得
|
||||
变比 = 200000 ÷ 330 = 606.0606…。算术没问题(复核过两遍),**错在前提**:这组参数与实物不符。
|
||||
同一组参数推出的"额定点端子 ≈400 V → `AINn` 侧 0.66 V"也因此不再成立。若将来拿到子板原理图,
|
||||
正确的做法是**用图纸复核实测量级**、而不是用图纸替换实测——两者冲突时以实测为准。
|
||||
|
||||
### 7.3 两点标定实测结果(2026-11-12 台架)
|
||||
|
||||
> **这一节要你干什么**:给出**当前这台设备实际在用的**变比与零点,以及 2026-11-11 那个 1000.0 为什么错。
|
||||
> 这是 `[adc_cal_sec]` / `[adc_cal_ofs]` 段里现在值的来源;执行步骤属主是
|
||||
> `docs/测试说明/专项验证/ADC两点标定执行流程.md`。
|
||||
|
||||
按执行卡流程在端子上注标准量、读串口 `meas:` 行、用 `test/host/cal_two_point.py` 求解、
|
||||
经 104 定值段写入并落盘,实测结果:
|
||||
|
||||
| 通道 | 状态 | `r`(变比) | `b`(零点,码) | 相对出厂值 |
|
||||
|---|---|---|---|---|
|
||||
| UA | ✅ 已标定、VALID 置位 | **554.687914**(`r_q16 = 36352028`) | 0 | 出厂 1000.0 → 偏大 1.80 倍 |
|
||||
| IA | ✅ 已标定、VALID 置位 | **29.634259**(`r_q16 = 1942111`) | 0 | 出厂 29.4118 → 差 +0.76 % |
|
||||
| UN | ⬜ 未标定 | 出厂 1000.0 | 0 | 台架 UN 通道无有效信号,用户裁定本轮不测 |
|
||||
|
||||
- **IA 与出厂值只差 0.76 %**:电流族出厂值本来就准,标定只是把它压到小数级——这也验证了
|
||||
"两点标定链路本身没算错"。
|
||||
- **UA 554.69 与按子板参数算定的 606.06 同量级(差 8.5 %)**,而 2026-11-11 单点粗测给的 1000.0
|
||||
偏大 1.8 倍。原因已定位:那次测量的接线把 `UAN`/`UBN`/`UCN` 并在一起、各串 200 kΩ 后回到
|
||||
继保仪 `UN`,形成一个分压网络,**UA 的 PT 一次侧只拿到一半电压** → 引脚侧读数减半 →
|
||||
反算比值正好翻倍(554.69 × 2 ≈ 1109,与当时的 1000.0 同量级)。接线改正(每个 `U*N`
|
||||
各自直连继保仪 `UN`,不并联、不串电阻)后重测才得到 554.69。
|
||||
- **出厂 ROM 默认值未改**:`ADC_CAL_R_Q16_VOLT` 仍是 1000.0、`ADC_CAL_R_Q16_CURR` 仍是 29.4118。
|
||||
上表是**这台设备 `config.ini` 里的现场整定值**,换板或多台部署时必须逐台重标,
|
||||
不能把 554.69 当成新出厂值烧进固件(单台实测 ≠ 板级事实)。
|
||||
- **保护闭锁仍在**:`adc_cal_prot_blocked()` 要求 UA/UN/IA **三路** VALID 齐,UN 未标 →
|
||||
保护判据保持停走(`cal:` 行 `vl=0x11`、`cl=0xe6`;`[PROT] uncalibrated -> protection blocked`)。
|
||||
这是预期行为,不是缺陷;UN 标定完成前**不得**绕过。
|
||||
|
||||
---
|
||||
|
||||
## 8. 逐通道验证方法(上板自检口径)
|
||||
@@ -222,7 +262,7 @@ Q16 后是 1.0e10,而 int32 上限只有 2.147e9;UB/UC 走 STM32 更到 5.28
|
||||
1. **TPAFE 侧**:对目标 `AIN` 注入 1 V DC,观察对应 `buf[i]` 变化(UA→`buf[6]`、UN→`buf[5]`、IA→`buf[2]`);**语义与下标不符即映射错**。判据不需要示波器:① 用固件帧计数替代"`BUSY` 有脉冲"——注入前后 `tpafe5160_frame_seq()` 仍严格 1000 Hz 递增即等价;② 幅值判据用万用表读注入点实际电压 + 同时读 `adc_input_raw()` 码值,三点线性拟合(R² ≥ 0.999)。
|
||||
2. **STM32 侧**:对目标引脚(如 PC4=UB)注入 0.5 V,读 `ADC_CHANNEL_14` 应变化;若不变而相邻通道变化 → 通道宏写错(见 §5 警告)。映射的**代码侧**一致性有两道保证:① `App/algo/adc_input.c` 的 `k_adc_map[]` 与 CubeMX 标签(`ADC17_UB`=PC4 等)逐条对齐;② 开机自检 `adc_input_init()` 校验每个 STM32 语义通道都落在 `k_stm32_rank_ch[]` 扫描序列内(挡"映射到不扫描的通道 → 恒读陈旧值")。
|
||||
3. **备用通道**:RESERVED 路不接入任何语义,UI 与上报里不得出现;若实测有读数漂移,只记录不消费。
|
||||
4. **端子侧变比**:上面 1/2 两条都只到 **ADC 引脚**。③ 段(`AINn` ↔ 转换器引脚)已由网表追线定死为 **1:1**(`ADCn` 节点无对地元件,拓扑图见 §7.1),**板内没有未知比值**;④ 子板/端子板变比按子板参数算定——电压族 606.06 : 1、电流族 29.4118 A/V(算式与复核边界见 §7.2;子板原理图仍不在仓库内,数值确认归两点标定)。故**不得**用"2:1 分压"换算出二次值;端子口径一律按 §7.1 分段表与 §7.2 登记写。
|
||||
4. **端子侧变比**:上面 1/2 两条都只到 **ADC 引脚**。③ 段(`AINn` ↔ 转换器引脚)已由网表追线定死为 **1:1**(`ADCn` 节点无对地元件,拓扑图见 §7.1),**板内没有未知比值**;④ 子板/端子板变比出厂按子板参数登记(电压族 606.06 : 1、电流族 29.4118 A/V),**已由 2026-11-12 两点标定在 UA / IA 上实测覆盖**(554.69 V/V、29.634 A/V,见 §7.3;UN 未标)。故**不得**用"2:1 分压"换算出二次值;端子口径一律按 §7.1 分段表与 §7.2 / §7.3 登记写。
|
||||
|
||||
### 8.1 静态注入实测记录
|
||||
|
||||
@@ -280,8 +320,8 @@ Q16 后是 1.0e10,而 int32 上限只有 2.147e9;UB/UC 走 STM32 更到 5.28
|
||||
| 1 通路活 | 9 路都在转换、没串道、极性没反? | ✅ 2026-10-27 已证 |
|
||||
| 2 静态引脚电压 | 注 1 V 直流,读数是不是 1 V? | ✅ 2026-10-27 已证(六项判据全 PASS,§8.1) |
|
||||
| **3 动态引脚波形** | **注 Vpp 2.828 V 正弦(板上读数 ≈1 V),算出来还是不是 1 V?** | **✅ 2026-11-02 / 11-04 已跑两轮、六轮全部闭合**(削顶 2 Hz 档与复位复核经用户裁定 2026-11-04 关闭;谐波 B 行超差已归因板端前端 RC fc≈796 Hz → §8.2;实测结论 §8.2) |
|
||||
| 4 端子二次值 | 引脚上这 1 V 对应端子侧几 V? | 🟡 等子板原理图或实物(变比参数已算定,见 §7.2) |
|
||||
| 5 精度等级验收 | 额定工况下整条链误差够几级? | 🟡 等标准源 |
|
||||
| 4 端子二次值 | 引脚上这 1 V 对应端子侧几 V? | 🟡 **UA / IA 已由两点标定落地**(2026-11-12,见 §7.3;屏上已显二次值、`eng = 1`);UN 台架无有效信号未标,保护仍闭锁 |
|
||||
| 5 精度等级验收 | 额定工况下整条链误差够几级? | 🟡 等标准源(本轮继保仪标定只到保护口径 3~5 %,够不上 0.5 级计量) |
|
||||
|
||||
**三条结论**:
|
||||
|
||||
@@ -290,8 +330,9 @@ Q16 后是 1.0e10,而 int32 上限只有 2.147e9;UB/UC 走 STM32 更到 5.28
|
||||
2. **第 3 级已于 2026-11-02 / 11-04 台架闭环,全程没用到任何外部资源**:一台能出 50 Hz 正弦的交流信号发生器,
|
||||
接在**已经验证过的那个注入点**上就行。它比第 4、5 级安全一个量级——只需 ±2 V 以内的正弦,
|
||||
而端子级验证要上 100 V / 220 V 二次值。
|
||||
3. **第 4、5 级在等外部**:④ 子板/端子板变比(仓库里没有原理图)与标准源两点标定,
|
||||
两者完成前 `eng` 保持 0,本波只承诺"ADC 引脚电压"。开工前置见
|
||||
3. **第 4 级已部分落地、第 5 级在等外部**:④ 端子变比已由 2026-11-12 两点标定**实测得出**
|
||||
(UA / IA,见 §7.3),屏上显的已是二次值、`eng = 1`;UN 台架无有效信号未标,
|
||||
三路齐不了 → 保护判据仍停走。⑤ 精度等级要等标准源送检。开工前置见
|
||||
`docs/算法/采集与算法层设计说明.md` §13.13。
|
||||
|
||||
### 9.2 波次退出判据与现状
|
||||
@@ -301,14 +342,15 @@ Q16 后是 1.0e10,而 int32 上限只有 2.147e9;UB/UC 走 STM32 更到 5.28
|
||||
| 退出判据 | 状态 | 证据 / 缺口 |
|
||||
|---|---|---|
|
||||
| ① 至少 1 路电压通道经已知电压注入验证,斜率与理论 LSB 偏差 ≤2 % | ✅ 2026-10-27 | UA 6544.2 vs 6553.6 码/V(−0.14 %),§8.1 |
|
||||
| ② `adc_cal` 折算落地,采样环里是**引脚电压 V** 而非码值 | ✅ | `App/task/adc_task.c:425`(全仓唯一折算点) |
|
||||
| ② `adc_cal` 折算落地(三维:系数 / 零点 / 变比),采样环里不是裸码值 | ✅ | `App/task/adc_task.c` 的 `adc_cal_apply()`(全仓唯一折算点) |
|
||||
| ③ 8 通道系数 / 零点 / 变比可落盘,加载失败回退 ROM 默认 | ✅ | `[adc_cal]` / `[adc_cal_ofs]` / `[adc_cal_sec]`,口径 `docs/算法/采集与算法层设计说明.md` §13.8 |
|
||||
| ④ 三处下游常数按工程量重定并注明依据 | ✅(有尾巴) | `docs/算法/采集与算法层设计说明.md` §13.7;幅值门在 `eng=0` 恒失效已记因于 `freq.h:58-60` |
|
||||
| ⑤ "未标定 → 保护闭锁"生效 | 🟡 软件道 ✅;**"解锁"这半程要等 `VALID` 置位**才能上台架验 | `adc_cal_prot_blocked()` + `App/task/protect_task.c:268` |
|
||||
| ⑤ "未标定 → 保护闭锁"生效,且三路齐后能自动解卡 | 🟡 闭锁道 ✅ 台架实证;解锁道只差 UN 一路 | 闭锁:`[PROT] uncalibrated -> protection blocked` + `vl=0x11`(UA/IA 已 VALID、UN 缺,2026-11-12);解锁代码路径 = `adc_cal_prot_blocked()` + `App/task/protect_task.c` |
|
||||
| ⑥ 量纲回归用例(不该动作时不动作)通过 | ✅ | `test/host/prot_dim/`,口径 `docs/算法/采集与算法层设计说明.md` §13.6 |
|
||||
|
||||
**所以差的是"台架面",它分两半**:动态这半已于 2026-11-02 / 11-04 台架闭环(§8.2);
|
||||
端子与精度那半要等子板与标准源(开工前置见 `docs/算法/采集与算法层设计说明.md` §13.13)。
|
||||
端子这半 2026-11-12 已由两点标定拿到 UA / IA 的实测变比(§7.3),剩 UN 一路与精度等级送检
|
||||
(开工前置见 `docs/算法/采集与算法层设计说明.md` §13.13)。
|
||||
|
||||
遥测链(快照发布)与运行参数/点表均已达成,口径沉淀在 `App/algo/meas.h`、`App/algo/run_par.h`
|
||||
头注释与 `docs/算法/采集与算法层设计说明.md` §13.9;其中"104 上送值与**工程量**一致"仍挂在
|
||||
|
||||
@@ -0,0 +1,151 @@
|
||||
# 采样数据校正全流程(从端子到上送:码值怎么变成可信工程量)
|
||||
|
||||
> **读这篇干什么**:按一帧数据的真实流向,把采样校正串成一条线——从端子码值到 104 上送、UI、保护,说清每步在哪个文件、用哪些系数、谁决定这数能不能信。本文是读者入口,推导、判据与实测表归各属主文档,这里只给「去哪查」。
|
||||
>
|
||||
> **一句话现状**:三维折算已上线、出厂变比已由 2026-11-11 台架实测写进固件(屏上直接显二次值);但两点标定尚未接到生产流程,`VALID` 未置位、保护判据仍闭锁、精度未验收。**「能显示二次值」≠「读数已达精度」**。
|
||||
>
|
||||
> **术语**:PT/CT = 电压/电流互感器(一次侧 → 端子二次值);104 = IEC 60870-5-104 上行规约;UI = 人机界面;Q16 = 16 位定点(整数 ÷ 65536 才是真值);eng = 本帧量纲标志;ROM / RAM = 固件出厂值 / 运行时内存副本。
|
||||
|
||||
---
|
||||
|
||||
## 1. 三个问题,三套系数
|
||||
|
||||
**这一节要你干什么**:先分清三件独立的事,别拿一个系数回答所有问题——后面每个模块只答其中一件。
|
||||
|
||||
| 问题 | 谁回答 | 答错了 |
|
||||
|---|---|---|
|
||||
| 码值 → 引脚电压 | 斜率 `k`(µV/码)+ 零点 `b`(码值) | 全链量纲错一倍,且无报错 |
|
||||
| 引脚电压 → 端子二次值 | 变比 `r` | 屏上是引脚电压却被当二次值,定值、死区跟着错 |
|
||||
| 这数能不能信 | `VALID` / `CLIPPED` / `eng` 三个判定 | 未标定粗测被当成已验收精度 |
|
||||
|
||||
**三条铁律**:① `k`/`b` 是板级模拟链事实、`r` 是互感器与端子板事实,互不派生、不许合并(推导 `docs/算法/采集与算法层设计说明.md` §13.2);② 量纲由 `r`/`eng` 决定、精度由 `VALID` 决定,是两件事(三态表 `docs/算法/采集与算法层设计说明.md` §13.3);③ 同一事实只在一处详述,本文只给锚点。
|
||||
|
||||
---
|
||||
|
||||
## 2. 整条链一图看全
|
||||
|
||||
**这一节要你干什么**:记住真实调用顺序,后面每节只展开图里的一个框;图只表达「谁流向谁」。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[端子 PT/CT 二次值] --> B[端子板 / 串阻焊盘]
|
||||
B --> C[两片转换器<br/>TPAFE5160 + STM32 ADC1]
|
||||
T[TIM3 1 kHz 更新事件] -.->|CONVST / TRGO / 唤醒| C
|
||||
C --> D[adc_input_poll<br/>原子快照 + DMA 乒乓]
|
||||
D --> E[adc_input_raw<br/>9 路原始码值]
|
||||
E --> F[adc_cal_apply<br/>code+b 乘 k 再乘 r]
|
||||
F --> G[sample_ring_push_frame]
|
||||
G --> H[phasor_run 全周傅氏]
|
||||
H --> I[freq_run 测频]
|
||||
I --> J[meas_tick 200ms 遥测快照]
|
||||
J --> K[IEC 104 上送]
|
||||
H --> L[UI 交流量页]
|
||||
H --> M[protectTask 保护判据]
|
||||
F -.->|原始码值 + 系数段头| N[录波段 WAVE00.BIN]
|
||||
O[config.ini 三段 + 104 整定] -.->|k/b/r RAM 副本| F
|
||||
O -.->|VALID 位图| M
|
||||
```
|
||||
|
||||
图里两条旁支别漏:**录波存原始码值 + 系数段头**(PC 侧按同式重算,见 `docs/子系统设计/故障录波设计说明.md` §3.2);**整定是另一条入口**(`k`/`b`/`r` 是启动时载入、可改写、置脏落盘的 RAM 副本,见下文整定一节)。
|
||||
|
||||
---
|
||||
|
||||
## 3. 第一步:把物理量变成原始码值(硬件 → code)
|
||||
|
||||
1. **转换**:TIM3 每 1 ms 发一个更新事件(`Src/tim.c`),同时启动 TPAFE5160 与片内 ADC1,并唤醒 adcTask——两片转换器因此共用同一采样时刻。
|
||||
2. **取数**:adcTask 用 `adc_input_poll()` 取原子快照,再按 9 路语义通道经 `adc_input_raw(sem, &out)` 取出码值,不写死下标。两个接口都在 `App/algo/adc_input.c`。
|
||||
|
||||
---
|
||||
|
||||
## 4. 第二步:唯一折算点,把码值变成工程量
|
||||
|
||||
`App/task/adc_task.c` → `adc_cal_apply()`(`App/algo/adc_cal.c`):
|
||||
|
||||
```
|
||||
工程量[V 或 A] = (code + b) × k[µV/码] × 1e-6 × r
|
||||
```
|
||||
|
||||
| 系数 | 管什么 | 出厂值 | 合法带 |
|
||||
|---|---|---|---|
|
||||
| `k` | 引脚电压 ↔ 码值(µV/码,Q16) | TPAFE `10000000L`(152.59)、STM32 `52800000L`(805.66) | ROM ×[0.5, 2.0] |
|
||||
| `b` | 零点(码值) | 两点标定得到,出厂 0 | ±8192 |
|
||||
| `r` | 端子二次值 ÷ 引脚电压(Q16) | 电压族 `65536000L`(1000.0 V/V)、电流族 `1927532L`(29.4118 A/V) | 0 或 ≥1.0 |
|
||||
|
||||
定义在 `App/algo/adc_cal.h`,ROM 出厂表(`k` 与 `r`)在 `App/algo/adc_cal.c`;推导见 `docs/算法/采集与算法层设计说明.md` §13.2。要点:
|
||||
|
||||
- 先算引脚电压再乘 `r`(并成一个大系数会溢出 int32、丢 float 精度);`r=0` 合法 = 本路不折算、停在引脚电压;越带不回退 ROM;TEMP 原样透传。
|
||||
- 出厂变比来自 2026-11-11 继保仪端子注入反算,取代被实测推翻的 606.06;电压族 5 V 注入仅约 33 码(真值区间 909~1111),是单点粗测、**不是铭牌精度**。见 `docs/硬件平台/ADC通道映射说明.md` §7.2。
|
||||
|
||||
`frame[]` 随即 → `sample_ring_push_frame()` → `phasor_run()` → `freq_run()`;每 200 ms `meas_tick()` 取一次遥测快照。精度目前只到引脚层约 ±2%,两点标定写完 `r` 并置 `VALID` 后才谈二次值精度(`docs/算法/采集与算法层设计说明.md` §13.5)。
|
||||
|
||||
---
|
||||
|
||||
## 5. 第三步:系数从哪来、怎么改(整定与落盘)
|
||||
|
||||
**这一节要你干什么**:弄清系数不是每拍现算的,而是一份「改了立刻生效、但要等保存才写进文件」的草稿——「改了」和「存了」是两件事。
|
||||
|
||||
**打个比方**:把 `k` / `b` / `r` 三本系数账想成编辑器里打开的文档。屏幕上改一个数字,下一拍折算就跟着变(这是内存里的草稿);但只有按了保存,改动才写进 `config.ini`;标题栏那个「未保存」小圆点,就是代码里说的**脏标志**。比如把 UA 的变比从 1000 改成 1010,屏上读数立刻变,可要是这时断电、小圆点还没熄,开机又变回 1000。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
C[草稿 = 当前生效的系数<br/>每拍折算直接读它]
|
||||
A[开机:用出厂值建三本草稿 k/b/r<br/>登记后再读回 config.ini 里上次存的值] --> C
|
||||
U[104 规约下发 / UI 整定页] --> W[改草稿 + 点亮「未保存」小圆点]
|
||||
W --> C
|
||||
W --> D[后台默认任务盯着小圆点]
|
||||
D --> E{小圆点亮着吗}
|
||||
E -->|亮着| F[三本草稿和运行参数一次写回 config.ini]
|
||||
F -->|写成功| G[熄灭小圆点]
|
||||
F -->|写失败| D
|
||||
G --> D
|
||||
E -->|没亮| H[什么都不做]
|
||||
```
|
||||
|
||||
- **开机那步为什么排在最前面**:得先告诉配置系统「有这三本账、各叫什么名字」,它才知道把文件里的值往哪填;所以 `adc_cal_init()`(`App/app/app_main.c`)的登记必须排在读取 `config.ini` 之前,那会儿任务调度还没启动。读回来的值直接覆盖草稿就生效,不用再通知谁。分三本是因为一本账最多记 16 项,8 路 × 3 种 = 24 项记不下;而且配置柜只有 8 个格位、已经全占满,不能再开第四本(`docs/算法/采集与算法层设计说明.md` §13.8)。
|
||||
- **谁能改、改了会怎样**:只有两个入口——104 规约下发或 UI 整定页,都经 `run_par_104_write()` / `run_par_cal_k_set()` 等(`App/algo/run_par.c`)转交 `adc_cal_set()` / `adc_cal_set_ratio()`(`App/algo/adc_cal.c`)。「改草稿」和「点亮小圆点」被绑在同一个动作里,就是防「屏上数值变了、文件永远没改、还不报错」。标定一路要调两个函数:一个管变比(这数是什么单位),一个点亮 `VALID`(这数准不准),少一个都不算完成。
|
||||
- **什么时候真写进文件**:后台默认任务盯着小圆点,`run_par_store_save()`(`App/algo/run_par.c`)调 `cfg_file_save()` 把三本草稿和运行参数一次写回;写成功才熄灯,写失败灯留着下轮再试。开机读文件、以及「等文件不再变动才读」由 `cfg_file_load()` / `cfg_file_poll()`(`App/cfg/cfg_file.c`)负责。
|
||||
- **怎么知道存上没有**:`adc_cal_get_stats()` 记着「改了几次」和「存了几次」,两者相减就是还欠着没存的次数;配合 `run_par_dirty_peek()` 看小圆点状态一起判断。
|
||||
- **⚠ 台架踩过的坑(已修)**:2026-11-12 标定时出现过「写进去当场读得回、约 8 秒后被打回出厂值」——根因是热重载那条路径**对同一份文件内容按段各解析一轮**,而解析函数会就地破坏缓冲区,第一段解析完后面的段就再也读不到键值行,静默全体回出厂默认,紧接着的保存又把出厂值写回文件、**永久覆盖整定**。修法是把解析改成非破坏性(逐行拷进栈缓冲再切分),并加了「后注册段也必须重载」的机器钉。为什么值得写进本篇:这类缺陷在开机路径上完全看不出来(开机只解析一轮),**只在「运行中改配置」时发作**,而标定正是这么用的。口径与守护 → `docs/子系统设计/配置文件设计说明.md` §4-(3)。
|
||||
|
||||
---
|
||||
|
||||
## 6. 两点标定:公式就绪、生产整定未接线
|
||||
|
||||
**这一节要你干什么**:别误以为两点标定已经在跑——这正是保护还闭锁的原因。
|
||||
|
||||
`adc_cal_two_point()`(`App/algo/adc_cal.c`)以 ROM 的 `k` 为入参,解出 `r` 与 `b`:
|
||||
|
||||
```
|
||||
r = (v_hi − v_lo) / [(c_hi − c_lo) × k]
|
||||
b = v_lo / (k × r) − c_lo
|
||||
```
|
||||
|
||||
标定点要跨度足够大——点太近会按 1/跨度放大读数误差(量化表属主 `docs/硬件平台/ADC通道映射说明.md` §7.2);本轮台架按安全优先裁定为电压族 5 V/50 V、电流族 0.5 A/2 A,误差代价与执行细节见 `docs/测试说明/专项验证/ADC两点标定执行流程.md` §2。
|
||||
|
||||
**⚠ 现状(两件不同的事,别混)**:**板上没有一键标定**——全仓 `adc_cal_two_point(` 只出现在定义、声明与 `test/host/adc_cal/` 单测里,生产代码零调用;**但台架手工路径是通的,且已经跑过**——端子加两个已知量、读 `meas:` 行相量读数、`test/host/cal_two_point.py` 离线解出 `r`/`b`、`test/host/cal_write.py` 经 104 定值段写入(`adc_cal_set()` 落 `b` 时置 `VALID`,脏→落盘→重启保持)。完整执行卡见 `docs/测试说明/专项验证/ADC两点标定执行流程.md`,开工前置与送检顺序见 `docs/算法/采集与算法层设计说明.md` §13.13。
|
||||
|
||||
**2026-11-12 台架结果**:UA(`r = 554.69`)与 IA(`r = 29.63`)已标定并落盘,`VALID` 位图 `0x11`;**UN 未标**(台架该通道无有效信号)。保护判据要求 UA/UN/IA 三路齐,所以**现在仍然是闭锁态**——只差 UN 一路。实测数据与「2026-11-11 那个 1000.0 为什么错」的归因见 `docs/硬件平台/ADC通道映射说明.md` §7.3。
|
||||
|
||||
---
|
||||
|
||||
## 7. 第四步:三个判定互不派生
|
||||
|
||||
**这一节要你干什么**:把最易混的三个状态分开;判定本体在 `adc_cal_flags()` 与 `adc_cal_prot_blocked()`(都在 `App/algo/adc_cal.c`),下游只是消费者。
|
||||
|
||||
| 判定 | 问的是 | 由什么决定 | 谁消费 |
|
||||
|---|---|---|---|
|
||||
| `VALID` | 准不准 | 文件位图 ∧ `k`/`b` 在带 ∧ `r` 已配置 | 保护闭锁 |
|
||||
| `CLIPPED` | 能不能用 | 来源派生(V0.1 五路单极性恒置位,非「此刻在削顶」) | 104 品质位、UI 量纲断言 |
|
||||
| `eng` | 什么单位 | 未削顶各路都已配 `r` → 二次值 | UI 第 7 行标签、录波段 |
|
||||
|
||||
- `eng` 判据 `feed_eng()`(`App/app/ui_data_feed.c`)**不看 VALID**:只配变比没标定时输出确实是二次值,标签若跟 VALID 走会自相矛盾。
|
||||
- `VALID` 才管闭锁:`adc_cal_prot_blocked()` 查 UA/UN/IA 三路,`protectTask`(`App/task/protect_task.c`)据此停走判据、记 SOE。三态表见 `docs/算法/采集与算法层设计说明.md` §13.3。
|
||||
|
||||
---
|
||||
|
||||
## 8. 第五步:折算结果流向哪里
|
||||
|
||||
- **104**:`meas_tick()`(`App/algo/meas.c`)每 200 ms 写 `meas_snap_t` 双区,点表经 `meas_get()` 上送;品质注入源是 `CLIPPED` 位图。200 ms 是上送节拍、不是平均窗(`docs/算法/采集与算法层设计说明.md` §13.9)。
|
||||
- **UI / 保护**:仍直读 `phasor_get()` / `freq_get()`,未走 `meas`——「104 与 UI 共用一份上游」目前是设计意图、代码未落地。
|
||||
- **录波**:段文件存原始码值 + 封存瞬间的 `k` / `b` / `r` / `VALID` / `CLIPPED`,PC 侧按同式重算(`docs/子系统设计/故障录波设计说明.md` §6.2)。
|
||||
- **改 `r` / 量纲的连带动作**:`FREQ_AMP_MIN`、104 死区、保护定值三处同步重定,否则「量纲变了、门限没变」会静默错判(`docs/算法/采集与算法层设计说明.md` §13.7)。
|
||||
+16
-9
@@ -525,10 +525,12 @@ adcTask 静态最坏链与余量的**台账在** `docs/内存管理/RAM使用分
|
||||
104 与 UI 拿到的数从哪来一份**。它是 `App/algo/adc_cal.*`、`meas.*`、`App/cfg/cfg_file.*`、
|
||||
`App/task/protect_task.c`、`Drivers/BSP/UI/ui_data*` 这些模块头注释里引用的口径出处。
|
||||
|
||||
**当前状态**(2026-11-11 起):折算链已落地,量纲由**每路变比 `r`** 决定——出厂默认已带台架
|
||||
实测反算的变比(电压 1000 V/V、电流 29.4118 A/V),所以烧进新固件后屏上直接显**二次值**;
|
||||
精度仍待标准源两点标定改写 `r`。保护判据仍处于**未标定闭锁**态(§13.3),因为 VALID 还要求
|
||||
两点标定这一步真的做过。
|
||||
**当前状态**(2026-11-12 更新):折算链已落地,量纲由**每路变比 `r`** 决定——出厂默认已带台架
|
||||
实测反算的变比(电压 1000 V/V、电流 29.4118 A/V),所以烧进新固件后屏上直接显**二次值**。
|
||||
**两点标定已上板实跑**:UA(`r = 554.69`)与 IA(`r = 29.63`)标定并落盘、`VALID` 置位
|
||||
(`vl = 0x11`),实测值登记 → `docs/硬件平台/ADC通道映射说明.md` §7.3;UN 台架无有效信号未标。
|
||||
保护判据仍处于**未标定闭锁**态(§13.3),因为 VALID 要求 **UA/UN/IA 三路齐**,现在只差 UN 一路——
|
||||
这是预期行为,不是缺陷。
|
||||
|
||||
### 13.1 通道量纲与折算点
|
||||
|
||||
@@ -652,9 +654,12 @@ V0.1 恒命中 UB/UC/IB/IC/IN,位图 `0xE6`),它表示"这路不能测交
|
||||
`cal:` 行的 `rail=` 位图与 `rail: edge=…` 那行 `[ERR]`——这条路径至今只在直流饱和里起过(判据见
|
||||
`docs/测试说明/专项验证/ADC前端注入验证流程.md` §8.5 削顶卡)。
|
||||
|
||||
> **承诺边界**(2026-11-11 更新):**量纲**已到端子二次值(出厂默认变比已带硬件事实,
|
||||
> `eng` 判据见 §13.3);**精度**仍只到"ADC 引脚电压这一层的 ±2 %"——标准源两点标定
|
||||
> 写入 `[adc_cal_sec]` 的 `r` 并置 `VALID` 之后,二次值才谈得上精度。两点标定怎么开工见 §13.13。
|
||||
> **承诺边界**(2026-11-12 更新):**量纲**已到端子二次值(出厂默认变比已带硬件事实,
|
||||
> `eng` 判据见 §13.3);**精度**分两档说清——① 引脚层 ±2 % 已由动态六轮证过;
|
||||
> ② 端子二次值这一档,UA / IA 已用继保仪两点标定**实测落盘**(`r = 554.69` / `29.63`,
|
||||
> 单台、标定点 5 V–50 V 与 0.5 A–2 A,1 LSB 摊入约 0.7 % / 0.6 %,够保护判据 3~5 %、
|
||||
> **够不上 0.5 级计量**),UN 未标;**精度等级验收**仍等标准源送检。
|
||||
> 两点标定怎么开工见 §13.13,实测值 → `docs/硬件平台/ADC通道映射说明.md` §7.3。
|
||||
|
||||
**动态验证已跑两轮(2026-11-02 / 11-04),六轮全部闭合**——幅值 / 波形 / 相位 / 测频 / 谐波 /
|
||||
削顶直流档都过了;实测数与逐轮结论只详述在 `docs/硬件平台/ADC通道映射说明.md` §8.2,本节不抄第二份。
|
||||
@@ -662,7 +667,7 @@ V0.1 恒命中 UB/UC/IB/IC/IN,位图 `0xE6`),它表示"这路不能测交
|
||||
|
||||
| 下游 | 现在 | 为什么 |
|
||||
|---|---|---|
|
||||
| 基波有效值 | ✅ 引脚层过(±2 % 内,三档幅值两点复现) | 台架幅值轮 + 波形轮(基波分量口径)实证;**二次值这一档的精度仍未验**——出厂变比是单点粗测反算(5 V 注入只有 33 码,1 LSB = 3 %,电压族真值区间约 909~1111),标准源两点标定后才算数 |
|
||||
| 基波有效值 | ✅ 引脚层过(±2 % 内,三档幅值两点复现) | 台架幅值轮 + 波形轮(基波分量口径)实证;**二次值这一档**:UA / IA 已由继保仪两点标定实测落盘(`r = 554.69` / `29.63`),旧结论"出厂变比是单点粗测(5 V 注入只有 33 码、1 LSB = 3 %、真值区间约 909~1111)"仍成立且已在 2026-11-12 被实测定量:实测 554.69 说明那次粗测接线分压把比值放大了一倍(`docs/硬件平台/ADC通道映射说明.md` §7.3);**精度等级**仍待标准源送检 |
|
||||
| 相位 | ✅ 同片内过(录波档 ≤2° 判据) | 同段 UA/UN 两路实测(0° 与 90° 两工况);**跨转换器仍禁比**——两片转换器无共同采样触发,是 V0.1 硬件边界(`docs/硬件平台/ADC通道映射说明.md` §7 通道归属行),不是待修缺陷 |
|
||||
| 频率 | ✅ 「如实报不可测」成立(这就是现状判据) | 含满幅注入段全不可测、UI 恒 `--`;**45~55 Hz 精度仍未验**——要验须降 `FREQ_AMP_MIN` 单跑一轮 |
|
||||
| 削顶 / 品质 | ✅ DC −1.00 V 档锁存 + sticky 实证;2.0 Hz 低频档与复位复核经用户裁定 2026-11-04 关闭 | `[ERR] rail: edge=0x2 sticky=0x2` 唯一一条、撤注恒持 |
|
||||
@@ -829,11 +834,13 @@ typedef struct {
|
||||
| 待定 | 备选 | 为什么必须先定 |
|
||||
|---|---|---|
|
||||
| **精度目标** | 0.5 级 / 1 级 | 决定两点标定的判据,否则"误差 ≤ 目标精度"这条无法判定。保护判据本身只需 3~5 %,0.5 级是计量口径 |
|
||||
| **端子 / 子板变比从哪来** | ① 有原理图(直接算)② 只有实物(万用表同时量端子与引脚)③ 都没有 | 决定变比登记的**可信度**(注意:量纲已不依赖它——出厂默认变比已按台架实测反算写进 `[adc_cal_sec]`,`eng` 能升 1;缺的是精度)。2026-11-11 用继保仪单点注入反算得 1000.0 / 29.4118,推翻了原先按子板参数算定的 606.06(详见 `docs/硬件平台/ADC通道映射说明.md` §7.2);② 两点标定是拿到精度的正规路径;③ 则二次值只有单点粗测精度(电压族真值区间约 909~1111) |
|
||||
| **端子 / 子板变比从哪来** | ① 有原理图(直接算)② 只有实物(万用表同时量端子与引脚)③ 都没有 | 决定变比登记的**可信度**(注意:量纲已不依赖它——出厂默认变比已按台架实测反算写进 `[adc_cal_sec]`,`eng` 能升 1;缺的是精度)。2026-11-11 用继保仪单点注入反算得 1000.0 / 29.4118,推翻了原先按子板参数算定的 606.06(详见 `docs/硬件平台/ADC通道映射说明.md` §7.2);**2026-11-12 两点标定又把 1000.0 推翻**——接线分压使 PT 一次侧只拿到一半电压,实测 UA = 554.69,与参数算定值 606.06 只差 8.5 %(`docs/硬件平台/ADC通道映射说明.md` §7.3)|
|
||||
| **`eng = 0` 期间测频幅值门怎么处置** | 保持恒失效(现状,UI 恒 `--`)/ 台架临时把 `FREQ_AMP_MIN` 降到引脚域量级跑一轮再还原 / 换成相对量门限 | 建议**常态保持恒失效 + 需要时临时降门跑一轮**;换相对量门限要先重新论证,别在过渡期改。临时降门会改产品头文件,收尾必须还原到 `git diff` 为空并重跑构建 |
|
||||
|
||||
**送检顺序不可倒过来**:产品构建当前要求 UA/UN/IA 的标定 `VALID` 全部置位才走保护判据。
|
||||
未完成标准源标定就送检,保护会表现为不动作。保持该闭锁,不用非标准源标定走捷径。
|
||||
(2026-11-12 台架已按此顺序执行:先 UA / IA 逐路标定落盘,UN 因无有效信号停在此处,
|
||||
保护**如预期保持停走**,没有为了让闭锁消失而伪造 `VALID`。)
|
||||
|
||||
## 14. 相关文档
|
||||
|
||||
|
||||
Reference in New Issue
Block a user