直流电弧故障检测与电弧串扰抑制:多级确认算法设计实战
做了好几年光伏和储能系统的电弧故障检测我最大的体会是真正的故障电弧其实不难抓难的是怎么让算法在逆变器、DC-DC变换器、一堆开关电源旁边“冷静”工作不乱报。每一次在现场被误报折腾到怀疑人生最后揪出来的原因几乎都指向同一个问题——电弧串扰。所以这篇东西我不想只罗列算法公式而是想从原理到实现把电弧故障检测算法到底在检测什么、电弧串扰为什么那么让人头疼、以及怎么用一套多级确认算法把串扰摁住完整讲清楚。适合刚接触AFCI的硬件工程师、嵌入式软件工程师也适合正在被误报问题折磨的现场调试人员。直流电弧和常见的交流短路不太一样它没有过零点一旦引燃就可能持续燃烧。电弧中心的温度可以到几千摄氏度铜排、绝缘层、结构件在这种温度下根本撑不住。光伏组串、储能电池簇、直流充电桩这些场景能量密度高设备又经常装在屋顶、车棚这种不方便处理的位置所以从电弧产生到保护动作切断留出来的反应窗口非常短。这也是为什么算法不能只追求“能识别”还要在识别率、响应速度、抗干扰三者之间做取舍。1. 电弧故障检测的根本先弄懂电弧到底在回路里留下什么痕迹1.1 时域特征故障瞬间的电流电压突变电弧本质上是空气被击穿形成导电通道。回路里突然多了一个“接触电阻”而空气通道两端的压降通常只有十几伏到几十伏但它能把几十安的电流硬生生维持住。反映到采样数据上最直观的就是电流波形出现台阶式突变、电压波形出现跌坑。时域检测算法做的就是这个事实时监测电流有效值的变化率di/dt或者电压跌落幅度一旦发现变化量超过阈值就报警。这种事实现起来非常简单一个差分窗口加一个比较器就能跑起来对MCU的资源几乎没有要求。但时域特征的“特异性”很差。光伏系统里MPPT扰动会改变电流储能PCS响应功率指令时电流也是随时在变的负载端的电机、加热器投切更是会制造一堆电流突变。这些都是正常工况特征却和电弧早期阶段的电流变化非常接近。如果只用时域突变做判据现场误报率会高到没法用。我见过一个用纯时域判据的早期方案在真实光伏电站跑了一个星期报警几十次没有一次是真电弧。1.2 频域特征电弧最要命的是高频噪声电弧的本质是等离子体放电放电通道里的载流子运动、碰撞电离是一个随机过程这种随机性决定了电弧会产生非常宽的频带噪声。从几十千赫兹一直延伸到几兆赫兹以上在几百千赫兹附近通常会形成一个明显的底噪声平台。这个频域特征就很有价值了。正常工作的电力电子设备噪声主要集中在开关频率及其整数倍谐波上频率是离散的而电弧噪声是连续的宽带底噪。把采样信号做FFT之后看特征频段内的底噪有没有抬升、抬升形态是“平台状”还是“尖峰状”就能在很大程度上区分电弧和普通干扰。频域检测的抗负载扰动能力比时域好得多。负载切换引起的是低频段的电流变化电弧在100kHz以上的噪声抬升基本不受低频分量影响两者可以在频域里“分家”。这也是为什么主流AFCI方案几乎都是以频域特征作为核心判据时域只能做辅助。1.3 算法路线选择高频噪声为主判据时域频域联合验证现在常说的电弧故障检测算法按技术路线分无非几类时域突变检测、频域FFT功率谱检测、小波时频分析、高频噪声方差统计。我把它们的工程表现整理过一张对照表算法路线实现成本抗负载扰动抗电弧串扰工程落地难度时域突变检测极低差差简单但误报率不可控频域FFT功率谱中等好中主流方案稳定高频噪声底检测低好中计算量小适合实时系统小波时频分析很高好较好嵌入式实时性难保证研究多量产少我自己的工程经验是不要迷信花哨算法。小波分析的时频定位能力确实强但在一颗普通的MCU上要实时处理连续数据流帧率、窗口和算力之间矛盾非常突出搞到最后只能降低采样率或者拉长判断时间反而得不偿失。真正可靠的做法是用“高频噪声底检测 频域形态验证 时间连续性确认”这套组合拳。2. 电弧串扰比故障电弧本身更难缠的敌人2.1 直流电弧为什么危险没有过零点这个背景要先说清楚很多做交流配电出身的人刚转到直流侧时会低估电弧的危险性。交流回路里电流每半个周期过一次零电弧在电流过零附近会因为能量供给中断而自然熄灭重新引燃需要在下一个半周期电压再次达到击穿条件。直流回路完全没有这个机制电流恒定一旦起了电弧能量持续灌入弧根处的材料不断熔化、气化弧道越来越稳定燃烧只会越来越猛烈。直流系统的AFCI要求在几百毫秒内完成从检测到断开这个时间窗口比交流保护苛刻得多。UL 1699B这类标准对直流电弧中断时间的要求业界做AFCI的基本都清楚。所以算法不能为了追求低误报就把判断时间拖得很长必须在误报率和响应速度之间找到平衡点。2.2 串扰是怎么串进来的三种主要耦合路径电弧串扰指的是本支路并没有发生电弧但检测单元却收到了“看起来像电弧”的信号。做过现场排查的人应该深有体会这种假信号来源五花八门归纳起来主要是三条路径。第一条是空间辐射耦合。故障电弧本身就是一个强烈的宽频辐射源电弧两端的线缆会像天线一样向外辐射电磁波。光伏电站的组串线缆经常几十米上百米地并行走线邻近支路的采样线本身就相当于一根接收天线电弧辐射出来的高频能量耦合进去检测单元看到的就是一个典型的宽频噪声抬升。第二条是传导耦合。多个组串、多路电池簇共用汇流箱、共用直流母线的情况非常常见。某一支路发生电弧时高频噪声电流沿着母线传导到其他支路再通过支路自己的采样电阻或者CT耦合进检测通道。这种耦合路径最隐蔽因为你查线路走向、查屏蔽层都未必能发现问题问题在公共节点上。第三条是地环路干扰。检测单元和功率设备之间通过保护接地线形成地环路高频地电流在采样参考地上产生电位差。ADC采到的信号叠加了这个地电位波动高频噪声底就莫名其妙地抬起来了。接地系统越复杂地环路干扰越难治理。在真实电站里这三条路径往往同时存在。我在现场调试时遇到过一个典型案例一个储能集装箱里装了好几台PCS和对应的AFCI模块单独测任何一台都正常全系统一起运行就开始乱报。后来查出来是某台PCS的开关噪声通过系统接地平面耦合到了所有AFCI的参考地每台设备的ADC底噪同时被抬高了几dB直接把触发阈值给顶穿了。3. 区分真实电弧与串扰信号三个硬核判据要解决串扰问题单纯靠提高触发阈值是没用的。阈值抬太高真实电弧会漏报阈值保持不变串扰信号照样误报。正确的思路是把“本支路特征”和“外部干扰特征”分开用多维度判据做区分。以下三个判据是我在实际项目中验证过有效性的。3.1 判据一频谱形态宽带底噪对窄带尖峰真实电弧的放电过程是随机碰撞电离能量在频谱上摊开形成连续宽带底噪特征频段内看不到特别占优的离散尖峰。就算有也是叠加在连续底噪之上的微小波动整体形态是“平台状”。而最常见的串扰源——逆变器和开关电源的开关噪声——在频谱上是离散尖峰。比如PCS的开关频率是16kHz那你在频谱图上会看到16kHz、32kHz、48kHz等一系列等间隔的尖峰还有边带分量。这些尖峰能量集中频谱形态是“梳状”的和电弧的“平台状”完全是两回事。所以处理串扰时不应该看到100kHz以上的能量抬升就报警而要先做频谱形态判断先看特征频段内有多少离散尖峰再看剔除尖峰之后底噪是否真的有抬升。尖峰多、底噪没动那基本可以判定是邻近设备的开关干扰串入尖峰少、底噪明显抬高才是真实电弧该有的样子。3.2 判据二相位随机性放电的本质是随机过程这个判据很多人会忽略但对区分串扰非常有效。对FFT结果中每个频点的瞬时相位求一阶差分再统计差分值的分布特征会发现两种信号的统计特性完全不一样。真实电弧的放电是随机的相位差分序列呈现明显的随机游走特性方差大没有规律。而串扰信号来自固定频率源的耦合相位差分曲线是近似线性的方差很小。在实际算法里对特征频段内所有频点的相位差分做统计得到一个“随机性指标”。随机性高指向真实电弧随机性低指向外部窄带干扰。这个判据的计算量也不大只需要在FFT计算时把相位信息保留下来多做一个差分统计而已。但它能把一大类窄带串扰直接排除掉。3.3 判据三时间一致性单帧干扰骗不了状态机很多瞬态干扰比如继电器吸合、接触器断开、浪涌、雷击感应持续时间只有几毫秒。电弧故障是一个持续过程一旦形成稳定弧道会连续燃烧持续满足特征判据几十帧甚至上百帧。所以算法里一定要加时间一致性确认不是单帧满足特征就报警而是要求连续M帧里至少N帧满足特征M和N的比例一般取60%~80%。比如每帧5ms连续50帧里至少40帧通过验证才进入下一步确认。这个机制能挡掉绝大多数瞬态干扰而且代价只是把判据触发时间延后一两百毫秒对直流电弧几百毫秒的响应窗口来说完全可接受。4. 电弧串扰的解决算法一套三级确认状态机的设计与实现4.1 整体架构从“看到一个信号就报”到“确认了再说”针对性解决电弧串扰问题我推荐把检测算法设计成一个三级状态机高频触发、频谱验证、光电确认。每一级都有自己的职责逐级收紧避免任何一个单一信号直接触发跳闸。第一级是快速触发只负责发现“可疑信号”并及时响应灵敏度高一些没关系第二级做频谱形态验证把“到底是不是电弧特征”判断清楚排除窄带串扰第三级是光电信号同步确认这是可选的硬件增强方案有条件的系统强烈建议加上能极大提升可靠性。整个状态的迁移逻辑如下面的伪代码所示。typedef enum { AF_STATE_IDLE, // 空闲 AF_STATE_TRIGGER, // 预触发 AF_STATE_VERIFY, // 频谱验证 AF_STATE_CONFIRM, // 综合确认 AF_STATE_TRIP // 发出保护指令 } af_state_t; void af_detection_process(frame_t *frame) { // 第一级高频噪声底抬升简单快速 float noise_db calc_hf_noise_floor(frame); switch (state) { case AF_STATE_IDLE: if (noise_db bg_noise_db TRIG_DB) { trig_count; if (trig_count TRIG_CONT_FRAMES) { state AF_STATE_TRIGGER; verify_cnt 0; pass_cnt 0; } } else { trig_count 0; // 背景噪声未抬升清零计数 } break; case AF_STATE_TRIGGER: if (spectrum_shape_check(frame)) { pass_cnt; // 第二级宽带底噪相位随机性验证 } verify_cnt; if (verify_cnt VERIFY_WINDOW) { if (pass_cnt VERIFY_PASS_MIN) { state AF_STATE_CONFIRM; // 持续稳定通过进入确认 } else { state AF_STATE_IDLE; // 特征不符判定为串扰 trig_count 0; } } break; case AF_STATE_CONFIRM: if (opt_signal_detect() || confirm_cnt CONFIRM_TIMEOUT) { state AF_STATE_TRIP; // 第三级光电信号确认 } confirm_cnt; break; case AF_STATE_TRIP: af_trip_relay(); // 断开回路 state AF_STATE_IDLE; break; } }4.2 第一级触发设计高频底噪抬升检测这一级的核心是“快”和“敏感”。用相对小的FFT窗口或者直接用带通滤波有效值统计计算特征频段内的高频噪声功率。特征频段我一般取100kHz~500kHz。低于100kHz容易被开关电源的低次谐波干扰高于1MHz线缆衰减和ADC带宽又跟不上500kHz以内是个比较均衡的选择。背景噪声基准不能取固定值也不能取算术平均值。我在现场碰到过最典型的情况某一路检测单元旁边有一个偶尔启动的大功率设备它一启动采样信号的底噪瞬间涨了6dB以上。如果用平均值做基准这个尖峰会直接把基准抬高系统灵敏度被“训练”得越来越迟钝用中位数做基准少数尖峰帧就不会污染整体基准这才是跟踪背景噪声的正确姿势。基准更新建议用滑动中位数加慢速遗忘因子比如每秒更新一次不跟随瞬时波动。触发阈值一般设置在背景噪声中位数之上6dB10dB。6dB对应功率翻四倍如果不是真实故障或者强干扰不会轻易引起这么大幅度的底噪抬升。还要加上连续帧确认比如连续10帧都超过阈值才进入第二级验证。这里10帧对应50ms左右的时间不会拖累整体响应速度。4.3 第二级验证设计频谱形态检查与窄带尖峰剔除进入第二级后算法需要做一次完整的FFT功率谱分析。对特征频段内每个频点先做峰值搜索确定噪声基底和尖峰分量。然后再用两个关键指标做判定。第一个指标是“宽带底噪抬升量”。把特征频段内所有尖峰剔除后看剩余频点的平均功率水平如果它确实比无故障时高出6dB以上说明有宽带噪声源存在。第二个指标是“相位随机性”。对每个频点的相位序列求一阶差分方差真实电弧的方差明显大于固定频率的干扰源。实际实现时我习惯把这两个指标做加权求和得到一个0~1之间的“疑似度”超过0.7就判定为有电弧特征。这个阶段还有一个重要的操控细节如果系统里已经知道邻近PCS的开关频率可以在FFT之前或者之后做一个梳状陷波滤波把已知干扰频点直接抠掉。但陷波不能做太狠宽度要尽量窄深度控制在20dB以内滤得太猛会把真实电弧在那些频点上的能量也削掉反而破坏了宽带底噪的一致性。更稳妥的做法是只做“标记不参与平均”而不是直接改数据。4.4 第三级确认设计光电信号同步确认第二级判定有电弧特征之后其实已经能排除大部分串扰了但为了把误报率压到接近零有条件的话强烈建议加第三级光电同步确认。原理很简单电弧放电一定会伴随强烈的光辐射用一个光敏二极管或者光电管检测弧光把光信号和电信号同时满足作为最终判据。光电信号同步确认最大的好处是彻底切断了“电信号串扰”这条路。串扰信号有可能通过电缆、地线、空间辐射耦合到采样通道里但很难跨过“距离”这道坎去触发另一个支路上的光传感器。哪怕你的光传感器就装在同一个汇流箱里它也有方向性邻近支路拉弧时的光照射角度和本支路拉弧时有明显差异加上合适的光学遮挡设计之后误触发的概率极小。光电确认的时间预算要给足一般光电传感器的响应时间在1ms到50ms之间加上光学设计里的漫反射延迟按150ms预算来设计比较稳。这级确认消耗的时间不会破坏整体性能因为第二级的验证窗口已经花掉了100多毫秒再等这150ms总时间依然在主流标准和行业共识允许的范围内。4.5 状态机的时间预算与动作时序把三级状态机的各级时间加起来算一笔响应时间账阶段耗时估算说明高频底噪触发约50ms连续10帧×5ms触发门槛频谱形态验证约100ms连续20帧×5ms满足通过比例光电同步确认约50~150ms光电传感器响应与确认逻辑总时间200~300ms满足直流AFCI的响应窗口要求这个时间预算是我在多个项目上验证过的。直流电弧从形成稳定弧道到引燃周围可燃物通常需要几百毫秒到几秒把总的保护动作时间控制在这个量级一方面够快另一方面也给多层验证留出了判断空间不会为了抢几毫秒牺牲掉抗串扰能力。5. 现场实录与避坑清单误报排查、参数调优和工程化心得5.1 遇到误报先按这个顺序排查电弧串扰问题在实验室里很难复现因为实验室的走线短、接地干净、参考源少。到了现场才会暴露出来。遇到误报我一般按下面的顺序排查先关闭本支路负载如果不带载依然报警说明信号是从外部耦合进来的不是本支路电流产生的。然后在邻近支路做拉弧测试看本支路是否报警这个实验能直接验证空间辐射和传导耦合路径是否存在。再看FFT频谱图如果频谱呈梳状尖峰几乎可以断定是开关器件噪声如果是连续宽底噪抬升才需要怀疑真实电弧或者宽带干扰源。随后检查线缆走线采样线和动力线是否长时间并行、是否有共用线槽这往往是空间辐射耦合最直接的原因。最后量参考地用示波器探头直接测采样地的波形看有没有高频纹波叠加。5.2 参数调整技巧阈值要数据驱动不能拍脑袋阈值设定是我见过最多人栽跟头的地方。有些工程师习惯直接抄参考设计里面的经验值到了不同电站适应性很差。正确做法是在项目现场先录10分钟的背景噪声数据算出底噪的中位数和P95/P99分位数再在这个分布基础上设置触发阈值。我一般用“背景中位数8dB”作为触发阈值用“背景P9510dB”作为报警阈值这样既保证了对缓慢底噪变化的适应性又不会被偶发的瞬态尖峰带跑。还有一个容易被忽略的细节背景噪声基准的更新频率不能太慢也不能太快。太慢环境变化后基准不跟手太快真实电弧把自己的底噪抬进基准里反而把灵敏度磨没了。我通常让基准的响应时间常数在1秒到5秒之间这样既能跟随温度、湿度变化引起的底噪漂移又不会因为短时故障抬高基准。5.3 几个容易踩的坑第一个坑是ADC前端的抗混叠滤波器带宽太窄。有人为了滤除干扰把滤波器截止频率做到200kHz觉得这样更干净结果真实电弧在300kHz以上的高频成分全被滤掉算法抓不到特征故障近在眼前却漏报。滤波器的带宽要和算法分析频段匹配通常需要留出至少2倍余量。第二个坑是采样率不够还硬要做频域分析。电弧检测的核心频段是100kHz~500kHz采样率至少2MSPS以上才有意义最好到4MSPS。如果MCU算不过来可以降FFT点数、提帧率也不要去压缩采样率。第三个坑是环境适应性太差。光伏电站和储能站的工作温度范围非常宽白天户外机柜里温度能到六七十摄氏度ADC的增益、基准都会漂底噪也会跟着变。如果算法里没有温度补偿和背景自学习机制夏天调好的参数到了冬天就可能频繁误报或者冬天不报、夏天乱报。第四个坑是只做了电信号判据没有硬件冗余验证。在可靠性要求高的场景里比如储能集装箱、直流充电桩强烈建议至少加一重非电判据光电探头、弧光传感器都可以。单一电信号判据在天生充满电磁干扰的环境里再怎么优化都有概率被击穿。加一重独立物理量的确认等于给整个算法上了一道保险。我个人的体会是电弧故障检测算法做到最后拼的不是学术指标的优秀而是工程取舍是否恰当。识别率、响应速度、抗串扰能力三者永远在博弈没有任何一种算法能同时在这三个维度做到极致。真正决定产品好坏的往往是你把误报压得有多低、把环境变化处理得有多稳。调试过程中最让人崩溃的不是算法跑不通而是它逻辑上完全正确却在一个意想不到的干扰源面前翻了车。所以每当我听人说“这个公式效果很好”的时候第一反应永远是问一句你在真实电站跑过多久