El_clan_zoncillo / Mbed 2 deprecated Proyecto_final

Dependencies:   mbed TextLCD

plantilla_copy.cpp

Committer:
freind00
Date:
2018-12-18
Revision:
4:c9f7e9a96324
Parent:
3:3620f948d5e0
Child:
5:c638ff4bd841

File content as of revision 4:c9f7e9a96324:

#include "mbed.h"
#include "math.h"
#define constanteTension 1.4709e-06
#define constanteIntensidad 1.423595702690060e-09
#define vectormuestras 100

Serial pc(USBTX, USBRX); // tx, rx

InterruptIn button(PC_13); 
AnalogIn (A0); 
AnalogIn (A1); 
AnalogIn (A5);

//datos para la simulación
uint16_t SimulaADCTension[vectormuestras]={60202,60330,58625,59923,58998,57466,57255,57119,57170,56327,53777,54359,53219,51091,50453,47815,46978,46509,44763,43549,41361,38513,38484,36990,34806,33279,31567,29193,28053,25447,24892,21968,20909,18951,17602,17651,16065,14052,14118,11186,10956, 9896, 9801, 9096, 7219, 7250, 6692, 6723, 6585, 6516, 5513, 6368, 6477, 5763, 6043, 7267, 8753, 8192, 9443, 9583,11577,11624,13236,14810,16455,17921,18496,19134,20656,22417,25159,25612,28368,28898,31937,32470,33848,35633,38022,39382,40758,43294,44352,45782,47961,48101,50367,51624,52074,53559,53615,54518,56322,57580,58557,57530,58872,59042,58397,59201};
uint16_t SimulaADCIntensidad[vectormuestras]={50233,51231,50075,49752,48077,47954,47431,47039,45074,43363,42265,42317,41528,40167,38300,38291,36222,35848,32856,31874,31756,30792,29301,27121,25643,25859,24596,22473,21324,20488,20525,19587,18219,17412,16095,16230,15805,14552,14084,13718,13018,13552,13830,13742,13402,12494,13483,12590,12865,13365,13717,15102,14670,16809,17329,18512,18492,19710,21125,21425,21959,24420,23675,25403,27867,27863,28974,29835,32658,32356,33992,36355,36794,38237,39365,40761,40570,42662,42741,45341,45347,47276,46952,48428,49884,48802,49433,49915,51705,51945,51311,52919,52741,51751,51769,51843,53002,51405,51402,51047};

//datos para la simulación
uint16_t SimulaADCMedio[muestras]={33393,33574,32027,33589,33031,31969,32328,32861,33677,33691,32088,33703,33676,32739,33364,32057,32613,33594,33348,33681,33077,31846,33461,33630,33123,33280,33251,32554,33077,32115,33177,31838,32325,31867,31968,33410,33155,32405,33662,31843,32646,32533,33295,33354,32146,32748,32660,33059,33184,33274,32323,33125,33076,32098,32011,32765,33681,32451,32937,32220,33267,32282,32780,33163,33544,33680,32862,32050,32072,32286,33445,32280,33392,32259,33620,32470,32165,32274,32998,32715,32473,33425,32937,32867,33597,32343,33279,33272,32531,32903,31926,31882,32829,33322,33630,32033,32905,32707,31799,32445};

int16_t  vTensionA[vectormuestras];
int16_t  vTensionB[vectormuestras];

int16_t  iIntensidadA[vectormuestras];
int16_t  iIntensidadB[vectormuestras];

int contador=0;

int pulsador=0;

int16_t medidaTension;
int16_t medidaIntensidad;
int16_t medidaOffset;
int16_t medidaTensionSinOffset;
int16_t medidaIntensidadSinOffset;
int bufferActivo=0;
int flag=0;
int16_t measV=0;
int16_t measI=0;
int32_t producto=0;
int64_t sumatorioV=0;
int64_t sumatorioI=0;
int64_t sumatorioPA=0;

float VRMS=0;
float IRMS=0;
float P_activa=0;
float P_reactiva=0;
float P_aparente=0;
float Consumo_Pact=0;
float Consumo_Preact=0;
float FP=0;


//Para la simulacion
uint16_t adcTension()
{
    return SimulaADCTension[contador];
}

uint16_t adcIntensidad()
{
    return SimulaADCIntensidad[contador];
}

//Para la simulacion
uint16_t adcMedio()
{
    return SimulaADCMedio[contador];
}

//Captura de valores mediante muestreo
void captura() //función muestreo
{
    medidaTension=(int16_t)(adcTension()^0x8000);
    medidaIntensidad=(int16_t)(adcIntensidad()^0x8000);
    medidaOffset=(int16_t)(adcMedio()^0x8000);
    medidaTensionSinOffset=medidaTension-medidaOffset;
    medidaIntensidadSinOffset=medidaIntensidad-medidaOffset;

    if(bufferActivo) {
        vTensionA[contador] = medidaTensionSinOffset;
        vIntensidadA[contador] = medidaIntensidadSinOffset;
    } else {
        vTensionB[contador] = medidaTensionSinOffset;
        vIntensidadB[contador] = medidaIntensidadSinOffset;
    }
    
    contador++;
    if(contador==vectormuestras){
        contador=0;
        bufferActivo=!bufferActivo;
        flag=1;//buffer lleno
    }
}

void calculos()//Cálculo de los valores
{
    while(1) {//bucle para siempre
        if(flag) {//mira si el buffer esta lleno
            flag=0;//Borra la variable buffer lleno
            measV=0;
            measI=0;
            producto=0;
            sumatorioV=0;
            sumatorioI=0;
            sumatorioPA=0;

            for (int b=0; b<muestras; b++) {//VRMS
                if (!bufferActivo) {
                    measV=vTensionA[b];
                    measI=iIntensidadA[b];
                } else {
                    measV=vTensionB[b];
                    measI=iIntensidadB[b];
                }
                producto=measV*measV;
                sumatorioV+=producto;//calcula el valor VPP
                producto=measI*measI;
                sumatorioI+=producto;
                producto=measV*measI;
                sumatorioPA+=producto;
            }
            
            if(pulsador==0){
                VRMS=sqrt(constanteTension*sumatorioV);        
            }
                    
            else if (pulsador ==1) {
                IRMS=sqrt(constanteIntensidad*sumatorioI);
            }
                
            else if (pulsador ==2) {
                P_activa=sqrt(constanteTension*constanteIntensidad)*sumatorioPA;
            }
            
            else if (pulsador ==3) {
                P_aparente=VRMS*IRMS;
            }
            
            else if (pulsador ==4) {
                P_reactiva=sqrt(P_aparente*P_aparente)-(P_aparente*P_aparente);
            }
            
            else if (pulsador ==5) {
                Consumo_Pact=Consumo_Pact+P_activa*20e-3/(3600*1000);
            }
            
            else if (pulsador ==6) {
                Consumo_Preact=Consumo_Preact+P_reactiva*20e-3/(3600*1000);
            }
            
            else if (pulsador ==7) {
                FP=P_activa/P_aparente;
            }
    }          
}

//Visualización por pantalla
void visualizacion()//función mostrar
{
    if(pulsador==0){
        printf("VRMS: %3.4f\n\r", VRMS);
    }
    
    else if pulsador ==1 {
        printf("IRMS: %3.4f\n\r", IRMS);
    }
        
    else if pulsador ==2 {
        printf("Pot. activa: %3.4f\n\r", P_activa);
    }
    
    else if pulsador ==3 {
        printf("Pot. reactiva: %3.4f\n\r", P_reactiva);
    }
    
    else if pulsador ==4 {
        printf("Pot. aparente: %3.4f\n\r", P_aparente);
    }
    
    else if pulsador ==5 {
        printf("Consumo Pot. A: %3.4f\n\r", Consumo_Pact);
    }
    
    else if pulsador ==6 {
        printf("Consumo Pot. R: %3.4f\n\r", Consumo_Preact);
    }
    
    else if pulsador ==7 {
        printf("Factor de potencia: %3.4f\n\r", FP);
    }
    
}

//Cambio de boton
void cambio_boton() 
{ 
    pulsador++; 
    if(pulsador>8) { 
    pulsador=0;
   } 
} 

int main()
{
    Ticker timerCaptura;
    Ticker timerVisualizacion;
    timerCaptura.attach_us(&captura,200);//Hace que la función muestreo se ejecute cada 200us
    //Hace que la función boton se ejecute cada vez que se pulse el botón
    timerVisualizacion.attach(&visualizacion,1.0);//Hace que la función mostrar se ejecute cada segundo
    //Llamar a la función de cálculos
    //Llama la función mostrar por pantalla medida (visualiza)
    button.rise(&cambio_boton); //Llama al funcion cambio de menú (cambio botón)
    
}