a

Dependencies:   mbed TextLCD

main.cpp

Committer:
alexmar97
Date:
2019-12-12
Revision:
1:b1d6185f85c8
Parent:
0:ebc3999f6ef4

File content as of revision 1:b1d6185f85c8:

#include "mbed.h"
#define bufferLength 500
#define muestras 100
#include "math.h"
#include "TextLCD.h"
 


TextLCD lcd(D8, D9, D2, D3, D4, D5, TextLCD::LCD16x2); // rs, e, d4-d7
Serial pc(USBTX, USBRX); // tx, rx
struct eResultados {
    float Vrms;
    float Vmax;
    float Vmin;
};
struct estructuraMedidas 
{ 
   float vrms; 
   float irms;  
   float potenciaActiva; 
   float potenciaReactiva;  
   float potenciaAparente;  
   float energiaConsumida;
   float factorDePotencia;
};

estructuraMedidas medidas;

//struct Vectores{
  //  float  vTensionA[muestras];
  //float  vTensionB[muestras];
  //  float  vIntensidadA[muestras];
  //  float  vIntensidadB[muestras];
//}
//vectores;
AnalogIn    adc_in(A0);
AnalogIn    int_in(A1);
AnalogIn    cont_in(A3);
//AnalogOut   dac_out(A2);
//AnalogOut   int_out(A3);
InterruptIn boton(USER_BUTTON);

Ticker tMuestrea;
Ticker tVisualiza;
void visualiza();
void procesado(int length,  int16_t *entrada, int16_t *entrada2);
 void calcularDatos(int16_t *datosV, int16_t *datosI, int longitud, estructuraMedidas *medidas);
void calcularRMS(int16_t *buffer, int longitud,eResultados *resul);
int flag=0;
int contador=0;
int bufferActivo=0;

struct buffers {
    int16_t vA[muestras];
    int16_t vB[muestras];
    int16_t iA[muestras];
    int16_t iB[muestras];
};


void muestrea();

buffers bufferEntrada;
buffers bufferSalida;

eResultados resultados;

int main()
{

    tMuestrea.attach_us(&muestrea, 100);
    tVisualiza.attach(&visualiza, 5);
    
    while(1) {
        if (flag) {
            flag=0;
            if(bufferActivo==1) {
                procesado(muestras,(int16_t *)&bufferEntrada.vA,(int16_t *)&bufferEntrada.iA);
            } else {
                procesado(muestras,(int16_t *)&bufferEntrada.vB,(int16_t *)&bufferEntrada.iB);
            }
            

        }
    

        wait_us(1);
    }
    
}

void muestrea()
{
    uint16_t dato=adc_in.read_u16();
        uint16_t dato2=int_in.read_u16();
        uint16_t cont=cont_in.read_u16();
        
    if (bufferActivo==0) {

        bufferEntrada.vA[contador]=dato-cont;

        bufferEntrada.iA[contador]=dato2-cont;

    }

    else {

        bufferEntrada.vB[contador]=dato-cont;

        bufferEntrada.iB[contador]=dato2-cont;

    }

    contador++;
    if(contador==muestras) {
        bufferActivo=!bufferActivo;
        contador=0;
        flag=1;
    }

}
void procesado(int length, int16_t *entrada, int16_t *entrada2)
{
  //  for (int i=0; i<length; i++) {
    //    salida[i]=entrada[i];
    //}

//    calcularRMS(entrada,length,&resultados);
      calcularDatos(entrada, entrada2,  100, &medidas);


}
void calcularRMS(int16_t *buffer, int longitud,eResultados *resul)
{
    float cons=0.00005035400390625;
    float cons1=1.007080078125e-4;
    float cons2=cons*cons;

    float res;
    float Vmax=0;
    float Vmin=65535;

    uint64_t suma=0;



    for (int i=0; i<longitud; i++) {

        suma+=buffer[i]*buffer[i];
        if (Vmax<buffer[i]) {
            Vmax=buffer[i];
        }
        if (Vmin>buffer[i]) {
            Vmin=buffer[i];
        }
    }


    res=cons1*sqrt(((float)suma)/longitud);
    resul->Vrms=res;
    resul->Vmax=Vmax*cons;
    resul->Vmin=Vmin*cons;
}

void visualiza(){
    
    printf ("El valor RMS es %f\n",medidas.vrms);
    printf ("El valor irms es %f\n",medidas.irms);
    printf ("El valor energia consumida es %f\n",medidas.energiaConsumida);
    printf ("El valor factor de potencia es %f\n",medidas.factorDePotencia);
    printf ("El valor potencia Aparente es %f\n",medidas.potenciaAparente);
    printf ("El valor potencia Activa es %f\n",medidas.potenciaActiva);
    printf ("El valor potencia Reactiva es %f\n\n",medidas.potenciaReactiva);
    
       
        
 
    
    }
    void calcularDatos(int16_t *datosV, int16_t *datosI, int longitud, estructuraMedidas *medidas)
{
    float cons=1.007080078125e-4;
    float cons2=cons*cons;

    int64_t sumaV=0;
    int64_t sumaI=0;
    int64_t sumaP=0;
   


    float datoV;
    float datoI;
    float datoP;
    float datoS;
    float datoQ;
 

    for (int i=0; i<longitud; i++) {

        sumaV+=datosV[i]*datosV[i];
        sumaI+=datosI[i]*datosI[i];
        sumaP+=datosV[i]*datosI[i];
    }

    datoV = cons*sqrt(((float)sumaV)/longitud);
    datoI = cons*sqrt(((float)sumaI)/longitud);
    datoP = cons2*((float)sumaP)/longitud;
    datoS=datoV*datoI;
    datoQ = sqrt((datoS*datoS)-(datoP*datoP)); 

        (*medidas).energiaConsumida = datoP/datoI;     
        (*medidas).factorDePotencia = datoP/datoS;
        (*medidas).potenciaAparente = datoS;
        (*medidas).potenciaActiva = datoP;
        (*medidas).potenciaReactiva = datoQ;
        (*medidas).vrms = datoV;
        (*medidas).irms = datoI;
 
}