今日分享瑞薩RA MCU創(chuàng)意氛圍賽的作品——高壓電網(wǎng)電流監(jiān)測。本項目基于啟明6M5開發(fā)板用于監(jiān)測高壓三相電流數(shù)據(jù),并對故障進(jìn)行判斷的設(shè)備,使用了串口、硬件I2C、ADC、OLED等硬件外設(shè),使用瑞薩的FSP3.5版本。
啟明6M5開發(fā)板
開發(fā)板硬件資源如圖所示:
項目實現(xiàn)
正弦波轉(zhuǎn)化為三相電流有效值
判斷三相電是否發(fā)生故障
本地OLED顯示,并上傳云平臺
軟件設(shè)計
本人使用J-Link的SWD接口用于RA MCU的調(diào)試和程序下載,使用keil較為方便使用,需要如下配置:
P300/TCK/SWCLK可通過跳線帽可接到P201/MD引腳。用于控制MD引腳電平,使MCU上電時進(jìn)入不同的啟動模式
P112/UART2_TXD和P113/UART2_RXD兩個引腳可配置為串口功能
/* TODO: add your own code here */ Debug_UART2_Init(); // SCI4 UART 調(diào)試串口初始化 ESP8266_UART9_Init(); // ESP8266 (SCI9 UART) 串口初始化 printf("歡迎使用野火啟明6M5開發(fā)板 ");
硬件I2C的OLED
使用EBF Module 接口的P505,P506配置硬件I2C,驅(qū)動OLED屏幕
使用相關(guān)驅(qū)動初始化后,OLED打印信息。
OLED_ShowString(0, 16, (const uint8_t*)"AIrms", 16, 1); OLED_ShowString(43, 16,(const uint8_t*)"BIrms", 16, 1); OLED_ShowString(87, 16,(const uint8_t*)"CIrms", 16, 1); OLED_ShowString(0, 32, AIrms_str, 16,1); OLED_ShowString(43, 32, BIrms_str, 16,1); OLED_ShowString(87, 32, CIrms_str, 16,1); OLED_ShowString(0, 0, (const uint8_t*)"state:", 16, 1); OLED_ShowNum(87, 0, state,1,16, 1); OLED_Refresh_Gram();
數(shù)據(jù)采集
使用開口式電流互感器,可選一次側(cè)與二次側(cè)的變比100:1,200:1,500:1,將開口式電流互感器二次側(cè)接入采樣電阻,可轉(zhuǎn)化為電壓值進(jìn)行ADC采樣。
ADC配置
配置ADC掃描參數(shù),賦能ADC通道。在此函數(shù)中設(shè)置通道特定設(shè)置。
/* Enable scan triggering from ELC events. */ (void) R_ADC_ScanStart(&g_adc0_ctrl);
回調(diào)函數(shù)adc_callback ()
void adc_callback(adc_callback_args_t * p_args) { FSP_PARAMETER_NOT_USED(p_args); scan_complete_flag = true; }
讀取ADC值
err =R_ADC_Read(&g_adc0_ctrl, ADC_CHANNEL_0, &adc_data1); assert(FSP_SUCCESS == err); a1=(double)(adc_data1/4095.0)*3.3;
讀取三通道ADC值
//ADC轉(zhuǎn)換完成標(biāo)志位 volatile bool scan_complete_flag = false; void adc_callback(adc_callback_args_t * p_args) { FSP_PARAMETER_NOT_USED(p_args); scan_complete_flag = true; } void ADC_Init(void) { fsp_err_t err; err = R_ADC_Open(&g_adc0_ctrl, &g_adc0_cfg); err = R_ADC_ScanCfg(&g_adc0_ctrl, &g_adc0_channel_cfg); assert(FSP_SUCCESS == err); } /* 進(jìn)行ADC采集,讀取ADC數(shù)據(jù)并轉(zhuǎn)換結(jié)果 */ void Read_ADC_Voltage_Value(double *adcdata) { uint16_t adc[3]; (void) R_ADC_ScanStart(&g_adc0_ctrl); while (!scan_complete_flag) //等待轉(zhuǎn)換完成標(biāo)志 { ; } scan_complete_flag = false; //重新清除標(biāo)志位 /* 讀取通道0數(shù)據(jù) */ R_ADC_Read(&g_adc0_ctrl, ADC_CHANNEL_1, &adc[0]); /* ADC原始數(shù)據(jù)轉(zhuǎn)換為電壓值(ADC參考電壓為3.3V) */ adcdata[0] = (double)(adc[0]*3.3/4095); /* 讀取通道0數(shù)據(jù) */ R_ADC_Read(&g_adc0_ctrl, ADC_CHANNEL_2, &adc[1]); /* ADC原始數(shù)據(jù)轉(zhuǎn)換為電壓值(ADC參考電壓為3.3V) */ adcdata[1] = (double)(adc[1]*3.3/4095); /* 讀取通道0數(shù)據(jù) */ R_ADC_Read(&g_adc0_ctrl, ADC_CHANNEL_3, &adc[2]); /* ADC原始數(shù)據(jù)轉(zhuǎn)換為電壓值(ADC參考電壓為3.3V) */ adcdata[2] = (double)(adc[2]*3.3/4095); }
計算出電流有效值
/****************************************************** 函數(shù)名稱: getrms 描述: 遍歷查找電流樣本點,得到極致點序列,計算出電流有效值 輸入: iphase:電流樣本數(shù)組 SAMPLE_N:電流樣本數(shù)據(jù)點數(shù) 輸出: 返回: 電流有效值 ******************************************************/ float getrms(float *phase,int SAMPLE_N) { int changeSignCount=0; int changeSignIndex[changeSignCount]; // 遍歷查找電流樣本點 for (int i = 1; i < SAMPLE_N; i++) { ? ? ? ? ? ? ?//極大值, if((phase[i-1] <= phase[i] && phase[i] >=phase[i+1]) ) { changeSignIndex[changeSignCount] = i; changeSignCount++; } } // 創(chuàng)建新數(shù)組,放置查找結(jié)果 float changeSignSeq[changeSignCount]; float max = 0; float min = 0; for(int i = 0; i < changeSignCount; i++) ? ? ? ? ? ? ? ?{ ? ? ? ?changeSignSeq[i] = phase[changeSignIndex[i]]; ? ? ? ? ? ? ? ? ? ? ? ?if (maxchangeSignSeq[i]) { min=changeSignSeq[i]; } } //得出電流有效值 if(fabs(max)>fabs(min)) { return (float)(fabs(max) * 0.707); } else { return (float)(fabs(min) * 0.707); } }
電流故障類型判斷
/****************************************************** 函數(shù)名稱: changesign 描述: 電流故障類型判斷 輸入: Aphase,Bphase,Cphase三相電有效值 maxphase理論最大電流 輸出: 返回: 錯誤類型 ******************************************************/ int GetCableFaulttype(float Aphase,float Bphase,float Cphase,float maxphase) { int Fault; if(AphaseGROUND_ERROR = 0,//接地錯誤 WATER_IN_BOX = 1,//接地箱進(jìn)水 OUTER_SHEATH_DAMAGE = 2,//護(hù)套破損100||Bphase>100||Cphase>100) { Fault = 3;//隔板擊穿 } //排序得到最大最小值 float max=Aphase; float min=Bphase; if(max<=Bphase) ? ? ? ? ? ? ? ?{ ? ? ? ? ? ? ? ? ? ? ? ?max=Bphase; ? ? ? ? ? ? ? ? ? ? ? ?min=Aphase; ? ? ? ? ? ? ? ?} ? ? ? ?if(max<=Cphase) ? ? ? ? ? ? ? ?{ ? ? ? ? ? ? ? ? ? ? ? ?max=Cphase; ? ? ? ? ? ? ? ?} ? ? ? ? ? ? ? ? ? ? ? ?if(min>=Cphase) { min=Cphase; } if(max>6*min) { Fault = 0;////接地錯誤 } if(max>6+min) { Fault = 2;//外護(hù)套破損 } } return Fault; }
PARTITION_BREAKDOWN = 3,//隔板擊穿
PROTECTOR_BREAKDOWN = 4,//保護(hù)器擊穿 GROUND_GRID_LOOSE = 5,//接地網(wǎng)脫落 GROUND_OK = 6//正常
一般使用4G模塊,也可使用本開發(fā)板上板載的ESP8266
實現(xiàn)效果
沒有實際接入高壓電,ADC通道1,直接接入函數(shù)發(fā)生器生成的50HZ正弦波3.3V波峰,有效值為3.3*0.7.7=2.3331V,故障狀態(tài)6表示正常。
審核編輯:劉清
-
電流互感器
+關(guān)注
關(guān)注
23文章
757瀏覽量
31286 -
I2C接口
+關(guān)注
關(guān)注
1文章
125瀏覽量
25190 -
電網(wǎng)電流
+關(guān)注
關(guān)注
0文章
3瀏覽量
6194 -
ADC采樣
+關(guān)注
關(guān)注
0文章
134瀏覽量
12840 -
OLED顯示
+關(guān)注
關(guān)注
1文章
55瀏覽量
17001
原文標(biāo)題:【瑞薩RA MCU創(chuàng)意氛圍賽】項目34——高壓電網(wǎng)電流監(jiān)測
文章出處:【微信號:瑞薩MCU小百科,微信公眾號:瑞薩MCU小百科】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論