TSA / Mbed 2 deprecated proyectoSAT

Dependencies:   mbed TextLCD

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #define bufferLength 500
00003 #define muestras 100
00004 #include "math.h"
00005 #include "TextLCD.h"
00006  
00007 
00008 
00009 TextLCD lcd(D8, D9, D2, D3, D4, D5, TextLCD::LCD16x2); // rs, e, d4-d7
00010 Serial pc(USBTX, USBRX); // tx, rx
00011 struct eResultados {
00012     float Vrms;
00013     float Vmax;
00014     float Vmin;
00015 };
00016 struct estructuraMedidas 
00017 { 
00018    float vrms; 
00019    float irms;  
00020    float potenciaActiva; 
00021    float potenciaReactiva;  
00022    float potenciaAparente;  
00023    float energiaConsumida;
00024    float factorDePotencia;
00025 };
00026 
00027 estructuraMedidas medidas;
00028 
00029 //struct Vectores{
00030   //  float  vTensionA[muestras];
00031   //float  vTensionB[muestras];
00032   //  float  vIntensidadA[muestras];
00033   //  float  vIntensidadB[muestras];
00034 //}
00035 //vectores;
00036 AnalogIn    adc_in(A0);
00037 AnalogIn    int_in(A1);
00038 AnalogIn    cont_in(A3);
00039 //AnalogOut   dac_out(A2);
00040 //AnalogOut   int_out(A3);
00041 InterruptIn boton(USER_BUTTON);
00042 
00043 Ticker tMuestrea;
00044 Ticker tVisualiza;
00045 void visualiza();
00046 void procesado(int length,  int16_t *entrada, int16_t *entrada2);
00047  void calcularDatos(int16_t *datosV, int16_t *datosI, int longitud, estructuraMedidas *medidas);
00048 void calcularRMS(int16_t *buffer, int longitud,eResultados *resul);
00049 int flag=0;
00050 int contador=0;
00051 int bufferActivo=0;
00052 
00053 struct buffers {
00054     int16_t vA[muestras];
00055     int16_t vB[muestras];
00056     int16_t iA[muestras];
00057     int16_t iB[muestras];
00058 };
00059 
00060 
00061 void muestrea();
00062 
00063 buffers bufferEntrada;
00064 buffers bufferSalida;
00065 
00066 eResultados resultados;
00067 
00068 int main()
00069 {
00070 
00071     tMuestrea.attach_us(&muestrea, 100);
00072     tVisualiza.attach(&visualiza, 5);
00073     
00074     while(1) {
00075         if (flag) {
00076             flag=0;
00077             if(bufferActivo==1) {
00078                 procesado(muestras,(int16_t *)&bufferEntrada.vA,(int16_t *)&bufferEntrada.iA);
00079             } else {
00080                 procesado(muestras,(int16_t *)&bufferEntrada.vB,(int16_t *)&bufferEntrada.iB);
00081             }
00082             
00083 
00084         }
00085     
00086 
00087         wait_us(1);
00088     }
00089     
00090 }
00091 
00092 void muestrea()
00093 {
00094     uint16_t dato=adc_in.read_u16();
00095         uint16_t dato2=int_in.read_u16();
00096         uint16_t cont=cont_in.read_u16();
00097         
00098     if (bufferActivo==0) {
00099 
00100         bufferEntrada.vA[contador]=dato-cont;
00101 
00102         bufferEntrada.iA[contador]=dato2-cont;
00103 
00104     }
00105 
00106     else {
00107 
00108         bufferEntrada.vB[contador]=dato-cont;
00109 
00110         bufferEntrada.iB[contador]=dato2-cont;
00111 
00112     }
00113 
00114     contador++;
00115     if(contador==muestras) {
00116         bufferActivo=!bufferActivo;
00117         contador=0;
00118         flag=1;
00119     }
00120 
00121 }
00122 void procesado(int length, int16_t *entrada, int16_t *entrada2)
00123 {
00124   //  for (int i=0; i<length; i++) {
00125     //    salida[i]=entrada[i];
00126     //}
00127 
00128 //    calcularRMS(entrada,length,&resultados);
00129       calcularDatos(entrada, entrada2,  100, &medidas);
00130 
00131 
00132 }
00133 void calcularRMS(int16_t *buffer, int longitud,eResultados *resul)
00134 {
00135     float cons=0.00005035400390625;
00136     float cons1=1.007080078125e-4;
00137     float cons2=cons*cons;
00138 
00139     float res;
00140     float Vmax=0;
00141     float Vmin=65535;
00142 
00143     uint64_t suma=0;
00144 
00145 
00146 
00147     for (int i=0; i<longitud; i++) {
00148 
00149         suma+=buffer[i]*buffer[i];
00150         if (Vmax<buffer[i]) {
00151             Vmax=buffer[i];
00152         }
00153         if (Vmin>buffer[i]) {
00154             Vmin=buffer[i];
00155         }
00156     }
00157 
00158 
00159     res=cons1*sqrt(((float)suma)/longitud);
00160     resul->Vrms=res;
00161     resul->Vmax=Vmax*cons;
00162     resul->Vmin=Vmin*cons;
00163 }
00164 
00165 void visualiza(){
00166     
00167     printf ("El valor RMS es %f\n",medidas.vrms);
00168     printf ("El valor irms es %f\n",medidas.irms);
00169     printf ("El valor energia consumida es %f\n",medidas.energiaConsumida);
00170     printf ("El valor factor de potencia es %f\n",medidas.factorDePotencia);
00171     printf ("El valor potencia Aparente es %f\n",medidas.potenciaAparente);
00172     printf ("El valor potencia Activa es %f\n",medidas.potenciaActiva);
00173     printf ("El valor potencia Reactiva es %f\n\n",medidas.potenciaReactiva);
00174     
00175        
00176         
00177  
00178     
00179     }
00180     void calcularDatos(int16_t *datosV, int16_t *datosI, int longitud, estructuraMedidas *medidas)
00181 {
00182     float cons=1.007080078125e-4;
00183     float cons2=cons*cons;
00184 
00185     int64_t sumaV=0;
00186     int64_t sumaI=0;
00187     int64_t sumaP=0;
00188    
00189 
00190 
00191     float datoV;
00192     float datoI;
00193     float datoP;
00194     float datoS;
00195     float datoQ;
00196  
00197 
00198     for (int i=0; i<longitud; i++) {
00199 
00200         sumaV+=datosV[i]*datosV[i];
00201         sumaI+=datosI[i]*datosI[i];
00202         sumaP+=datosV[i]*datosI[i];
00203     }
00204 
00205     datoV = cons*sqrt(((float)sumaV)/longitud);
00206     datoI = cons*sqrt(((float)sumaI)/longitud);
00207     datoP = cons2*((float)sumaP)/longitud;
00208     datoS=datoV*datoI;
00209     datoQ = sqrt((datoS*datoS)-(datoP*datoP)); 
00210 
00211         (*medidas).energiaConsumida = datoP/datoI;     
00212         (*medidas).factorDePotencia = datoP/datoS;
00213         (*medidas).potenciaAparente = datoS;
00214         (*medidas).potenciaActiva = datoP;
00215         (*medidas).potenciaReactiva = datoQ;
00216         (*medidas).vrms = datoV;
00217         (*medidas).irms = datoI;
00218  
00219 }