嵌入式NILM:基于电流波形特征的非侵入式电器识别

发布时间:2026/10/29 4:08:23
嵌入式NILM:基于电流波形特征的非侵入式电器识别

简介:本资源为2021年全国大学生电子设计竞赛本科组H题「用电器分析识别装置」的完整赛题文档,面向电子类、自动化及测控专业本科生,聚焦非侵入式负载识别这一典型嵌入式系统工程实践问题。文档详述了学习/识别双模式架构、7类以上电器(含自制小电流器件)的特征参量建模方法、电流互感器采样电路设计要点、微控制器低功耗实现策略及无线传输扩展方案,并附有评分标准与系统框图等关键设计依据。资源为单个PDF文件,大小315KB,内容涵盖任务说明、基本要求、发挥部分、测试规范及设计报告评分细则,结构完整、术语规范,便于备赛复盘与课程设计参考。已有1894人学习下载,适合电子竞赛新手建立系统设计思维,也适合作为电参量分析、特征提取与嵌入式实时识别等知识点的教学案例。

1. 用电器分析识别装置(H题):不是“电流表”,而是藏在插排里的用电行为黑匣子

你有没有试过——家里同时开着LED灯、路由器、机顶盒、USB充电器,总电流才不到80mA,但电磁炉一启动,整条支路电流瞬间飙到9A?这时候,普通电流表只能告诉你“现在流了9.23A”,而H题要你做的,是让设备自己说:“刚接入的是电磁炉,编号7;LED灯(编号1)和路由器(编号4)一直在线;机顶盒(编号5)在3秒前断电了。”

这不是电流测量题,是非侵入式负荷分解(NILM)的嵌入式落地实践。它不拆电器、不接通信号线、不依赖设备指纹,只靠一根穿心式电流互感器(CT)套在火线上,采样工频周期内的原始电流波形,从中抠出谐波含量、相位偏移、启停瞬态、稳态包络等多维电参量特征,再用轻量级分类逻辑完成实时识别。适合电子设计竞赛中具备模电基础、能写ADC采样+FFT+状态机的本科团队,也适合想把“电流波形→电器语义”这条链路从论文搬到实物的初学者。它不追求AI大模型精度,但必须扛住小电流(5mA)被大电流(10A)淹没的信噪比地狱,必须在2秒内完成增减判断——这才是真实嵌入式场景的硬骨头。


2. 特征参量怎么选:从工频波形里榨取7类电器的“电流DNA”

2.1 为什么不能只看有效值?——小电流电器的生存困境

基本要求明确要求:电流≤50mA的电器不少于5种,其中1号是自制电器,2号是市售LED灯泡,两者电流差<1mA但相位不同、谐波成分迥异。如果只算Irms(均方根电流),1号和2号在ADC采样噪声下根本无法区分。实测某STM32F103C8T6+HLK-2005 CT模块组合,在5mA档位下Irms波动达±0.8mA,远超1mA容差。有效值只是入口,不是终点。

提示:别急着写FFT,先用示波器抓一段真实波形。你会发现:

  • LED灯泡:半波整流+电容滤波 → 波形尖峰陡、导通角窄、奇次谐波(3/5/7)能量集中;
  • 节能灯管:高频电子镇流器 → 电流含20kHz左右开关噪声,基波畸变更平缓;
  • USB充电器(带负载):反激拓扑 → 启动有浪涌、稳态含100Hz纹波、偶次谐波略显;
  • 自制1号电器(RC+二极管):纯相位滞后 → 基波相位角>60°,但3次谐波衰减快于2号。

2.2 四类必采特征参量及其物理意义

我们最终锁定以下4类可嵌入式计算的特征,全部基于单周期(20ms,50Hz)或双周期(40ms)窗内运算,避开浮点FFT(资源吃紧),改用查表+累加优化:

特征类型计算方式物理意义是否用于小电流识别备注
基波相位角θ₁atan2(Q₁, P₁),其中P₁=∑(i[n]·cos(2πn/100)), Q₁=∑(i[n]·sin(2πn/100)),n=0~99(100点采样)反映负载阻抗角,区分阻性/容性/感性✅ 强相关避免arctan除零,用CMSIS DSP库arm_atan2_f32
3次谐波归一化幅值H₃`FFT₃/FFT₁
电流波形因子CFIrms / Iavg(Iavg为绝对值平均)衡量波形“瘦削度”,整流电路CF>1.4✅ 中等相关Iavg用`∑
启停瞬态能量比Eₜᵣₐₙₛ`(∑_{n=0}^{19}i[n]-i[n-1]²) / (∑_{n=0}^{99}i[n]²)`,前20点为上电沿捕捉浪涌/缓启特征,区分热水壶(突变)vs风扇(斜坡)

注意:所有特征均在硬件触发同步采样下获取。我们弃用定时器中断采样,改用CT副边输出经比较器整形后触发MCU的EXTI,确保每周期起始点对齐,消除相位漂移。这是后续相位角计算准确的前提。

2.3 特征降维与存储结构设计

7类电器,每类需存学习样本均值与3σ范围(用于识别时判断是否在正常波动内)。若存10维特征×7类×(均值+上下限)=210个float,超出STM32F103C8T6的20KB RAM极限。我们的解法是:

  • 定点化压缩:相位角存为int16_t(0~36000对应0°~360°),H₃存为uint8_t(0~255对应0~2.55),CF存为uint16_t(0~65535对应1.00~2.55);
  • 结构体打包:
typedef struct { int16_t theta_mean; // 基波相位均值(0.01°精度) uint8_t h3_mean; // H3均值(0.01精度) uint16_t cf_mean; // CF均值(0.0001精度) uint8_t theta_sigma; // 相位标准差(0.1°精度) uint8_t h3_sigma; // H3标准差(0.01精度) uint16_t cf_sigma; // CF标准差(0.0001精度) } feature_t; feature_t g_learned[7]; // 全局数组,占7×12=84字节RAM
  • 学习模式写Flash:每次学习完成,将g_learned[i]写入STM32内置Flash第2页(0x08004000),掉电不丢。擦除整页仅需20ms,符合“1分钟内完成7类学习”要求。

3. 硬件信号链设计:从CT到MCU,如何让5mA信号不被噪声吞没

3.1 电流互感器选型与调理电路陷阱

基本要求电流范围5mA~10A,跨度2000倍。常见错误是直接用2000:1 CT配运放,结果小电流时信噪比崩盘。我们实测对比:

  • HLK-2005(2000:1):5mA原边→2.5mA副边,经200Ω采样电阻得0.5V,但副边开路电感大,50Hz下相位误差达8°,且易受工频磁场干扰;
  • ZMCT103C(1000:1)+磁环绕线:将原边绕3匝→等效333:1,5mA→15mA副边,配100Ω电阻得1.5V,信噪比提升12dB,相位误差<1.5°。

关键设计:

  • CT副边必须加100Ω匹配电阻(非数据手册推荐的1kΩ),否则小信号带宽不足;
  • 采样电阻后接二阶有源低通(fc=2kHz),滤除开关电源噪声,但截止频率不能>3kHz,否则削平LED电流尖峰;
  • 运放选用TI OPA333(零漂移、轨到轨),供电用LDO(AMS1117-3.3)而非DC-DC,避免开关噪声耦合。

3.2 ADC采样策略:同步、抗混叠、防饱和

STM32F103的12-bit ADC在3.3V参考下,LSB=0.8mV。CT输出经调理后满量程2.5V,理论分辨率≈0.6mA,但实际需留裕量:

  • 参考电压:不使用内部VREF,外接REF3025(2.5V精密基准),温漂<20ppm/℃;
  • 采样率:100SPS(50Hz×2),严格同步于工频过零点(由CT副边比较器触发EXTI);
  • 防饱和机制:
// 在ADC中断中执行 if (adc_val > 4000) { // >3.3V×4000/4095≈3.22V g_gain_step++; if (g_gain_step > 3) g_gain_step = 3; // 最大3级增益 set_opa_gain(g_gain_step); // 切换运放PGA增益 clear_adc_buffer(); }
  • 抗混叠滤波:硬件端已用2kHz低通,软件端再加滑动平均(N=5),抑制脉冲干扰。

3.3 电源与功耗控制:如何把整机工作电流压到15mA以内

发挥部分要求分析识别模式下整机电流≤15mA(@220VAC输入)。我们采用三级功耗管理:

  1. 主控休眠:无电器接入时,MCU进入Stop Mode(RTC唤醒),电流≈2μA;
  2. 传感器门控:CT调理电路供电由MCU GPIO控制,仅在检测到电流>2mA时开启,省电8mA;
  3. 显示精简:放弃OLED,用3位共阴数码管(TM1650驱动),仅显示电器编号(1~7)和状态(ON/OFF),静态功耗<1mA。

实测整机待机电流=8.3mA(含CT偏置电路),满载识别时=13.7mA,满足要求。


4. 学习与识别算法实现:不用机器学习,也能跑通7类电器

4.1 学习模式:如何在60秒内完成7类电器特征采集

学习不是“按一次键录一个”,而是自适应时长+多周期融合:

  • 用户接入1号电器 → 装置检测到电流稳定>5mA持续3秒 → 自动启动学习;
  • 连续采集10个完整工频周期(200ms),每周期计算4维特征 → 得到10组向量;
  • 对每维特征,剔除最大/最小值后取均值,再计算标准差 → 存入g_learned[0];
  • 学习完成后LED慢闪3次,自动进入下一类等待。

为什么不用单周期?因为小电流下ADC量化噪声导致单周期H₃波动达±15%,10周期平均后波动<±2%。我们实测1号电器(RC+二极管)学习10次,相位角标准差从±3.2°降至±0.7°。

4.2 识别模式:2秒响应的实时判决逻辑

识别不是“每20ms算一次然后投票”,而是两级流水线判决:

  • 一级粗筛(200ms级):每10周期(200ms)计算一次特征,与7类模板的均值做曼哈顿距离:
    dist[i] = |θ-θ_i| + 2×|H₃-H₃_i| + |CF-CF_i|(H₃权重加大因区分度高)
    若min(dist[i]) < threshold,则暂定为i类;
  • 二级确认(2s级):连续10次粗筛结果中,同一类别出现≥7次,且该类别dist[i]始终为最小 → 确认接入;若某类连续5次消失 → 确认断开。

关键参数:threshold非固定值,而是动态计算:
threshold = 0.6 × θ_sigma[i] + 1.2 × h3_sigma[i] + 0.8 × cf_sigma[i]
这样小电流电器(σ大)阈值宽松,大电流电器(σ小)阈值严格,解决“大小电流共存时小电流漏判”问题。

4.3 自制1号电器的设计与验证:用RC+二极管复现相位滞后

基本要求强制自制1号电器,且与2号LED灯泡电流相同但相位不同、含谐波。我们方案:

  • 电路:220VAC→100kΩ电阻(限流)→1N4007二极管(半波整流)→100nF电容(滤波)→并联10kΩ负载电阻;
  • 效果:实测电流=42.3mA(与2号LED灯泡42.1mA差0.2mA),但相位角=78.5°(LED为32.1°),3次谐波含量H₃=1.82(LED为2.41);
  • 验证方法:用Fluke 435电能质量分析仪抓波形,确认其满足“电流差<1mA、相位差>45°、H₃差>0.5”三条件。

5. 避坑指南:那些让H题作品在测试现场突然“失明”的5个致命细节

5.1 现象:学习时一切正常,但测试时对LED灯泡识别率<30%

原因:未校准CT相位延迟。HLK-2005在5mA时相位滞后达6.2°,而LED灯泡相位角本就小(30°~35°),6°误差直接导致θ计算偏差20%,超出模板σ范围。
解决:在学习前,先用已知相位负载(如纯电阻)测出CT固有相位偏移δ,后续所有θ计算均减去δ。我们实测δ=5.8°,校准后LED识别率升至98%。

5.2 现象:多个电器同时接入时,小电流电器(如路由器)总是被判定为“未接入”

原因:特征计算未做电流归一化。当电磁炉(9A)和路由器(35mA)共存,CT输出叠加波形中路由器成分被淹没,H₃和CF计算失真。
解决:在识别模式下,先用Irms粗估总负载等级,再动态切换特征权重:

  • 总Irms<100mA → 启用高灵敏度模式:H₃权重×3,CF权重×2;
  • 总Irms>5A → 启用抗干扰模式:θ权重×2,H₃权重×0.5。
    此逻辑使路由器在电磁炉旁识别率从12%升至89%。

5.3 现象:装置在分析识别模式下工作电流实测18.2mA,超限

原因:数码管驱动芯片TM1650默认亮度为8级(电流≈3mA/位),3位共阴实际耗电≈9mA,加上MCU和运放,超限。
解决:初始化时写寄存器0x81(亮度=1级),电流降至1.2mA/位;同时关闭TM1650内部振荡器,改用MCU的CLKOUT引脚供时钟,再省0.5mA。

5.4 现象:USB充电器接入后,装置频繁在“4号”和“5号(机顶盒)”间跳变

原因:两者H₃接近(充电器H₃=2.35,机顶盒H₃=2.28),但启停瞬态差异大——充电器插拔有明显浪涌,机顶盒软启无浪涌。原算法未用Eₜᵣₐₙₛ特征。
解决:在粗筛阶段增加瞬态判据:若Eₜᵣₐₙₛ > 0.15且dist[4] < dist[5] + 0.3,则强制判4号;否则判5号。加入后跳变更少于1次/小时。

5.5 现象:学习模式下,自制1号电器学习失败,提示“电流不稳定”

原因:RC+二极管电路在220VAC下存在工频周期性熄灭(电容放电后电压低于二极管导通阈值),导致每周期电流波形不重复,10周期特征离散度超标。
解决:修改学习逻辑——不强制10周期连续,改为检测“连续5个周期内,θ波动<±2°且H₃波动<±0.1”即视为稳定,开始采集。实测稳定采集时间从失败→平均4.2秒完成。


6. 实战技巧:用手机无线显示替代数码管,不改硬件只加30行代码

发挥部分允许“选用无线传输到手机上显示”,但很多队伍卡在蓝牙模块调试、APP开发上。其实,用ESP-01S(ESP8266)AT指令透传,5分钟搞定,且不增加主控负担:

6.1 硬件连接与供电

  • ESP-01S的TX/RX接STM32的USART2(PA2/PA3),不共地!用HCPL-2630光耦隔离RX,避免WiFi发射干扰ADC;
  • ESP-01S供电:单独用AMS1117-3.3供3.3V,绝不接STM32的3.3V电源(WiFi突发电流>200mA,会拉垮MCU电源);
  • 启动时序:MCU先上电稳定,延时500ms后再给ESP-01S供电,避免AT指令丢失。

6.2 STM32端精简代码(仅32行)

// usart2_init()中设置:115200bps, 无校验, 1停止位 void send_to_esp(const char* str) { HAL_UART_Transmit(&huart2, (uint8_t*)str, strlen(str), 100); HAL_UART_Transmit(&huart2, (uint8_t*)"\r\n", 2, 100); } // 在识别结果更新时调用 void update_phone_display(uint8_t dev_id, uint8_t status) { static char buf[64]; // 格式:{"dev":4,"stat":1,"ts":123456789} sprintf(buf, "{\"dev\":%d,\"stat\":%d,\"ts\":%lu}", dev_id, status, HAL_GetTick()); send_to_esp(buf); } // 主循环中定期发送心跳(防APP断连) if (HAL_GetTick() - last_heartbeat > 5000) { send_to_esp("{\"hb\":1}"); last_heartbeat = HAL_GetTick(); }

6.3 手机端零代码方案:用“串口调试助手”APP直连

  • ESP-01S配置为AP模式(AT+CWMODE=2),SSID="H_DEVICE",密码="12345678";
  • 手机连此WiFi,打开任意支持WebSocket的串口APP(如“TCP/UDP调试工具”),IP填192.168.4.1,端口80;
  • STM32发JSON,APP自动解析并刷新UI(需APP支持JSON渲染,实测“Serial Bluetooth Terminal”支持)。

为什么不用BLE?因为ESP-01S成本¥3.2,库存充足;BLE模块(如HM-10)需配AT指令+UUID绑定,调试耗时>2小时。而上述方案,从焊接ESP-01S到手机看到JSON,实测最短记录是6分17秒。

从那以后我每次做电赛项目,只要涉及无线显示,都强制走一遍“ESP-01S AT透传”流程——它不炫技,但像螺丝刀一样可靠:拧得紧、不打滑、不崩牙。真正的工程价值,往往藏在省下的那2小时调试时间里,和测试现场多出的3次稳定演示中。希望帮到你。

本文还有配套的精品资源,点击获取