采集与算法
从两片转换器到 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; 更新事件同时用于:
- ISR 内脉冲 TPAFE
CONVST; - TRGO 触发 ADC1 一轮 9 通道转换, DMA 自动搬运。
- ISR 内脉冲 TPAFE
- 采用双缓冲/连续请求,
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 |
STM32F4-Base 百科
入门
子系统
开发与验证
参考
仓库
STM32F4-Base 百科 · 基于仓库 master 分支整理 · 最后更新: 2026-11-01
内容以源码、AGENTS.md 与 docs/ 为准; 发现页面过期, 请在 维护指南 中按流程更新。