/* * 模块名称:采样环缓冲(L2 相量计算的输入) * 模块功能:按**语义通道**保存最近若干周波的采样值,供 L2 相量计算按窗取数。 * V0.1 上 8 路电气量分属两片转换器(双转换器无共同采样触发),本层只做"按时序 * 存/取",**不做任何跨通道运算**——同刻性由上游(L1)保证,本层不假设。 * 容量取 **2 个周波(40 点)**,与参考系统 `CN_BUFSAM_CYCLE = 2` * (规划 §10.1)一致,为后续加长数据窗(1.5~2 周波,抗衰减直流, * 见 `傅氏算法详解.md` §9 Q4)预留空间。 * 适用平台:STM32F407ZGTx(**纯算法**:不碰寄存器、不碰 RTOS → 可主机侧单测 L0.5) * 作者:王建锋 * 创建日期:2026-10-10 * 修改记录: * v1.0 2026-10-10 王建锋 创建:L2 输入环缓冲(20 点/周波 × 2 周波) */ #ifndef SAMPLE_RING_H #define SAMPLE_RING_H #include #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 - 参数错(空指针或长度不符) * 限定条件:调用方保证同一帧内各通道**同刻**(同族量同刻性由上游 L1 负责) * 函数说明:整帧一次性写入,写完统一推进写指针——单帧内不可能出现"半新半旧", * 即天然无帧内撕裂。消费侧读到的窗永远是**整帧**边界。 */ 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] 为最新一点。相量层以本函数取"以当前时刻为终止的一周波"。 */ 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 天回绕) * 限定条件:无 * 函数说明:与 L1 的 `tpafe5160_frame_seq()` 对照可判丢帧(采样有效性校验 *(保护功能清单见 docs/算法/继电保护功能复现规划.md) * 的判据之一,本层只提供计数,不做判定)。 */ uint32_t sample_ring_frames(void); #ifdef __cplusplus } #endif #endif /* SAMPLE_RING_H */