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.
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
Generated on Thu Aug 25 2022 10:02:29 by
1.7.2