今日分享瑞薩RA MCU創意氛圍賽的作品——高壓電網電流監測。本項目基于啟明6M5開發板用于監測高壓三相電流數據,并對故障進行判斷的設備,使用了串口、硬件I2C、ADC、OLED等硬件外設,使用瑞薩的FSP3.5版本。
啟明6M5開發板
開發板硬件資源如圖所示:

項目實現
三路ADC獲取三相瞬時正弦波電流信息
正弦波轉化為三相電流有效值
判斷三相電是否發生故障
本地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(Aphase100||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;
}
GROUND_ERROR = 0,//接地錯誤 WATER_IN_BOX = 1,//接地箱進水 OUTER_SHEATH_DAMAGE = 2,//護套破損
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文章
866瀏覽量
33862 -
I2C接口
+關注
關注
1文章
175瀏覽量
26660 -
電網電流
+關注
關注
0文章
3瀏覽量
6284 -
ADC采樣
+關注
關注
0文章
134瀏覽量
13584 -
OLED顯示
+關注
關注
1文章
57瀏覽量
17460
發布評論請先 登錄
瑞薩RA MCU創意氛圍賽——作品制作記錄
高壓電的原理和用途 圍墻高壓電網原理
什么叫特高壓電網
直播預告 | 6月8日 RA6T2電機板新品發布會&RA MCU創意氛圍賽說明
分享瑞薩RA MCU創意氛圍賽的作品—高壓電網電流監測
評論