采集与算法
super_agent_bot edited this page 2026-11-02 07:55:38 +08:00

采集与算法

从两片转换器到 104 主站的一条最小闭环。当前状态: 采集处理 → 相量/测频 → 保护判据 → protectTask → IEC 104 已闭环(2026-10-12); RS-485 对下采集尚未接线(按用户决定冻结)。当前保护判据处于未标定闭锁状态, 等两点标定写入后自动解锁。

细节见 App/algo/README.md、docs/算法/继电保护功能复现规划.md、docs/子系统设计/ADC采样节拍设计说明.md、docs/子系统设计/IEC104上行设计说明.md。

1. 数据链总览

flowchart TB
    TIM["TIM3 更新事件<br/>1 kHz"] -->|CONVST| T["TPAFE5160<br/>8 路电气量"]
    TIM -->|TRGO| A["STM32 ADC1<br/>9 路 DMA"]
    T --> S["原子快照"]
    A --> S
    S --> TASK["adcTask<br/>每拍消费"]
    TASK --> L1["语义取数与有效性"]
    L1 --> R["采样环"]
    R --> P["全周傅氏相量"]
    P --> F["测频"]
    P --> L3["保护判据"]
    L3 --> PT["protectTask<br/>20 ms"]
    PT --> I["IEC 104<br/>TCP 2404"]

关键设计: adcTask 是纯消费者, 只取数、不做保护运算; 采样节拍与任务唤醒同源(TIM3 ISR 内触发 CONVST, 并置位任务通知; 同一更新事件经 TRGO 触发 ADC1)。这样不会出现“任务自己定时、硬件另一个节拍”的漂移。

2. 采样节拍与硬件约束

2.1 1 kHz、20 点/周波

  • 目标: 8 路电气量持续采集, 1000 Hz, 50 Hz 下 20 点/周波。
  • TIM3: PSC = 83、ARR = 999 → 1 kHz; 更新事件同时用于:
    1. ISR 内脉冲 TPAFE CONVST;
    2. TRGO 触发 ADC1 一轮 9 通道转换, DMA 自动搬运。
  • 采用双缓冲/连续请求, adcTask 每拍消费一帧, 避免覆盖。

2.2 F4 的硬约束

  • ADC1 外部触发只认 TIM1/TIM2/TIM3/TIM4/TIM5/TIM8 的 CC 或 TRGO; TIM6/TIM7 的 TRGO 只接 DAC。因此节拍源必须是 TIM3, 不能是 TIM6/TIM7。
  • ADC1 在 DMA2 上只挂 Stream0 或 Stream4; 本工程选 Stream4, 避免挤走 SPI1/USART1 RX。换流后会被重置为优先级 0, 必须回 NVIC 核对(外设中断 ≥5)。
  • DMAContinuousRequests 必须 ENABLE; 关掉会导致一轮 9 通道只发一次请求, 静默丢 8 路。
  • DMA 目的缓冲必须在 SRAM(DMA2 不可达 CCM)。
  • STM32F4 ADC 上电必须自校准; CubeMX 不生成, 本仓裁剪版 HAL 也没有 HAL_ADCEx_Calibration_Start, adc1_calibrate() 手写在 Src/adc.c 的 USER CODE 区, 由 MX_ADC1_Init() 末尾调用。缺它不报错, 只是读数带失调。

2.3 取数纪律

  • 只用 tpafe5160_snapshot()(临界区原子快照)取 TPAFE 数据。
  • 旧的 get_buf() / data_ready() / clear_ready() 已从驱动删除: 两步之间被抢占会拷回两帧混合数据, s_ready 还有三写者竞态。
  • 消费者侧统一经 adc_input_poll() / adc_input_raw() 按语义取数, 不写死下标。
  • ISR 侧只能走 adc_tick_irq_notify()(内含“消费者就绪”门); TIM3 比调度器早约 100 ms 启动。

3. 采集处理层

采样有效性校验的数据流

图: 采样有效性校验 - 帧序号/错误计数/单调性.

模块: App/algo/adc_input.*、App/algo/adc_health.*。

职责:

  • 把两片转换器的原始码值映射为语义通道(Ua/Ub/Uc/U0、Ia/Ib/Ic/I0、温度等);
  • 自检映射表自洽性: 映射指向不会被扫描的通道 → 初始化返回 -1, 避免“读到恒为陈旧值”的静默错;
  • 挂载 STM32 ADC1 DMA(失败返回 -2);
  • 每拍消费一帧 TPAFE 快照 + 一帧 ADC1 DMA 双缓冲;
  • 提供有效性/健康判定, 供保护与 104 使用。

映射权威表: docs/硬件平台/ADC通道映射说明.md。网名 AINn ≠ 板级 ADCn ≠ 转换器通道号, 必须查表。

4. 相量层与测频

采样环的环形布局

图: 采样环 - 用最近两个周波供相量取窗.

模块: App/algo/sample_ring.*、App/algo/phasor.*、App/algo/freq.*。

  • sample_ring: 按采样节拍写入环形缓冲, 供相量计算取窗。
  • phasor: 全周波傅氏(单频 DFT)算法; 利用正交性做梳状带通, 抑制谐波; 滑动窗更新; 输出幅值/相位; 系数表折算有效值, 区分保护/遥测双轨。
  • freq: 相量派生量, 自适应窗测频; 由 adcTask 每拍运行, 保护判据经 prot_elm_run() 取数。
  • 纯算法层不依赖外设/RTOS, 可在主机侧单元测试。

傅氏算法原理与工程实现见 docs/算法/傅氏算法详解.md; 保护功能复现规划见 docs/算法/继电保护功能复现规划.md。

5. 保护判据层与 protectTask

模块: App/algo/prot_set.*、App/algo/prot_elm.*, 任务体 App/task/protect_task.c。

  • prot_set_init(): 出厂默认定值封存校验和; prot_elm_init(): 复位元件状态并解析相量索引(必须在 phasor_init() 之后)。
  • protectTask: 20 ms 判据节拍, 运行 prot_elm_run()、采样故障闭锁、定值校验和巡检。
  • 跨上下文复归: 104 的 YK11 经 prot_elm_request_reset() 落请求, 不直接跨任务改状态。
  • 纳入 IWDG required_mask(TASK_WD_PROTECT, 产品 0x1F7)。
  • 保护定值落盘: iec104Task 检测到定值脏后置 SYS_EVT_PROT_SET_SAVE, 由 defaultTask 消费并写 /prot_set.bin。

保护判据的完整清单、定值表与验收见 docs/算法/继电保护功能复现规划.md 与 App/algo/README.md。

6. IEC 60870-5-104 上行

模块: App/protocol/iec104*(协议核心 + 服务任务), 任务 iec104Task。

  • 被控站, TCP 2404; V0.1 有效子集点表;
  • 遥测上送短浮点, 采集上传系数 = 1;
  • 支持总召、COV、遥控两段式、定值读写;
  • 链路参数 k/w/t1~t3 按设计文档;
  • 任务先等 NET_READY(100 ms 分片 + 每片喂狗)再建监听, 100 ms 循环服务;
  • 纳入 IWDG(TASK_WD_IEC104)。

点表、帧格式、链路流程与测试方案见 docs/子系统设计/IEC104上行设计说明.md。

7. RS-485 对下采集(未接线)

  • 硬件: UART4, PC10 TX / PC11 RX / PA15 DE, 半双工。
  • 产品定义: 对下 ModBus RTU 采集(下行采集口; 上行走以太网 104)。
  • 现状: rs485_init() 已调用, rs485_task.c 为空桩, 未在 freertos.c 创建; App/protocol/ 预留(仅 README + .gitkeep)。
  • 冻结原因: 按用户决定冻结(2026-10-12); 接线前还有驱动契约问题待修:
    • 单缓冲包撕裂;
    • 发送超时未等发送完成就拉低方向控制未修;
    • 接线前必须先确认驱动契约已修, 并在建任务前后各跑一次 stack_report.py。

当前最大功能缺口在此, 但不是缺陷难修, 而是产品节奏与驱动契约未就绪。详见 docs/任务规划/暂缓-RS485.md。

8. 已知边界

  • V0.1 上 8 路电气量分属两片转换器, 跨转换器无同一时刻性; 禁止在 V0.1 主板侧做相位/功率/功率因数/矢量运算。
  • 启动段(app_main_init + bring-up)没有看门狗保护。
  • adcTask / protectTask 不依赖网络/存储屏障, 任何构建都会创建。
  • 新增采集消费者前必须核算栈与 RAM; 改栈前后跑 scripts/stack_report.py。

9. 延伸阅读

主题 文档
采集与算法模块说明 App/algo/README.md
ADC 采样节拍 docs/子系统设计/ADC采样节拍设计说明.md
ADC 通道映射 docs/硬件平台/ADC通道映射说明.md
傅氏算法 docs/算法/傅氏算法详解.md
保护复现规划 docs/算法/继电保护功能复现规划.md
IEC 104 docs/子系统设计/IEC104上行设计说明.md
RS-485 暂缓 docs/任务规划/暂缓-RS485.md
任务规划总表 docs/任务规划/README.md