Dependencies:   mbed TextLCD

Revision:
0:ebc3999f6ef4
Child:
1:b1d6185f85c8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Fri Nov 29 12:52:32 2019 +0000
@@ -0,0 +1,199 @@
+#include "mbed.h"
+#define bufferLength 500
+#include "math.h"
+#include "TextLCD.h"
+ 
+#define muestras 100
+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;
+};
+//struct Vectores{
+  //  float  vTensionA[muestras];
+  //float  vTensionB[muestras];
+  //  float  vIntensidadA[muestras];
+  //  float  vIntensidadB[muestras];
+}vectores;
+AnalogIn    adc_in(A0);
+AnalogIn    int_in(A1);
+AnalogOut   dac_out(A2);
+AnalogOut   int_out(A3);
+InterruptIn boton(USER_BUTTON);
+
+Ticker tMuestrea;
+Ticker tVisualiza;
+void visualiza();
+void procesado(int length,  uint16_t *entrada, uint16_t *entrada2);
+void calcularRMS(uint16_t *buffer, int longitud,eResultados *resul);
+int flag=0;
+int contador=0;
+int bufferActivo=0;
+
+struct buffers {
+    uint16_t 1A[muestras];
+    uint16_t 1B[muestras];
+    uint16_t 2A[muestras];
+    uint16_t 2B[muestras];
+};
+
+bool bufferActivo=0;
+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,(uint16_t *)&bufferEntrada.1A,(uint16_t *)&bufferEntrada.2A);
+            } else {
+                procesado(muestras,(uint16_t *)&bufferEntrada.1B,(uint16_t *)&bufferEntrada.2B);
+            }
+            
+
+        }
+
+
+        wait_us(1);
+    }
+}
+
+void muestrea()
+{
+    uint16_t dato=adc_in.read_u16();
+        uint16_t dato2=int_in.read_u16();
+    if (bufferActivo==0) {
+
+        bufferEntrada.1A[contador]=dato;
+
+        bufferEntrada.2A[contador]=dato2;
+
+    }
+
+    else {
+
+        bufferEntrada.1B[contador]=dato;
+
+        bufferEntrada.2B[contador]=dato2;
+
+    }
+
+    contador++;
+    if(contador==muestras) {
+        bufferActivo=!bufferActivo;
+        contador=0;
+        flag=1;
+    }
+
+}
+void procesado(int length, uint16_t *entrada, uint16_t *entrada2)
+//{
+  //  for (int i=0; i<length; i++) {
+    //    salida[i]=entrada[i];
+    //}
+
+//    calcularRMS(entrada,length,&resultados);
+     void calcularDatos(int16_t *entrada, int16_t *entrada2, int longitud, estructuraMedidas *medidas);
+
+
+}
+void calcularRMS(uint16_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 maxima es %f\n",resultados.Vmax);
+    printf ("El valor minimo es %f\n",resultados.Vmin);
+    printf ("El valor RMS es %f\n\n",resultados.Vrms);
+    
+    }
+    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;
+        (*medidas).factorDePotencia = datoP/datoS;
+}