Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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 }
Generated on Fri Jul 15 2022 18:49:40 by
1.7.2