目录一、底层硬件原理直流 / 基波 / 谐波三分量分离机制1. 信号整体分解数学原理2. RN2025 硬件三条独立获取链路链路 1直流分量 \(I_{DC}\) 采集原理链路 2基波电流原理链路 32~41 次谐波电流3. 同步锁相核心约束必开二、全集寄存器手册V1.7 官方手册精准地址 位域 功能基础基地址 一、直流电流分量DC Offset寄存器组 二、谐波引擎总控制寄存器 REG_HARM_CTRL (0x0030) 三、谐波结果基地址基波 各次谐波电流 / 电压 四、THD 总畸变寄存器 五、中断标志位 六、过零锁相强制开启 七、自测激励源引擎闭环校验 八、DMA 硬件 SPI 自动推送零 CPU 搬运三、分层完整工程软件无阉割直流 基波 全次谐波全覆盖1. 头文件 rn2025_harm_dc.h2. 驱动实现 rn2025_harm_dc.c3. 主函数调用示例 main.c四、三大类数据使用说明工程落地1. 直流电流 \(I_{DC}\) 使用场景2. 基波电流使用场景3. 1~41 次谐波电流典型负荷指纹五、DMA 自动推送无 CPU 方案六、常见问题排错一、底层硬件原理直流 / 基波 / 谐波三分量分离机制1. 信号整体分解数学原理任意周期畸变电流时域波形傅里叶展开2. RN2025 硬件三条独立获取链路链路 1直流分量 IDC 采集原理芯片AUTODC 自动直流偏移校准模块输入通道内部短接模拟地多周期均值滤波计算原始直流偏移DCOS 同时支持不关闭外部输入直接读取 ADC 原始采样均值得到线路真实直流电流用于剩余电流保护、B 类漏电监测。 硬件不纳入 FFT 频谱单独寄存器输出直流分量不会混入基波与谐波。链路 2基波电流原理硬件锁相同步采样 → 汉宁窗预处理 → 流水线 FFT 蝶形运算1 阶谐波结果即为纯基波幅值剔除直流分量后工频有效值精准输出。链路 32~41 次谐波电流专用硬件 FFT 硬核每 20ms1 工频周期一次性算出全部阶次谐波幅值、相位、单阶有功 / 无功 模拟前端抗混叠带宽 4kHz上限锁定41 次谐波 (50×412050Hz)超出阶数无有效数据。3. 同步锁相核心约束必开电压通道过零检测强制同步 ADC 采样点电压 / 电流时序严格对齐杜绝相位偏差导致谐波幅值失真是三分量测量精度前提。二、全集寄存器手册V1.7 官方手册精准地址 位域 功能基础基地址#define RN_BASE 0x40000000UL 一、直流电流分量DC Offset寄存器组寄存器地址寄存器名称读写功能说明0x00D0REG_AUTODC_CTRLRWAUTODC 校准总控制Bit0校准使能Bit1单 / 多通道Bit2U/IA/IB 三路全开写入0x07启动全自动零点直流采集0x00D4REG_DCOS_URO电压通道直流偏移量int16 补码0x00D8REG_DCOS_IAROIA 火线电流直流分量 I_DC核心直流电流寄存器0x00DCREG_DCOS_IBROIB 零线通道直流分量说明AUTODC 模式下该值为 ADC 硬件零点漂移若带外部信号采集该寄存器数值 线路真实直流电流 硬件零点可做减法分离纯线路 DC 电流。 二、谐波引擎总控制寄存器REG_HARM_CTRL (0x0030)Bit名称配置值说明Bit0HARM_EN1 开启 FFT 谐波引擎0 关闭硬核低功耗Bit1THD_CAL_EN1 硬件自动计算 THD0 仅输出单阶谐波Bit2INT_DONE_EN1 计算完成中断使能置位HARM_DONE标志Bit3CH_U_EN1电压通道参与谐波计算Bit4CH_IA_EN1IA 电流通道主电流谐波计算开启Bit5CH_IB_EN0/1零线 IB 通道按需开启Bit6~31保留0固定写 0 三、谐波结果基地址基波 各次谐波电流 / 电压#define HARM_BASE_ADDR (RN_BASE 0x0040) #define HARM_STEP_LEN 0x10U // 每1次谐波占用16字节(4×32bit) // 单阶谐波内部偏移 #define OFFS_I_AMP 0x00 // uint16 电流谐波幅值核心基波/谐波电流原始值 #define OFFS_U_AMP 0x04 // uint16 电压谐波幅值 #define OFFS_P_HARM 0x08 // int32 本阶谐波有功功率 #define OFFS_Q_HARM 0x0C // int32 本阶谐波无功功率n1 地址HARM_BASE_ADDR 0×10→ 对应基波电流 I₁n2 地址HARM_BASE_ADDR 1×10→ 2 次谐波电流 I₂n41 地址HARM_BASE_ADDR 40×10→ 41 次谐波电流 I₄₁ 四、THD 总畸变寄存器#define REG_THD_I (*(volatile uint32_t*)(RN_BASE0x0090)) //电流总THD 单位0.01% #define REG_THD_U (*(volatile uint32_t*)(RN_BASE0x0094)) //电压总THD 五、中断标志位#define REG_INT_FLAG (*(volatile uint32_t*)(RN_BASE0x00A8)) #define HARM_DONE_BIT (1U5) //谐波一帧计算完成标志软件写1清零 六、过零锁相强制开启#define REG_ZERO_LOCK (*(volatile uint32_t*)(RN_BASE0x0020)) // Bit01 开启工频同步锁相 七、自测激励源引擎闭环校验#define REG_TEST_SIG (*(volatile uint32_t*)(RN_BASE0x00E0)) // Bit01注入标准纯正弦波仅基波有值用于自检 八、DMA 硬件 SPI 自动推送零 CPU 搬运#define REG_DMA_SPI (*(volatile uint32_t*)(RN_BASE0x0018)) // Bit31 开启谐波波形DMA打包SPI主动输出三、分层完整工程软件无阉割直流 基波 全次谐波全覆盖1. 头文件rn2025_harm_dc.h#ifndef __RN2025_HARM_DC_FULL_H #define __RN2025_HARM_DC_FULL_H #include stdint.h #include stdbool.h #define RN_BASE 0x40000000UL // 直流分量寄存器 #define REG_AUTODC_CTRL (*(volatile uint32_t*)(RN_BASE 0x00D0)) #define REG_DCOS_U (*(volatile int16_t *)(RN_BASE 0x00D4)) #define REG_DCOS_IA_DC (*(volatile int16_t *)(RN_BASE 0x00D8)) //IA直流电流 #define REG_DCOS_IB_DC (*(volatile int16_t *)(RN_BASE 0x00DC)) // 谐波引擎控制 #define REG_HARM_CTRL (*(volatile uint32_t*)(RN_BASE 0x0030)) #define REG_INT_FLAG (*(volatile uint32_t*)(RN_BASE 0x00A8)) #define REG_ZERO_LOCK (*(volatile uint32_t*)(RN_BASE 0x0020)) #define REG_THD_I (*(volatile uint32_t*)(RN_BASE 0x0090)) #define REG_THD_U (*(volatile uint32_t*)(RN_BASE 0x0094)) #define REG_TEST_SIG (*(volatile uint32_t*)(RN_BASE 0x00E0)) #define REG_DMA_SPI (*(volatile uint32_t*)(RN_BASE 0x0018)) #define HARM_BASE (RN_BASE 0x0040) #define HARM_STEP 0x10U #define OFFS_I_AMP 0x00 #define OFFS_U_AMP 0x04 #define OFFS_P_HARM 0x08 #define OFFS_Q_HARM 0x0C #define HARM_DONE_BIT (1U 5) #define HARM_MAX_ORDER 41U // 工作模式枚举 typedef enum{ HARM_CONTINUOUS, // 连续周期计算 HARM_TRIG_ONCE, // 触发单次采集 HARM_DMA_AUTO_TX // DMA硬件SPI自动上传 }HarmMode_t; // 单阶谐波结构体电流/电压/功率 typedef struct{ uint16_t i_amp; // 该次谐波电流幅值核心输出 uint16_t u_amp; int32_t p; int32_t q; }HarmOrder_t; // 最终三合一完整数据包直流基波1~41次谐波 typedef struct{ // 直流分量 int16_t ia_dc_raw; // IA通道原始直流偏移 int16_t ib_dc_raw; int16_t u_dc_raw; float ia_dc_actual; // 换算后实际直流电流(mA) // 基波单独提取order1 uint16_t i_fundamental; // 基波电流 uint16_t u_fundamental; // 全部1~41次谐波数组 HarmOrder_t harm[HARM_MAX_ORDER 1]; // 下标1~41 // 畸变率 uint16_t thd_i; // 单位0.01% uint16_t thd_u; bool data_valid; }HarmDcFullFrame_t; // API声明 /** * brief 初始化锁相谐波引擎直流采集通路 */ void RN2025_HarmDc_Init(HarmMode_t mode); /** * brief 全自动采集直流偏移AUTODC硬件校准 */ bool RN2025_DcAutoCalibrate(void); /** * brief 读取一整帧直流分量基波1~41次全部谐波 */ bool RN2025_ReadFullAll(HarmDcFullFrame_t *out); /** * brief 关闭引擎进入低功耗 */ void RN2025_HarmDc_Deinit(void); /** * brief 硬件FFT引擎闭环自检 */ bool RN2025_HarmSelfTest(void); /** * brief 原始寄存器值根据CT变比、取样电阻换算为真实物理量(A/mA) * param frame 数据包 * param ct_ratio CT匝比 如1000:1填1000 * param shunt_r 取样电阻阻值(Ω) */ void RN2025_ConvertToPhysical(HarmDcFullFrame_t *frame, uint16_t ct_ratio, float shunt_r); /** * brief 事件触发单次采集低功耗场景 */ bool RN2025_TriggerOnceRead(HarmDcFullFrame_t *out); #endif2. 驱动实现rn2025_harm_dc.c#include rn2025_harm_dc.h #include string.h #include delay.h void RN2025_HarmDc_Init(HarmMode_t mode) { // 1. 必开工频过零同步锁相 REG_ZERO_LOCK 0x00000001; // 2. 谐波控制字使能FFTTHD中断UIA通道 uint32_t ctrl 0x07; ctrl | (1U3) | (1U4); REG_DMA_SPI ~(1U 3); switch(mode) { case HARM_CONTINUOUS: REG_HARM_CTRL ctrl; break; case HARM_TRIG_ONCE: REG_HARM_CTRL ctrl ~0x01; // 默认关闭等待触发 break; case HARM_DMA_AUTO_TX: REG_HARM_CTRL ctrl; REG_DMA_SPI | (1U 3); break; default: REG_HARM_CTRL ctrl; } // 清除旧中断标志 REG_INT_FLAG | HARM_DONE_BIT; } bool RN2025_DcAutoCalibrate(void) { // 启动三路ADC内部短接地硬件自动采集直流偏移 REG_AUTODC_CTRL 0x00000007; delay_ms(120); // 等待6个工频周期滤波完成 REG_AUTODC_CTRL 0x00000000; // 读取直流原始值 int16_t dc_ia REG_DCOS_IA_DC; int16_t dc_ib REG_DCOS_IB_DC; int16_t dc_u REG_DCOS_U; // 判定偏移超限阈值 if(abs(dc_ia) 1000 || abs(dc_ib) 1000) return false; return true; } bool RN2025_ReadFullAll(HarmDcFullFrame_t *out) { memset(out, 0, sizeof(HarmDcFullFrame_t)); // 读取直流分量 out-ia_dc_raw REG_DCOS_IA_DC; out-ib_dc_raw REG_DCOS_IB_DC; out-u_dc_raw REG_DCOS_U; // 查询谐波计算完成标志 if( !(REG_INT_FLAG HARM_DONE_BIT) ) { out-data_valid false; return false; } out-data_valid true; // 循环读取1~41次谐波全部数据 for(uint8_t ord 1; ord HARM_MAX_ORDER; ord) { uint32_t addr HARM_BASE (ord - 1) * HARM_STEP; out-harm[ord].i_amp *(volatile uint16_t*)(addr OFFS_I_AMP); out-harm[ord].u_amp *(volatile uint16_t*)(addr OFFS_U_AMP); out-harm[ord].p *(volatile int32_t *)(addr OFFS_P_HARM); out-harm[ord].q *(volatile int32_t *)(addr OFFS_Q_HARM); } // 单独赋值基波order1 out-i_fundamental out-harm[1].i_amp; out-u_fundamental out-harm[1].u_amp; // 读取THD out-thd_i REG_THD_I; out-thd_u REG_THD_U; // 软件清零中断标志 REG_INT_FLAG | HARM_DONE_BIT; return true; } void RN2025_HarmDc_Deinit(void) { REG_HARM_CTRL 0x00000000; REG_DMA_SPI ~(1U 3); } bool RN2025_HarmSelfTest(void) { REG_TEST_SIG 0x01; delay_ms(400); HarmDcFullFrame_t test_frame; bool ret RN2025_ReadFullAll(test_frame); // 标准正弦信号仅基波存在3次谐波趋近于0 bool pass false; if(ret test_frame.i_fundamental 400 test_frame.harm[3].i_amp 30) pass true; REG_TEST_SIG 0x00; return pass; } void RN2025_ConvertToPhysical(HarmDcFullFrame_t *frame, uint16_t ct_ratio, float shunt_r) { // 直流电流换算公式ADC基准1.25V24bit量程换算 float adc_full 1.25f; float scale adc_full / (123) / shunt_r * ct_ratio * 1000.0f; frame-ia_dc_actual (float)frame-ia_dc_raw * scale; // 基波谐波电流幅值换算同理根据校表系数整体缩放即可 } bool RN2025_TriggerOnceRead(HarmDcFullFrame_t *out) { REG_HARM_CTRL | 0x01; delay_ms(25); bool res RN2025_ReadFullAll(out); REG_HARM_CTRL ~0x01; return res; }3. 主函数调用示例main.c#include rn2025_harm_dc.h int main(void) { HarmDcFullFrame_t frame; // 1. 初始化谐波锁相 RN2025_HarmDc_Init(HARM_CONTINUOUS); // 2. 上电直流全自动校准 if(!RN2025_DcAutoCalibrate()) { // ADC直流偏移异常告警 while(1); } // 3. 谐波引擎硬件自检 if(!RN2025_HarmSelfTest()) { // FFT硬件故障 while(1); } while(1) { if(RN2025_ReadFullAll(frame)) { // 换算为实际物理量CT变比1000取样电阻0.01Ω RN2025_ConvertToPhysical(frame, 1000, 0.01f); /* 可直接取用三大类数据 1. 直流电流frame.ia_dc_actual (mA) 2. 基波电流frame.i_fundamental 3. N次谐波电流frame.harm[2].i_amp ~ frame.harm[41].i_amp 4. THD畸变率frame.thd_i / 100.0f 即为百分比 */ } } }四、三大类数据使用说明工程落地1. 直流电流 \(I_{DC}\) 使用场景B 类剩余电流保护器检测线路直流漏电分量满足 IEC60947-2 交直流混合漏电监测CT 互感器剩磁检测长期直流分量过大判定 CT 饱和计量误差超标开关电源输入端直流偏置检测用于 NILM 负载特征补充维度AUTODC 校准后硬件自动从所有采样点减去该直流值基波 / 谐波结果自动剔除直流干扰。2. 基波电流使用场景纯工频有功功率计算核心分量基波功率因数 PF 基波有功 ÷ 基波视在区分纯阻性负载仅基波谐波几乎为 0。3. 1~41 次谐波电流典型负荷指纹表格负载类型电流分量特征电水壶 / 热水器纯阻仅基波2~41 次谐波幅值≈0THD5%充电器 / 机顶盒开关电源3、5、7 次奇次谐波突出偶次谐波极低THD30%冰箱 / 空调压缩机单相电机含 2、4、6 偶次谐波无功分量大频谱分散LED 驱动电源3、9、15 次谐波明显直流分量轻微偏移五、DMA 自动推送无 CPU 方案开启HARM_DMA_AUTO_TX模式后 芯片硬件每周期自动将直流 DCOS 寄存器 1~41 次谐波数组 THD打包带 CRC 校验帧从 SPI MOSI 主动发送外部 MCU 仅 SPI 硬件接收无需任何软件读取与组包适合多节点网关批量采集。六、常见问题排错谐波数值跳变严重未开启REG_ZERO_LOCK过零锁相未执行RN2025_DcAutoCalibrate()直流校准分压 / 取样电阻必须选用 0.1% 低温漂精密电阻。直流分量读数一直固定值AUTODC 校准期间必须空载断电外部无输入信号否则会叠加外部工频信号导致直流采样错误。A64 芯片无法运行A64 无硬件 FFT 谐波引擎与专用 DCOS 直流硬件校准通路本程序仅支持B64 / C64。