Proyecto final

Dependencies:   mbed TextLCD

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers final.cpp Source File

final.cpp

00001 #include "mbed.h"
00002 #include "math.h"
00003 #include "TextLCD.h"
00004 
00005 #define datoTension 725.331071
00006 #define datoIntensidad 29.4943123
00007 #define constanteTension 1.4709e-06
00008 #define constanteIntensidad 1.423595702690060e-09
00009 #define vectormuestras 100
00010 #define offsetTension 0.50369472
00011 #define offsetIntensidad 0.4152
00012 #define eps 2.220446049250313e-016
00013 
00014 void sacardatos();
00015 
00016 TextLCD lcd(D8, D9, D2, D3, D4, D5, TextLCD::LCD16x2); // rs, e, d4-d7
00017 Serial pc(USBTX, USBRX); // tx, rx
00018 
00019 InterruptIn button(PC_13); 
00020 AnalogIn tension(A2);
00021 AnalogIn intensidad(A1);
00022     Ticker timerCaptura;
00023     Ticker timerVisualizacion;
00024 
00025 struct Vectores{
00026     float  vTensionA[vectormuestras];
00027     float  vTensionB[vectormuestras];
00028     
00029     float  vIntensidadA[vectormuestras];
00030     float  vIntensidadB[vectormuestras];
00031 }vectores;
00032 
00033     float flag=0;
00034     int bufferActivo=0;
00035     int contador=0;
00036     int pulsador=0;
00037 
00038 struct Medidas{
00039 
00040     float VRMS;
00041     float IRMS;
00042     float P_activa;
00043     float P_reactiva;
00044     float P_aparente;
00045     float Consumo_Pact;
00046     float Consumo_Preact;
00047     float FP;
00048 }medidas;
00049 
00050 
00051 
00052 //Captura de valores mediante muestreo
00053 void captura() //función muestreo
00054 {
00055     
00056     float medidaTension=tension.read();
00057     medidaTension=(medidaTension-offsetTension)*datoTension;
00058     
00059     float medidaIntensidad=intensidad.read();
00060     medidaIntensidad=(medidaIntensidad-offsetIntensidad)*datoIntensidad;
00061     
00062     if(bufferActivo==1) {
00063         vectores.vTensionA[contador] = medidaTension;
00064         vectores.vIntensidadA[contador] = medidaIntensidad;
00065         
00066     } else {
00067         vectores.vTensionB[contador] = medidaTension;
00068         vectores.vIntensidadB[contador] = medidaIntensidad;
00069     }
00070     
00071     contador++;
00072     if(contador==vectormuestras){
00073         contador=0;
00074         bufferActivo=!bufferActivo;
00075         flag=1;//buffer lleno
00076     }
00077 }
00078 
00079 //Visualización por pantalla
00080 void visualizacion()//función mostrar
00081 {
00082     lcd.cls();
00083     if(pulsador==0){
00084         lcd.printf("VRMS:\n %f", medidas.VRMS);
00085     }
00086     
00087     else if (pulsador ==1) {
00088         lcd.printf("IRMS:\n %f", medidas.IRMS);
00089     }
00090         
00091     else if (pulsador ==2) {
00092         lcd.printf("Pot. activa:\n %f", medidas.P_activa);
00093     }
00094     
00095     else if (pulsador ==3) {
00096         lcd.printf("Pot. reactiva:\n %f", medidas.P_reactiva);
00097     }
00098     
00099     else if (pulsador ==4) {
00100         lcd.printf("Pot. aparente:\n %f", medidas.P_aparente);
00101     }
00102     
00103     else if (pulsador ==5) {
00104         lcd.printf("Consumo Pot. A:\n %f", medidas.Consumo_Pact);
00105     }
00106     
00107     else if (pulsador ==6) {
00108         lcd.printf("Consumo Pot. R:\n %f", medidas.Consumo_Preact);
00109     }
00110     
00111     else if (pulsador ==7) {
00112         lcd.printf("Factor de pot.:\n %f", medidas.FP);
00113     }
00114     
00115 }
00116 
00117 //Cambio de boton
00118 void cambio_boton() 
00119 { 
00120     pulsador++; 
00121     if(pulsador>7) { 
00122     pulsador=0;
00123    } 
00124 } 
00125 
00126 int main()
00127 {
00128     float measV=0;
00129     float measI=0;
00130     float producto=0;
00131     float sumatorioV=0;
00132     float sumatorioI=0;
00133     float sumatorioPA=0;
00134     medidas.Consumo_Pact=0.0;
00135     medidas.Consumo_Preact=0.0;
00136     
00137 
00138     timerCaptura.attach_us(&captura,200);//Hace que la función muestreo se ejecute cada 200us
00139     timerVisualizacion.attach(&visualizacion,1.0);//Hace que la función mostrar se ejecute cada segundo
00140     button.rise(&cambio_boton);//Hace que la función boton se ejecute cada vez que se pulse el botón
00141     
00142     while(1) {//bucle para siempre
00143         if(flag) {//mira si el buffer esta lleno
00144             flag=0;//Borra la variable buffer lleno
00145             measV=0;
00146             measI=0;
00147             producto=0;
00148             sumatorioV=0;
00149             sumatorioI=0;
00150             sumatorioPA=0;
00151 
00152             for (int b=0; b<vectormuestras; b++) {//VRMS
00153                 if (!bufferActivo) {
00154                     measV=vectores.vTensionA[b];
00155                     measI=vectores.vIntensidadA[b];
00156                 } else {
00157                     measV=vectores.vTensionB[b];
00158                     measI=vectores.vIntensidadB[b];
00159                 }
00160                 producto=measV*measV;
00161                 sumatorioV+=producto;//calcula el valor VPP
00162                 producto=measI*measI;
00163                 sumatorioI+=producto;
00164                 producto=measV*measI;
00165                 sumatorioPA+=producto;
00166             }
00167 
00168             medidas.VRMS=sqrt(sumatorioV/vectormuestras);        
00169             medidas.IRMS=sqrt(sumatorioI/vectormuestras);
00170             medidas.P_activa=sumatorioPA/vectormuestras;
00171             medidas.P_aparente=medidas.VRMS*medidas.IRMS;
00172             medidas.P_reactiva=sqrt((medidas.P_aparente*medidas.P_aparente)-(medidas.P_activa*medidas.P_activa));
00173             medidas.Consumo_Pact=medidas.Consumo_Pact+medidas.P_activa*20e-3/(3600*1000);
00174             medidas.Consumo_Preact=medidas.Consumo_Preact+medidas.P_reactiva*20e-3/(3600*1000);
00175             medidas.FP=medidas.P_activa/(medidas.P_aparente+eps);
00176             //sacardatos();
00177         }
00178         wait(0.001);
00179     }        
00180 }
00181 
00182 void sacardatos(){
00183     timerCaptura.attach(&captura,100);
00184     for (int i=0;i<100;i++){
00185         printf("%f\r\n",vectores.vIntensidadB[i]);
00186     }
00187 }