2021电赛H-用电器识别分析装置 - 嘉立创EDA开源硬件平台

编辑器版本 ×
标准版 Standard

1、简单易用,可快速上手

2、流畅支持300个器件或1000个焊盘以下的设计规模

3、支持简单的电路仿真

4、面向学生、老师、创客

专业版 professional

1、全新的交互和界面

2、流畅支持超过3w器件或10w焊盘的设计规模,支持面板和外壳设计

3、更严谨的设计约束,更规范的流程

4、面向企业、更专业的用户

标准版 2021电赛H-用电器识别分析装置

简介:本系统以STM32F407为控制核心,通过电流互感器采集电流信号,并利用SUI-101A电能采集处理模块将采集后的信号送入STM32F030转换,最后将信号以串口形式发送至主控制器进行识别与学习。

开源协议: GPL 3.0

(未经作者授权,禁止转载)

创建时间: 2021-12-14 12:22:39
更新时间: 2023-04-03 00:00:07
描述
# 目录 * 1.前言 * 2.团队介绍 * 3.题目要求 * 4.方案介绍 * 5.具体设计 * 6.测试结果 * 7.总结 # 1.前言 最近电赛国奖的总名单总算是下来了,本来进复测只求保底国二的我们在查询获奖名单时竟然发现我们队伍后面跟着一个醒目的红色*国一*的时候全组沸腾了,~~我当晚就狠狠造了一顿肉蛋奶(bushi)。~~刚好立创又发起了这次开源活动,受立创邀请,我们将开源这个项目。 # 2.团队介绍 我们团队来自武汉某民族大学的自动化专业,团队配置为两个硬件设计与一个软件设计。 # 3.题目要求 ![题目要求.png](//image.lceda.cn/pullimage/qcbYiJGoll7Nb0TExFC0oGV1KnNjsnRlxfCQxbX2.png) ![题目要求2.png](//image.lceda.cn/pullimage/khdAuoKhYPdEY8ijz2MjUHcWBDhXNrMsLhV7DOBY.png) 本题要求设计并制作一个根据电源线电流的电参量信息分析在用电器类别的装置。该装置具有学习和分析识别两种工作模式。在学习模式下,测试并存储用于识别各单件电器的特征参量;在分析识别模式下,实时指示在用电器的类别。 其中重点与难点为: 1. 电网在不同时间与不同地点波动范围较大,会对大功率用电器测量造成影响,以至于其功率波动可达 ±50W之高,给用电器的准确识别带来极大困难。 2. 在测量大功率电器与小功率电器组合时,大功率用电器的频谱特性将会掩盖小功率频谱特性,给识别工作带来极大困难。 3. 如何对电流大小相同而阻抗特性不同的用电器进行鉴别。 4. 用电器的选择需要再三斟酌,好的用电器组合搭配会让你的初测效果好很多。 # 4.方案介绍 ## 系统组成 本系统方案主要采用STM32 F407单片机作为系统主控,通过串口同SUI-101A电能计量模块进行通讯,获取有功功率、电压、电流等电参数,并通过这些参数进行用电器识别功能。其中SUI-101A模块通过电流互感器接入插座,监测用电器参数。 ![系统框图.png](//image.lceda.cn/pullimage/pQXDvrrE0Jy4PhJ8V8lLBsI4pLJIFyFHtK9GnNaa.png) ![系统实物图.jpg](//image.lceda.cn/pullimage/mTxVj1VbpcUcR1HU0YVXnoIvVIPeTxaeWFaWgqlf.jpeg) ## 硬件电路 在暑假时,我们就已经采用了使用电流互感器互感和使用CS5463模块两种方法。电流互感方案多种用电器或者大电流时当时fft没找出差异,说实话CS5463比自己用电流互感器差分放大要稳定很多,但在多种用电器一起识别时也是一般烂,尤其是相同电流与大电流时。在比赛时,听说了SUI-101A,正好CS5463那个缺德商家不发货,于是赶紧买了俩,结果发现比CS好用(速度更快,属实因祸得福了)。 故本系统主要采用了SUI-101A模块获取电能参数。 模块总体布局如下图, ![QQ图片20211214155323.jpg](//image.lceda.cn/pullimage/NSoQbopqBokhETjT82PWIC0uOi26jk58HegdB3E6.jpeg) 模块通过电流与电压互感器分别从负载线路上获取电流与电压信号,并送入24位高精度ADC中进行处理,再将波形数据送入STM8单片机中计算出电流、电压等参数值,最后通过串口传输至STM32 F407中进行数据的分析与用电器的识别。 除此之外,做电路的地方就只做了自制用电器了(在工程里面),没啥好说的,不过时间紧,直接用洞洞板做的。(所以严格上来说比赛并没有使用立创,orz!(不过平时一直在使用)多谢老板的奖金,嘿嘿嘿~ 暑假做的FFT方案的原理图也一并放工程里了,但pcb在比赛时改了很多,基本删没了就不放了。不过需要注意的是,此方案会使220V高压直接裸露在外,当时暑假我们做了双层结构、热溶胶防止触电等方法。 如果大家想复刻此题,还是推荐fft方案,能使自己的能力得到锻炼,可以参考另一个开源工程(熬夜秃头写的,真大佬,瑞斯拜) # 5.具体设计 ## 程序设计 程序设计的比较简单,具体流程如下: ![H题程序流程图.png](//image.lceda.cn/pullimage/KRD5McT7qwnlQphOuRCItNTs7W7qVD15hlP66o4j.png) * 识别部分:由于在测量取得的参数中仅有有功功率可满足线性叠加,故我只使用了有功功率作为识别判据。首先将用电器的参数存进相应用电器的结构体中,并且通过循环取余穷举七位二进制编码生成不同用电器组合,随后将当前负载电路上的有功功率与生成的128种用电器组合功率进行比较,倘若有某组合的误差小于阈值,则断定该组合为当前负载电路上的用电器组合,然后对该组合的二进制编码进行解码得到用电器组合。 * 学习部分:首先将所有用电器结构体中的参数进行清零,随后在红外遥控器上下按下要学习的用电器编号,即可将用电器参数记录到对应用电器编号的结构体中,至此完成学习。 其中核心代码如下: ``` C //学习模式 void learn_mode(void) { char tbuf[32]; float voltage; //测量电压 float Current; //测量电流 float Pow_fac; //功率因数 float Pactive_pow; //有功功率 float frequency; if(learn_flag_0==1){ learn_flag_0=0; app1.Pactive_pow=0; app2.Pactive_pow=0; app3.Pactive_pow=0; app4.Pactive_pow=0; app5.Pactive_pow=0; app6.Pactive_pow=0; app7.Pactive_pow=0; if(SUI_101A_Get(1,&Current_proper.voltage,&Current_proper.Current,&Current_proper.Pactive_pow,&Current_proper.Pow_fac,&Current_proper.frequency)==0){ //LCD_ShowString(20,60,200,16,16,"Learning...Please wait."); if(app_num==1) { app1.Current =Current_proper.Current; app1.voltage =Current_proper.voltage; app1.Pactive_pow =Current_proper.Pactive_pow; app1.Pow_fac =Current_proper.Pow_fac; } if(app_num==2) { app2.Current =Current_proper.Current; app2.voltage =Current_proper.voltage; app2.Pactive_pow =Current_proper.Pactive_pow; app2.Pow_fac =Current_proper.Pow_fac; } if(app_num==3) { app3.Current =Current_proper.Current; app3.voltage =Current_proper.voltage; app3.Pactive_pow =Current_proper.Pactive_pow; app3.Pow_fac =Current_proper.Pow_fac; } if(app_num==4) { app4.Current =Current_proper.Current; app4.voltage =Current_proper.voltage; app4.Pactive_pow =Current_proper.Pactive_pow; app4.Pow_fac =Current_proper.Pow_fac; } if(app_num==5) { app5.Current =Current_proper.Current; app5.voltage =Current_proper.voltage; app5.Pactive_pow =Current_proper.Pactive_pow; app5.Pow_fac =Current_proper.Pow_fac; } if(app_num==6) { app6.Current =Current_proper.Current; app6.voltage =Current_proper.voltage; app6.Pactive_pow =Current_proper.Pactive_pow; app6.Pow_fac =Current_proper.Pow_fac; } if(app_num==7) { app7.Current =Current_proper.Current; app7.voltage =Current_proper.voltage; app7.Pactive_pow =Current_proper.Pactive_pow; app7.Pow_fac =Current_proper.Pow_fac; } } } } void JudgeSta(void) { int ElectricalSta[7]={0}; int len=7; int i=0,j=0; float p_sta[7]; //用电器工作状态 float p_sum; //总功率 float current; float power[7]={app1.Pactive_pow,app2.Pactive_pow,app3.Pactive_pow,app4.Pactive_pow,app5.Pactive_pow,app6.Pactive_pow,app7.Pactive_pow}; int times=0,timestmp=0; for( i=0;i<7;i++) { switch(i) { case 0:app1.sta="off"; break; case 1:app2.sta="off"; break; case 2:app3.sta="off"; break; case 3:app4.sta="off"; break; case 4:app5.sta="off"; break; case 5:app6.sta="off"; break; case 6:app7.sta="off"; break; } } for(times=0;times<128;times++) { timestmp=times; for(i=0;i<7;i++) ElectricalSta[i]=0; i=0; while(timestmp) { ElectricalSta[i]=timestmp%2; timestmp=timestmp/2; i++; } for(i = 0; i < len; i ++)//遍历数组。 { p_sta[i] = ElectricalSta[i]*power[i]; } for(i=0;i<7;i++) { p_sum+=p_sta[i]; } if(p_sum<1000){ if(fabsf(p_sum-Current_proper.Pactive_pow)<0.2) //进行匹配 假设匹配PowerSum { for( i=0;i<7;i++) { if(ElectricalSta[i]==1) { switch(i) { case 0:app1.sta="on"; break; case 1:app2.sta="on"; break; case 2:app3.sta="on"; break; case 3:app4.sta="on"; break; case 4:app5.sta="on"; break; case 5:app6.sta="on"; break; case 6:app7.sta="on"; break; } } } p_sum=0; break; } p_sum=0; } else { if(fabsf(p_sum-Current_proper.Pactive_pow)<0.2) //进行匹配 假设匹配PowerSum { for( i=0;i<7;i++) { if(ElectricalSta[i]==1) { switch(i) { case 0:app1.sta="on"; break; case 1:app2.sta="on"; break; case 2:app3.sta="on"; break; case 3:app4.sta="on"; break; case 4:app5.sta="on"; break; case 5:app6.sta="on"; break; case 6:app7.sta="on"; break; } } } p_sum=0; break; } p_sum=0; } } } u8 SUI_101A_Get(u8 adder,float *vol,float *cur,float *pow,float *pf,float *fre){ u8 t=20; u8 rxlen=0; u8 i=0; u8 sum=0; u8 n=0; u8 CmdTxBuf[]={0x55,0x55,0x01,0x02,0x00,0x00,0xAD}; CmdTxBuf[2]=adder; Uart2_RxCnt=0; char buf[6]; CmdTxBuf[6]=CmdTxBuf[0]+CmdTxBuf[1]+CmdTxBuf[2]+CmdTxBuf[3]+CmdTxBuf[4]+CmdTxBuf[5];//ÖØмÆËãУÑéºÍ USART_SendBuf(USART2,CmdTxBuf,7); delay_ms(10); //µÈ´ý10ms,µÈ´ýÊý¾Ý·µ»Ø while(t){ t--; rxlen=Uart2_RxCnt; delay_ms(30); //µÈ´ý5ms,Á¬Ðø³¬¹ý5msûÓнÓÊÕµ½Ò»¸öÊý¾Ý,ÔòÈÏΪ½ÓÊÕ½áÊø if((rxlen==Uart2_RxCnt)&&(rxlen!=0)){//½ÓÊÕµ½ÁËÊý¾Ý,ÇÒ½ÓÊÕÍê³ÉÁË if(rxlen==(Uart2_RxBuf[5]+7)){ //Êý¾Ý³¤¶ÈÕýÈ· } else{ return 3;//Òì³£,Êý¾Ý³¤¶È´íÎó } sum=0; rxlen-=1;//³ýȥУÑéλµÄ³¤¶È for(i=0;i ``` **6.测试结果** [具体测试结果](https://www.bilibili.com/video/BV15r4y1D7wN?from=search&seid=15783606942855832458&spm_id_from=333.337.0.0)放在了视频里,感兴趣的话可以看看 **7.总结** 这题说来运气成分也大,因为暑假训练时就已经做过2017年的K题了,当时也是第一次接触220V的电压,出了几次事故,并且采用FFT方案的成品实际效果实在一般,基波幅度不稳定,甚至会有高达±10%的抖动,而且除了基波之外其余谐波的分析价值实在不大,想了半天也没想到该怎么处理,最后换了电能计量模块并使用单参数判据,最后发现效果不错。只能说,大道至简,能完成任务的方案就是好方案! 啧,回想了一下今年比赛延期时的状况,疫情卷土重来,搞得整个实验室人心惶惶,当时一心只想着跑路,没想到现在已经国一了...另外,赛后复盘发现,这次国一实在是运气爆表,大多数使用FFT方案分析电器谐波的队伍在测试时都有着不同的问题,把我们这种用现成模块而且只使用了单个参数作为判据的队伍抬上了国一,而且就连最关键的生成二进制编码组合的代码也是从CSDN上找到的,因此这个国一实在是受之有愧。但是不得不说,作为一个从小到大得到的唯一一个奖项,实在是秦始皇摸电线-赢麻了!
设计图
原理图
1 /
PCB
1 /
未生成预览图,请在编辑器重新保存一次
工程视频/附件
序号 文件名称 下载次数
1

F407电流检测.zip

2188
2

SUI-101A 资料包 V1.1.zip

2027
侵权投诉
相关工程
换一批
加载中...
添加到专辑 ×

加载中...

温馨提示 ×

是否需要添加此工程到专辑?

温馨提示
动态内容涉嫌违规
内容:
  • 153 6159 2675

服务时间

周一至周五 9:00~18:00
  • 技术支持

support
  • 开源平台公众号

MP