final
Embed:
(wiki syntax)
Show/hide line numbers
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