# 目錄
* 1.前言
* 2.團隊介紹
* 3.題目要求
* 4.方案介紹
* 5.具體設(shè)計
* 6.測試結(jié)果
* 7.總結(jié)
# 1.前言
最近電賽國獎的總名單總算是下來了,本來進復(fù)測只求保底國二的我們在查詢獲獎名單時竟然發(fā)現(xiàn)我們隊伍后面跟著一個醒目的紅色*國一*的時候全組沸騰了,~~我當晚就狠狠造了一頓肉蛋奶(bushi)。~~剛好立創(chuàng)又發(fā)起了這次開源活動,受立創(chuàng)邀請,我們將開源這個項目。
# 2.團隊介紹
我們團隊來自武漢某民族大學的自動化專業(yè),團隊配置為兩個硬件設(shè)計與一個軟件設(shè)計。
# 3.題目要求
![題目要求.png]

![題目要求2.png]

本題要求設(shè)計并制作一個根據(jù)電源線電流的電參量信息分析在用電器類別的裝置。該裝置具有學習和分析識別兩種工作模式。在學習模式下,測試并存儲用于識別各單件電器的特征參量;在分析識別模式下,實時指示在用電器的類別。
其中重點與難點為:
1. 電網(wǎng)在不同時間與不同地點波動范圍較大,會對大功率用電器測量造成影響,以至于其功率波動可達 ±50W之高,給用電器的準確識別帶來極大困難。
2. 在測量大功率電器與小功率電器組合時,大功率用電器的頻譜特性將會掩蓋小功率頻譜特性,給識別工作帶來極大困難。
3. 如何對電流大小相同而阻抗特性不同的用電器進行鑒別。
4. 用電器的選擇需要再三斟酌,好的用電器組合搭配會讓你的初測效果好很多。
# 4.方案介紹
## 系統(tǒng)組成
本系統(tǒng)方案主要采用STM32 F407
單片機作為系統(tǒng)主控,通過串口同SUI-101A電能計量模塊進行通訊,獲取
有功功率、電壓、電流等電參數(shù),并通過這些參數(shù)進行用電器識別功能。其中SUI-101A模塊通過
電流互感器接入插座,監(jiān)測用電器參數(shù)。
![系統(tǒng)框圖.png]

![系統(tǒng)實物圖.jpg]

## 硬件電路
在暑假時,我們就已經(jīng)采用了使用電流互感器互感和使用CS5463模塊兩種方法。電流互感方案多種用電器或者大電流時當時fft沒找出差異,說實話CS5463比自己用電流互感器差分放大要穩(wěn)定很多,但在多種用電器一起識別時也是一般爛,尤其是相同電流與大電流時。在比賽時,聽說了SUI-101A,正好CS5463那個缺德商家不發(fā)貨,于是趕緊買了倆,結(jié)果發(fā)現(xiàn)比CS好用(速度更快,屬實因禍得福了)。
故本系統(tǒng)主要采用了SUI-101A模塊獲取電能參數(shù)。
模塊總體布局如下圖,
![QQ圖片20211214155323.jpg]

模塊通過電流與
電壓互感器分別從負載線路上獲取電流與電壓信號,并送入24位高精度ADC中進行處理,再將波形數(shù)據(jù)送入STM8單片機中計算出電流、電壓等參數(shù)值,最后通過串口傳輸至STM32 F407中進行數(shù)據(jù)的分析與用電器的識別。
除此之外,做電路的地方就只做了自制用電器了(在工程里面),沒啥好說的,不過時間緊,直接用洞洞板做的。(所以嚴格上來說比賽并沒有使用立創(chuàng),orz!(不過平時一直在使用)多謝老板的獎金,嘿嘿嘿~
暑假做的FFT方案的原理圖也一并放工程里了,但pcb在比賽時改了很多,基本刪沒了就不放了。不過需要注意的是,此方案會使220V高壓直接裸露在外,當時暑假我們做了雙層結(jié)構(gòu)、熱溶膠防止觸電等方法。
如果大家想復(fù)刻此題,還是推薦fft方案,能使自己的能力得到鍛煉,可以參考另一個開源工程(熬夜禿頭寫的,真大佬,瑞斯拜)
# 5.具體設(shè)計
## 程序設(shè)計
程序設(shè)計的比較簡單,具體流程如下:
![H題程序流程圖.png]

* 識別部分:由于在測量取得的參數(shù)中僅有有功功率可滿足線性疊加,故我只使用了有功功率作為識別判據(jù)。首先將用電器的參數(shù)存進相應(yīng)用電器的結(jié)構(gòu)體中,并且通過循環(huán)取余窮舉七位二進制編碼生成不同用電器組合,隨后將當前負載電路上的有功功率與生成的128種用電器組合功率進行比較,倘若有某組合的誤差小于閾值,則斷定該組合為當前負載電路上的用電器組合,然后對該組合的二進制編碼進行解碼得到用電器組合。
* 學習部分:首先將所有用電器結(jié)構(gòu)體中的參數(shù)進行清零,隨后在紅外遙控器上下按下要學習的用電器編號,即可將用電器參數(shù)記錄到對應(yīng)用電器編號的結(jié)構(gòu)體中,至此完成學習。
其中核心代碼如下:
``` C
//學習模式
void learn_mode(void)
{
char tbuf[32];
float voltage; //測量電壓
float Current; //測量電流
float Pow_fac; //
功率因數(shù)
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]; //用電器工作狀態(tài)
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 ++)//遍歷數(shù)組。
{
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) //進行匹配 假設(shè)匹配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) //進行匹配 假設(shè)匹配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];//??D?????D£?éoí
USART_SendBuf(USART2,CmdTxBuf,7);
delay_ms(10); //μè′y10ms,μè′yêy?Y·μ??
while(t){
t--;
rxlen=Uart2_RxCnt;
delay_ms(30); //μè′y5ms,á?D?3?1y5ms??óD?óê?μ?ò???êy?Y,?òè??a?óê??áê?
if((rxlen==Uart2_RxCnt)&&(rxlen!=0)){//?óê?μ?á?êy?Y,?ò?óê?íê3éá?
if(rxlen==(Uart2_RxBuf[5]+7)){
//êy?Y3¤?è?yè·
}
else{
return 3;//òì3£,êy?Y3¤?è′í?ó
}
sum=0;
rxlen-=1;//3yè¥D£?é??μ?3¤?è
for(i=0;i
```
**6.測試結(jié)果**
[具體測試結(jié)果](https://www.bilibili.com/video/BV15r4y1D7wN?from=search&seid=15783606942855832458&spm_id_from=333.337.0.0)放在了視頻里,感興趣的話可以看看
**7.總結(jié)**
這題說來運氣成分也大,因為暑假訓練時就已經(jīng)做過2017年的K題了,當時也是第一次接觸220V的電壓,出了幾次事故,并且采用FFT方案的成品實際效果實在一般,基波幅度不穩(wěn)定,甚至會有高達±10%的抖動,而且除了基波之外其余諧波的分析價值實在不大,想了半天也沒想到該怎么處理,最后換了電能計量模塊并使用單參數(shù)判據(jù),最后發(fā)現(xiàn)效果不錯。只能說,大道至簡,能完成任務(wù)的方案就是好方案! 嘖,回想了一下今年比賽延期時的狀況,疫情卷土重來,搞得整個實驗室人心惶惶,當時一心只想著跑路,沒想到現(xiàn)在已經(jīng)國一了...另外,賽后復(fù)盤發(fā)現(xiàn),這次國一實在是運氣爆表,大多數(shù)使用FFT方案分析電器諧波的隊伍在測試時都有著不同的問題,把我們這種用現(xiàn)成模塊而且只使用了單個參數(shù)作為判據(jù)的隊伍抬上了國一,而且就連最關(guān)鍵的生成二進制編碼組合的代碼也是從CSDN上找到的,因此這個國一實在是受之有愧。但是不得不說,作為一個從小到大得到的唯一一個獎項,實在是秦始皇摸電線-贏麻了!