ASTUR / Mbed 2 deprecated proyecto_final

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 #include "math.h"
00003 #include "TextLCD.h"
00004 
00005 #define muestras 100
00006 #define bufferLength 500
00007 
00008 TextLCD lcd(D8, D9, D2, D3, D4, D5, TextLCD::LCD16x2); // rs, e, d4-d7
00009 Serial pc(USBTX, USBRX); // tx, rx
00010 
00011 Serial bt(PC_0, PC_1); // tx, rx
00012 
00013 //lcd.cls();
00014 //lcd.printf("Media: %3.4f\n", medidas.media);
00015 
00016 int contador=0;
00017 int flag=0;
00018 int bufferActivo=0;
00019 int mostrarDato=0;
00020 
00021 
00022 AnalogIn tension(A0);
00023 AnalogIn intensidad(A1);
00024 AnalogIn adcMedio(A2);
00025 
00026 
00027 
00028 char inputdata = 0;
00029 
00030 
00031 InterruptIn boton(USER_BUTTON);
00032 
00033 struct Vectores {
00034     int16_t  vTensionA[muestras];
00035     int16_t  vTensionB[muestras];
00036     int16_t  vIntensidadA[muestras];
00037     int16_t  vIntensidadB[muestras];
00038 } vectores;
00039 
00040 struct Medidas {
00041     float Vrms;
00042     float Irms;
00043     float potenciaActiva;    //ok
00044     float potenciaReactiva;  //ok
00045     float potenciaAparente;  //ok
00046     float potenciaActivaAC;
00047     float potenciaReactivaAC;
00048     float factorDePotencia;  //ok
00049 } medidas;
00050 
00051 
00052 Ticker tcaptura;
00053 Ticker tmostrar;
00054 void captura();
00055 void visualizacion();
00056 //void visualizacion_blu();
00057 void cambiar();
00058 
00059 float calcularP(int16_t *datosV, int16_t *datosI, int longitud);
00060 float calcularRMS(int16_t *datos, int longitud);
00061 void calcular(int16_t *datosV, int16_t *datosI, int longitud);
00062 
00063 int main()
00064 {
00065     bt.baud(9600);
00066     Ticker timerCaptura;
00067     Ticker timerVisualizacion;
00068     //Ticker timerVisualizacion_blu;
00069     timerCaptura.attach_us(&captura,400);
00070     timerVisualizacion.attach(&visualizacion,1.0);
00071     //timerVisualizacion_blu.attach(&visualizacion_blu,1.0);
00072     boton.rise(&cambiar);
00073     while(1) {
00074         if(flag) {
00075             if(bufferActivo) {
00076                 calcular(vectores.vTensionA,vectores.vIntensidadA,muestras);
00077             } else {
00078                 calcular(vectores.vTensionB,vectores.vIntensidadB,muestras);
00079             }
00080             flag=0;
00081         }
00082     }
00083 }
00084 
00085 
00086 void captura()
00087 {
00088 
00089     int16_t medidaTension=(int16_t)(tension.read_u16()^0x8000);
00090     int16_t medidaIntensidad=(int16_t)(intensidad.read_u16()^0x8000);
00091     int16_t medidaOffset=(int16_t)(adcMedio.read_u16()^0x8000);
00092     int16_t medidaTensionSinOffset=medidaTension-medidaOffset;
00093     int16_t medidaIntensidadSinOffset=medidaIntensidad-medidaOffset;
00094     //lectura señales
00095 
00096     // printf("V = %.2f [V]",x);
00097     // printf("I = %.2f [A]",y);
00098     /*
00099      float datotension = 1.11*(650.5382387*x-325.2691193);
00100      float datointensidad = 1.61*(18.18*y-9.09);
00101      */
00102     //uint16_t dato=adc_in.read_u16();
00103 
00104     if(bufferActivo) {
00105         vectores.vTensionB[contador] = medidaTensionSinOffset;
00106         vectores.vIntensidadB[contador] = medidaIntensidadSinOffset;
00107     } else {
00108         vectores.vTensionA[contador]=medidaTensionSinOffset;
00109         vectores.vIntensidadA[contador]=medidaIntensidadSinOffset;
00110     }
00111 
00112     // dac_out.write_u16(dato);
00113 
00114     contador++;
00115 
00116     if(contador==muestras) {
00117         flag = 1;
00118         contador = 0;
00119         if(bufferActivo) {
00120             bufferActivo=0;
00121         } else {
00122             bufferActivo=1;
00123         }
00124 
00125         //bufferActivo=!bufferActivo;
00126     }
00127 
00128 }
00129 /*
00130 void visualizacion_blu()
00131 {
00132         
00133        //If (bt.available() > 0)     
00134    {
00135       inputdata = bt.read();       
00136       if(inputdata == '0')
00137       {
00138          Serialbt.print("Vrms\n %.2f [V]",medidas.Vrms);
00139       }
00140         
00141       else if(inputdata == '1') 
00142       {     
00143          Serialbt.print("Irms\n %.2f [A]",medidas.Irms);
00144       }
00145             else if(inputdata == '2') 
00146       {     
00147          Serialbt.print("P\n %.2f [W]",medidas.potenciaActiva);
00148       }
00149             else if(inputdata == '3') 
00150       {     
00151          Serialbt.print("Q\n %.2f [VAr]",medidas.potenciaReactiva);
00152       }
00153             else if(inputdata == '4') 
00154       {     
00155          Serialbt.print("S\n %.2f [VA]",medidas.potenciaAparente);
00156       }
00157             else if(inputdata == '5') 
00158       {     
00159          Serialbt.print("Pac\n %.2f [W]",medidas.potenciaActivaAC);
00160       }
00161             else if(inputdata == '6') 
00162       {     
00163          Serialbt.print("Qac\n %.2f [W]",medidas.potenciaReactivaAC);
00164       }
00165             else if(inputdata == '7') 
00166       {     
00167          Serialbt.print("FdP\n %.8f",medidas.factorDePotencia);
00168       }
00169    }
00170    
00171 }
00172 */
00173 
00174 void visualizacion()
00175 {
00176     printf("Vrms = %.2f [V]\n",medidas.Vrms);
00177     printf("Irms = %.2f [A]\n",medidas.Irms);
00178     printf("P = %.2f [W]\n",medidas.potenciaActiva);
00179     printf("Q = %.2f [VAr]\n",medidas.potenciaReactiva);
00180     printf("S = %.2f [VA]\n",medidas.potenciaAparente);
00181     printf("Pac = %.2f [W]\n",medidas.potenciaActivaAC);
00182     printf("Qac = %.2f [W]\n",medidas.potenciaReactivaAC);
00183     printf("FdP = %.2f\n",medidas.factorDePotencia);
00184     printf("*******************\n");
00185 
00186     lcd.cls();
00187     switch (mostrarDato) {
00188         case 0:
00189             lcd.printf("Vrms\n %.2f [V]",medidas.Vrms);
00190             break;
00191         case 1:
00192             lcd.printf("Irms\n %.2f [A]",medidas.Irms);
00193             break;
00194         case 2:
00195             lcd.printf("P\n %.2f [W]",medidas.potenciaActiva);
00196             break;
00197         case 3:
00198             lcd.printf("Q\n %.2f [VAr]",medidas.potenciaReactiva);
00199             break;
00200         case 4:
00201             lcd.printf("S\n %.2f [VA]",medidas.potenciaAparente);
00202             break;
00203         case 5:
00204             lcd.printf("Pac\n %.2f [W]",medidas.potenciaActivaAC);
00205             break;
00206         case 6:
00207             lcd.printf("Qac\n %.2f [W]",medidas.potenciaReactivaAC);
00208             break;
00209         case 7:
00210             lcd.printf("FdP\n %.8f",medidas.factorDePotencia);
00211             break;
00212             
00213     }
00214     bt.printf(" Vrms%.2f [V] \n Irms %.2f [A] \n P %.2f [W]\n Q %.2f [VAr]\n S %.2f [VA]\n Pac %.2f [W]\n Qac %.2f [W]\n FdP %.8f",
00215     medidas.Vrms,medidas.Irms,medidas.potenciaActiva,medidas.potenciaReactiva,medidas.potenciaAparente,medidas.potenciaActivaAC,
00216     medidas.potenciaReactivaAC,medidas.factorDePotencia);
00217     //bt.printf("Vrms\n %.2f [V] |Irms\n %.2f [A] |P\n %.2f [W]|Q\n %.2f [VAr]|S\n %.2f [VA]| Pac\n %.2f [W]| Qac\n %.2f [W]| FdP\n %.8f",medidas.Vrms,medidas.Irms,medidas.potenciaActiva,medidas.potenciaReactiva,medidas.potenciaAparente,medidas.potenciaActivaAC,medidas.potenciaReactivaAC,medidas.factorDePotencia);
00218 
00219 }
00220 
00221 void cambiar()
00222 {
00223     mostrarDato++;
00224     if (mostrarDato>7) {
00225         mostrarDato=0;
00226     }
00227 }
00228 
00229 int eBoton=0;
00230 
00231 void calcular(int16_t *datosV, int16_t *datosI, int longitud)
00232 {
00233     //multiplicar la constante por vrms
00234 
00235     medidas.Vrms = calcularRMS(datosV,longitud)*0,0119968263348874;
00236     medidas.Irms = calcularRMS(datosI,longitud)*0.000558209361279455;
00237     medidas.potenciaActiva = calcularP(datosV,datosI,longitud)*0.000008490055907814898;
00238     medidas.potenciaAparente = medidas.Vrms*medidas.Irms;
00239     medidas.potenciaReactiva = sqrt(medidas.potenciaAparente*medidas.potenciaAparente-medidas.potenciaActiva*medidas.potenciaActiva);
00240     medidas.potenciaActivaAC += medidas.potenciaActiva*0.2/3600;//*0.2/3600;          //0.000000277777
00241     medidas.potenciaReactivaAC += medidas.potenciaReactiva*0.2/3600;           //0.000000277777;
00242     medidas.factorDePotencia = medidas.potenciaReactiva/medidas.potenciaAparente;
00243 }
00244 
00245 float calcularRMS(int16_t *datos, int longitud)
00246 {
00247     int64_t acumulador=0;
00248     int32_t producto;
00249     int i;
00250 
00251     for(i=0; i<longitud; i++) {
00252         producto=datos[i]*datos[i];
00253         acumulador += producto;
00254     }
00255     float valor = acumulador/longitud  ;
00256     return sqrt(valor);
00257 }
00258 
00259 
00260 float calcularP(int16_t *datosV, int16_t *datosI, int longitud)
00261 {
00262     int64_t acumulador=0;
00263     int32_t producto;
00264     int i;
00265 
00266     for(i=0; i<longitud; i++) {
00267         producto=datosV[i]*datosI[i];
00268         acumulador += producto;
00269     }
00270     float valor = acumulador/longitud  ;
00271     return valor;
00272 }
00273 
00274