f5902bcc21
两篇规划期文档改成对当前系统的描述,档名统一去掉"设计说明"的"说明"。 运行与自检记录: - 旧档重写为现状版(10 节:概览 / 记录布局 / 写入路径 / 读取与呈现 / 事件分类 / 控制台日志 / 双端差异 / 内存 / 异常恢复 / 自测要点), 删掉需求表、调研摘要、模块清单动作列、实施步骤与开放问题。 - 按代码纠正:七类记录齐备(原文只写了两类)、自检描述串换成实际 落盘的 28 条、待机阈值以 ui_tokens.h 为准、记录页已走 ui_w_records 共享组件、容量满只删该文件而非整卷清空。 - 待机屏移出本篇:它不属于日志,归 UI 侧;内容页架构补"待机屏 (覆盖层)"一节,产品需求 FR-LOG-3 拆成单纯的上电/重启分类, 待机显示归口已有的 FR-UI-3。 ADC 采样节拍: - §4.5 从 45 行压到 24 行,只留规则 / 违反的代价 / 为什么 / 兜底与 档案指针;九路置换实测表、A/B 对照、探针计数等取证归 ADC_Trap_Records.md 的 TRAP-ADC-01(那里已有完整档案)。 - adc1_gap 字段去掉"2026-10-21 起、此前固件为次数"的修订记录式括号。 - app_main.c 的注释改为指向 TRAP-ADC-01 取证、§4.5 设计口径。 引用同步:两个旧档名全仓替换(含代码注释、角色档、归档 id 表), 旧名残留 0;对 ADC 篇的 § 引用逐条复核落在真实章节上。 验证:48 个提交期钩子全通过,check_doc_links --sections-strict 通过。
93 lines
4.1 KiB
C
93 lines
4.1 KiB
C
/*
|
||
* 模块名称:采样环缓冲(全周傅氏相量计算的输入)
|
||
* 模块功能:按**语义通道**保存最近若干周波的采样值,供 全周傅氏相量计算按窗取数。
|
||
* V0.1 上 8 路电气量分属两片转换器(双转换器无共同采样触发),本层只做"按时序
|
||
* 存/取",**不做任何跨通道运算**——同刻性由上游(语义取数与有效性)保证,本层不假设。
|
||
* 容量取 **2 个周波(40 点)**,与参考系统 `CN_BUFSAM_CYCLE = 2`
|
||
* (规划 §10.1)一致,为后续加长数据窗(1.5~2 周波,抗衰减直流,
|
||
* 见 `傅氏算法详解.md` §9 Q4)预留空间。
|
||
* 适用平台:STM32F407ZGTx(**纯算法**:不碰寄存器、不碰 RTOS → 可主机侧纯逻辑单测)
|
||
* 作者:王建锋
|
||
* 创建日期:2026-10-10
|
||
* 修改记录:
|
||
* v1.0 2026-10-10 王建锋 创建:全周傅氏相量输入环缓冲(20 点/周波 × 2 周波)
|
||
*/
|
||
|
||
#ifndef SAMPLE_RING_H
|
||
#define SAMPLE_RING_H
|
||
|
||
#include <stdint.h>
|
||
|
||
#include "adc_input.h" /* adc_semantic_t / ADC_SEM_COUNT:本层按语义通道存取 */
|
||
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
|
||
/* 每周波采样点数(1000 Hz @ 50 Hz,见 docs/子系统设计/ADC采样节拍设计.md) */
|
||
#define SAMPLE_RING_CYCLE_N 20U
|
||
/* 环容量(周波数)——与参考系统 CN_BUFSAM_CYCLE 一致 */
|
||
#define SAMPLE_RING_CYCLES 2U
|
||
/* 环深度(点):一周波点数 × 周波数 */
|
||
#define SAMPLE_RING_DEPTH (SAMPLE_RING_CYCLE_N * SAMPLE_RING_CYCLES)
|
||
|
||
/*
|
||
* 函数功能:采样环缓冲初始化
|
||
* 入口参数:无
|
||
* 返 回 值:无
|
||
* 限定条件:内核启动前调用(无 RTOS 依赖)
|
||
* 函数说明:清空全部通道历史与计数;可重复调用(幂等)。
|
||
*/
|
||
void sample_ring_init(void);
|
||
|
||
/*
|
||
* 函数功能:压入一拍(一帧)全部语义通道的采样值
|
||
* 入口参数:values - 按语义通道顺序排列的一帧采样值(浮点工程量,长度须 = ADC_SEM_COUNT)
|
||
* n - 实际长度(必须等于 ADC_SEM_COUNT,否则拒收)
|
||
* 返 回 值:0 - 成功;-1 - 参数错(空指针或长度不符)
|
||
* 限定条件:调用方保证同一帧内各通道**同刻**(同族量同刻性由上游 语义取数与有效性负责)
|
||
* 函数说明:整帧一次性写入,写完统一推进写指针——单帧内不可能出现"半新半旧",
|
||
* 即天然无帧内撕裂。消费侧读到的窗永远是**整帧**边界。
|
||
*/
|
||
int sample_ring_push_frame(const float *values, uint8_t n);
|
||
|
||
/*
|
||
* 函数功能:取指定语义通道最近 n 点的窗(按时间序,旧 → 新)
|
||
* 入口参数:ch - 语义通道
|
||
* n - 取点数(1..SAMPLE_RING_DEPTH)
|
||
* out - 输出缓冲(长度须 >= n)
|
||
* 返 回 值:0 - 成功;-1 - 参数错;-2 - 已累积点数不足 n
|
||
* 限定条件:无
|
||
* 函数说明:out[n-1] 为最新一点。相量层以本函数取"以当前时刻为终止的一周波"。
|
||
* ⚠ 仅 adcTask 上下文调用(写者与读者同任务串行,本层不加锁);
|
||
* 为什么需要这一层、环内布局与窗首下标的推导 →
|
||
* `docs/算法/采集与算法层设计说明.md` §5。
|
||
*/
|
||
int sample_ring_window(adc_semantic_t ch, uint8_t n, float *out);
|
||
|
||
/*
|
||
* 函数功能:读已累积点数(饱和于 SAMPLE_RING_DEPTH)
|
||
* 入口参数:无
|
||
* 返 回 值:已累积点数(0..SAMPLE_RING_DEPTH)
|
||
* 限定条件:无
|
||
* 函数说明:供上层判断"数据是否够一周波"。
|
||
*/
|
||
uint16_t sample_ring_filled(void);
|
||
|
||
/*
|
||
* 函数功能:读累计入环帧数(**不饱和**,供心跳/丢帧观测)
|
||
* 入口参数:无
|
||
* 返 回 值:累计入环帧数(32 位,1 kHz 下约 49.7 天回绕)
|
||
* 限定条件:无
|
||
* 函数说明:与 语义取数与有效性的 `tpafe5160_frame_seq()` 对照可判丢帧(采样有效性校验
|
||
*(保护功能清单见 docs/算法/继电保护功能复现规划.md)
|
||
* 的判据之一,本层只提供计数,不做判定)。
|
||
*/
|
||
uint32_t sample_ring_frames(void);
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
|
||
#endif /* SAMPLE_RING_H */
|