Files
STM32F4-Base/App/algo
wandering1 d59c2198eb feat(adc): L1 采集层落地——STM32 ADC1 扫描 + 语义通道映射
新增 App/algo/adc_input.c/h(L1 采集与预处理层,落实 L1-3/L1-4):
- L1-4 语义通道映射表 k_adc_map[]:UA/UN/IA → TPAFE buf[6]/[5]/[2];
  UB/UC/IB/IC/IN/TEMP → STM32 ADC1 CH14/3/6/1/2/5。消费侧一律经
  adc_input_raw() 按语义取数,不写死下标(V0.2 改版只改表内容)。
- L1-3 STM32 ADC1 9 通道软件触发顺序扫描:HAL_ADC_Start + 逐通道
  PollForConversion/GetValue(EOC_SINGLE_CONV + 无 DMA,可逐通道轮询)。
- adc_input_poll() 统一"TPAFE 原子快照 + STM32 扫描";
  adc_input_init() 做映射自检(STM32 映射通道必落在扫描序列内,否则
  返回 -1),挡住"映射到不扫描的通道 → 恒读陈旧值"的静默错。

集成:
- adc_task.c 取数改走 L1 层(首帧日志补全 8 路 + 温度;心跳增
  adc1_rc/adc1_err 观测 STM32 侧健康度)。
- app_main.c 在 tpafe5160_init() 之后调 adc_input_init(),失败记
  SYSLOG_SELFTEST("ADC map fault")。
- Keil 工程挂 adc_input.c 并加 ../App/algo 包含路径。
- 文档同步:继电保护规划 §1.2/§3.1(L1-3/L1-4 改 ✅)、ADC通道映射说明
  §7/§8/§9、产品需求 §5.9/§9、架构总览 §7、AGENTS.md、App/README.md、
  App/task/README.md、新增 App/algo/README.md、boot_log_data 清单。

验证:
- @build 0 错 0 警;镜像无源文件新于 hex。
- 台架 @test PASS:ADC input layer init OK、adc1_rc=0/adc1_err=0
  (30 s ≈27 万次转换零超时)、seq 仍 1000.0 Hz、adc 栈峰值
  528→584 B(余 71%)、回读一致、零 [ERR]/HardFault。
  证据 docs/测试说明/boot_log_data/20261010_prod_adc_l1_boot_log.txt
- 内存快照已刷新(Flash 269,404→270,712 B)。
2026-10-10 16:06:31 +08:00
..

App/algo/ — 采集与算法层(L1 / L2)

自研代码,属 docs/算法/继电保护功能复现规划.md §2.1 分层中的 L1(采集与预处理) 与 L2(相量计算,拟)。原则:算法与 I/O 分离——本层不碰寄存器、不碰任务调度, 只做"数"(码值 → 工程量)与"相量"(工程量 → 复相量),从而可成为主机侧单元测试 (L0.5)的天然适格对象(落实登记簿 A-4)。

现有模块

文件 层 职责
adc_input.c/h L1 ADC 输入层:① 语义通道映射(L1-4)——UA/UB/UC/UN/IA/IB/IC/IN/温度 → 物理通道,消费侧按语义取数、不写死下标;② STM32 ADC1 9 通道软件触发顺序扫描(L1-3);③ TPAFE5160 原子快照消费

关键约定

  • 语义映射的唯一权威口径是 docs/硬件平台/ADC通道映射说明.md(V0.1 有 13/17 路被置换, 网名编号 ≠ 通道号)。V0.1 上 8 路电气量分属两片转换器(硬件缺陷 N-18):UA/UN/IA 在 TPAFE5160、UB/UC/IB/IC/IN 在 STM32 ADC1。V0.2 改版只改映射表内容,本层 API 与上层语义不动。
  • 取数一律经 adc_input_raw()(按语义),禁止在消费侧直接索引驱动缓冲或写死下标。
  • 本层不做跨转换器的相位 / 功率 / 功率因数 / 矢量类运算(V0.1 硬件缺陷 N-18 限制)。

相关文档

  • 通道映射权威口径:docs/硬件平台/ADC通道映射说明.md
  • 分层与路线图:docs/算法/继电保护功能复现规划.md(§2.1 分层、§3.1 L1 清单)
  • 采样节拍:docs/子系统设计/ADC采样节拍设计说明.md