今日分享瑞萨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文章
757浏览量
31292 -
I2C接口
+关注
关注
1文章
125浏览量
25190 -
电网电流
+关注
关注
0文章
3浏览量
6194 -
ADC采样
+关注
关注
0文章
134浏览量
12840 -
OLED显示
+关注
关注
1文章
55浏览量
17001
原文标题:【瑞萨RA MCU创意氛围赛】项目34——高压电网电流监测
文章出处:【微信号:瑞萨MCU小百科,微信公众号:瑞萨MCU小百科】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论