今日分享瑞薩RA MCU創意氛圍賽的作品——高壓電網電流監測。本項目基于啟明6M5開發板用于監測高壓三相電流數據,并對故障進行判斷的設備,使用了串口、硬件I2C、ADC、OLED等硬件外設,使用瑞薩的FSP3.5版本。
啟明6M5開發板
開發板硬件資源如圖所示:
項目實現
正弦波轉化為三相電流有效值
判斷三相電是否發生故障
本地OLED顯示,并上傳云平臺
軟件設計
本人使用J-Link的SWD接口用于RA MCU的調試和程序下載,使用keil較為方便使用,需要如下配置:
P300/TCK/SWCLK可通過跳線帽可接到P201/MD引腳。用于控制MD引腳電平,使MCU上電時進入不同的啟動模式
P112/UART2_TXD和P113/UART2_RXD兩個引腳可配置為串口功能
/* TODO: add your own code here */ Debug_UART2_Init(); // SCI4 UART 調試串口初始化 ESP8266_UART9_Init(); // ESP8266 (SCI9 UART) 串口初始化 printf("歡迎使用野火啟明6M5開發板 ");
硬件I2C的OLED
使用EBF Module 接口的P505,P506配置硬件I2C,驅動OLED屏幕
使用相關驅動初始化后,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();
數據采集
使用開口式電流互感器,可選一次側與二次側的變比100:1,200:1,500:1,將開口式電流互感器二次側接入采樣電阻,可轉化為電壓值進行ADC采樣。
ADC配置
配置ADC掃描參數,賦能ADC通道。在此函數中設置通道特定設置。
/* Enable scan triggering from ELC events. */ (void) R_ADC_ScanStart(&g_adc0_ctrl);
回調函數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轉換完成標志位 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); } /* 進行ADC采集,讀取ADC數據并轉換結果 */ void Read_ADC_Voltage_Value(double *adcdata) { uint16_t adc[3]; (void) R_ADC_ScanStart(&g_adc0_ctrl); while (!scan_complete_flag) //等待轉換完成標志 { ; } scan_complete_flag = false; //重新清除標志位 /* 讀取通道0數據 */ R_ADC_Read(&g_adc0_ctrl, ADC_CHANNEL_1, &adc[0]); /* ADC原始數據轉換為電壓值(ADC參考電壓為3.3V) */ adcdata[0] = (double)(adc[0]*3.3/4095); /* 讀取通道0數據 */ R_ADC_Read(&g_adc0_ctrl, ADC_CHANNEL_2, &adc[1]); /* ADC原始數據轉換為電壓值(ADC參考電壓為3.3V) */ adcdata[1] = (double)(adc[1]*3.3/4095); /* 讀取通道0數據 */ R_ADC_Read(&g_adc0_ctrl, ADC_CHANNEL_3, &adc[2]); /* ADC原始數據轉換為電壓值(ADC參考電壓為3.3V) */ adcdata[2] = (double)(adc[2]*3.3/4095); }
計算出電流有效值
/****************************************************** 函數名稱: getrms 描述: 遍歷查找電流樣本點,得到極致點序列,計算出電流有效值 輸入: iphase:電流樣本數組 SAMPLE_N:電流樣本數據點數 輸出: 返回: 電流有效值 ******************************************************/ 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++; } } // 創建新數組,放置查找結果 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); } }
電流故障類型判斷
/****************************************************** 函數名稱: 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,//接地箱進水 OUTER_SHEATH_DAMAGE = 2,//護套破損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;//外護套破損 } } return Fault; }
PARTITION_BREAKDOWN = 3,//隔板擊穿
PROTECTOR_BREAKDOWN = 4,//保護器擊穿 GROUND_GRID_LOOSE = 5,//接地網脫落 GROUND_OK = 6//正常
一般使用4G模塊,也可使用本開發板上板載的ESP8266
實現效果
沒有實際接入高壓電,ADC通道1,直接接入函數發生器生成的50HZ正弦波3.3V波峰,有效值為3.3*0.7.7=2.3331V,故障狀態6表示正常。
審核編輯:劉清
-
電流互感器
+關注
關注
23文章
777瀏覽量
31551 -
I2C接口
+關注
關注
1文章
125瀏覽量
25389 -
電網電流
+關注
關注
0文章
3瀏覽量
6209 -
ADC采樣
+關注
關注
0文章
134瀏覽量
12911 -
OLED顯示
+關注
關注
1文章
56瀏覽量
17064
原文標題:【瑞薩RA MCU創意氛圍賽】項目34——高壓電網電流監測
文章出處:【微信號:瑞薩MCU小百科,微信公眾號:瑞薩MCU小百科】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
【名單公布】瑞薩RA4M2(Cortex-M33內核MCU)物聯網網關設計挑戰賽初審通過名單
瑞薩RA MCU創意氛圍賽——作品制作記錄
高壓電的原理和用途 圍墻高壓電網原理
什么叫特高壓電網
直播預告 | 6月8日 RA6T2電機板新品發布會&RA MCU創意氛圍賽說明
![直播預告 | 6月8日 <b class='flag-5'>RA</b>6T2電機板新品發布會&<b class='flag-5'>RA</b> <b class='flag-5'>MCU</b><b class='flag-5'>創意</b><b class='flag-5'>氛圍</b><b class='flag-5'>賽</b>說明](https://file1.elecfans.com/web2/M00/89/73/wKgZomSD8QGAYcrdAAANSb1-60U687.jpg)
評論