ASTUR
/
proyecto_final
main.cpp
- Committer:
- fernandoabreuro
- Date:
- 2020-02-03
- Revision:
- 3:9d746f4fb569
- Parent:
- 2:f50bb191b326
File content as of revision 3:9d746f4fb569:
#include "mbed.h" #include "math.h" #include "TextLCD.h" #define muestras 100 #define bufferLength 500 TextLCD lcd(D8, D9, D2, D3, D4, D5, TextLCD::LCD16x2); // rs, e, d4-d7 Serial pc(USBTX, USBRX); // tx, rx Serial bt(PC_0, PC_1); // tx, rx //lcd.cls(); //lcd.printf("Media: %3.4f\n", medidas.media); int contador=0; int flag=0; int bufferActivo=0; int mostrarDato=0; AnalogIn tension(A0); AnalogIn intensidad(A1); AnalogIn adcMedio(A2); char inputdata = 0; InterruptIn boton(USER_BUTTON); struct Vectores { int16_t vTensionA[muestras]; int16_t vTensionB[muestras]; int16_t vIntensidadA[muestras]; int16_t vIntensidadB[muestras]; } vectores; struct Medidas { float Vrms; float Irms; float potenciaActiva; //ok float potenciaReactiva; //ok float potenciaAparente; //ok float potenciaActivaAC; float potenciaReactivaAC; float factorDePotencia; //ok } medidas; Ticker tcaptura; Ticker tmostrar; void captura(); void visualizacion(); //void visualizacion_blu(); void cambiar(); float calcularP(int16_t *datosV, int16_t *datosI, int longitud); float calcularRMS(int16_t *datos, int longitud); void calcular(int16_t *datosV, int16_t *datosI, int longitud); int main() { bt.baud(9600); Ticker timerCaptura; Ticker timerVisualizacion; //Ticker timerVisualizacion_blu; timerCaptura.attach_us(&captura,400); timerVisualizacion.attach(&visualizacion,1.0); //timerVisualizacion_blu.attach(&visualizacion_blu,1.0); boton.rise(&cambiar); while(1) { if(flag) { if(bufferActivo) { calcular(vectores.vTensionA,vectores.vIntensidadA,muestras); } else { calcular(vectores.vTensionB,vectores.vIntensidadB,muestras); } flag=0; } } } void captura() { int16_t medidaTension=(int16_t)(tension.read_u16()^0x8000); int16_t medidaIntensidad=(int16_t)(intensidad.read_u16()^0x8000); int16_t medidaOffset=(int16_t)(adcMedio.read_u16()^0x8000); int16_t medidaTensionSinOffset=medidaTension-medidaOffset; int16_t medidaIntensidadSinOffset=medidaIntensidad-medidaOffset; //lectura señales // printf("V = %.2f [V]",x); // printf("I = %.2f [A]",y); /* float datotension = 1.11*(650.5382387*x-325.2691193); float datointensidad = 1.61*(18.18*y-9.09); */ //uint16_t dato=adc_in.read_u16(); if(bufferActivo) { vectores.vTensionB[contador] = medidaTensionSinOffset; vectores.vIntensidadB[contador] = medidaIntensidadSinOffset; } else { vectores.vTensionA[contador]=medidaTensionSinOffset; vectores.vIntensidadA[contador]=medidaIntensidadSinOffset; } // dac_out.write_u16(dato); contador++; if(contador==muestras) { flag = 1; contador = 0; if(bufferActivo) { bufferActivo=0; } else { bufferActivo=1; } //bufferActivo=!bufferActivo; } } /* void visualizacion_blu() { //If (bt.available() > 0) { inputdata = bt.read(); if(inputdata == '0') { Serialbt.print("Vrms\n %.2f [V]",medidas.Vrms); } else if(inputdata == '1') { Serialbt.print("Irms\n %.2f [A]",medidas.Irms); } else if(inputdata == '2') { Serialbt.print("P\n %.2f [W]",medidas.potenciaActiva); } else if(inputdata == '3') { Serialbt.print("Q\n %.2f [VAr]",medidas.potenciaReactiva); } else if(inputdata == '4') { Serialbt.print("S\n %.2f [VA]",medidas.potenciaAparente); } else if(inputdata == '5') { Serialbt.print("Pac\n %.2f [W]",medidas.potenciaActivaAC); } else if(inputdata == '6') { Serialbt.print("Qac\n %.2f [W]",medidas.potenciaReactivaAC); } else if(inputdata == '7') { Serialbt.print("FdP\n %.8f",medidas.factorDePotencia); } } } */ void visualizacion() { printf("Vrms = %.2f [V]\n",medidas.Vrms); printf("Irms = %.2f [A]\n",medidas.Irms); printf("P = %.2f [W]\n",medidas.potenciaActiva); printf("Q = %.2f [VAr]\n",medidas.potenciaReactiva); printf("S = %.2f [VA]\n",medidas.potenciaAparente); printf("Pac = %.2f [W]\n",medidas.potenciaActivaAC); printf("Qac = %.2f [W]\n",medidas.potenciaReactivaAC); printf("FdP = %.2f\n",medidas.factorDePotencia); printf("*******************\n"); lcd.cls(); switch (mostrarDato) { case 0: lcd.printf("Vrms\n %.2f [V]",medidas.Vrms); break; case 1: lcd.printf("Irms\n %.2f [A]",medidas.Irms); break; case 2: lcd.printf("P\n %.2f [W]",medidas.potenciaActiva); break; case 3: lcd.printf("Q\n %.2f [VAr]",medidas.potenciaReactiva); break; case 4: lcd.printf("S\n %.2f [VA]",medidas.potenciaAparente); break; case 5: lcd.printf("Pac\n %.2f [W]",medidas.potenciaActivaAC); break; case 6: lcd.printf("Qac\n %.2f [W]",medidas.potenciaReactivaAC); break; case 7: lcd.printf("FdP\n %.8f",medidas.factorDePotencia); break; } 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", medidas.Vrms,medidas.Irms,medidas.potenciaActiva,medidas.potenciaReactiva,medidas.potenciaAparente,medidas.potenciaActivaAC, medidas.potenciaReactivaAC,medidas.factorDePotencia); //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); } void cambiar() { mostrarDato++; if (mostrarDato>7) { mostrarDato=0; } } int eBoton=0; void calcular(int16_t *datosV, int16_t *datosI, int longitud) { //multiplicar la constante por vrms medidas.Vrms = calcularRMS(datosV,longitud)*0,0119968263348874; medidas.Irms = calcularRMS(datosI,longitud)*0.000558209361279455; medidas.potenciaActiva = calcularP(datosV,datosI,longitud)*0.000008490055907814898; medidas.potenciaAparente = medidas.Vrms*medidas.Irms; medidas.potenciaReactiva = sqrt(medidas.potenciaAparente*medidas.potenciaAparente-medidas.potenciaActiva*medidas.potenciaActiva); medidas.potenciaActivaAC += medidas.potenciaActiva*0.2/3600;//*0.2/3600; //0.000000277777 medidas.potenciaReactivaAC += medidas.potenciaReactiva*0.2/3600; //0.000000277777; medidas.factorDePotencia = medidas.potenciaReactiva/medidas.potenciaAparente; } float calcularRMS(int16_t *datos, int longitud) { int64_t acumulador=0; int32_t producto; int i; for(i=0; i<longitud; i++) { producto=datos[i]*datos[i]; acumulador += producto; } float valor = acumulador/longitud ; return sqrt(valor); } float calcularP(int16_t *datosV, int16_t *datosI, int longitud) { int64_t acumulador=0; int32_t producto; int i; for(i=0; i<longitud; i++) { producto=datosV[i]*datosI[i]; acumulador += producto; } float valor = acumulador/longitud ; return valor; }