分享瑞萨RA MCU创意氛围赛的作品—高压电网电流监测

描述

 

今日分享瑞萨RA MCU创意氛围赛的作品——高压电网电流监测。本项目基于启明6M5开发板用于监测高压三相电流数据,并对故障进行判断的设备,使用了串口、硬件I2C、ADC、OLED等硬件外设,使用瑞萨的FSP3.5版本。

启明6M5开发板

开发板硬件资源如图所示:

I2C接口I2C接口

项目实现

三路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屏幕

I2C接口I2C接口

使用相关驱动初始化后,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配置

I2C接口I2C接口

配置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表示正常。

I2C接口

I2C接口



审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分