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 #define bufferLength 500 00003 #define muestras 100 00004 #include "math.h" 00005 #include "TextLCD.h" 00006 00007 00008 00009 TextLCD lcd(D8, D9, D2, D3, D4, D5, TextLCD::LCD16x2); // rs, e, d4-d7 00010 Serial pc(USBTX, USBRX); // tx, rx 00011 struct eResultados { 00012 float Vrms; 00013 float Vmax; 00014 float Vmin; 00015 }; 00016 struct estructuraMedidas 00017 { 00018 float vrms; 00019 float irms; 00020 float potenciaActiva; 00021 float potenciaReactiva; 00022 float potenciaAparente; 00023 float energiaConsumida; 00024 float factorDePotencia; 00025 }; 00026 00027 estructuraMedidas medidas; 00028 00029 //struct Vectores{ 00030 // float vTensionA[muestras]; 00031 //float vTensionB[muestras]; 00032 // float vIntensidadA[muestras]; 00033 // float vIntensidadB[muestras]; 00034 //} 00035 //vectores; 00036 AnalogIn adc_in(A0); 00037 AnalogIn int_in(A1); 00038 AnalogIn cont_in(A3); 00039 //AnalogOut dac_out(A2); 00040 //AnalogOut int_out(A3); 00041 InterruptIn boton(USER_BUTTON); 00042 00043 Ticker tMuestrea; 00044 Ticker tVisualiza; 00045 void visualiza(); 00046 void procesado(int length, int16_t *entrada, int16_t *entrada2); 00047 void calcularDatos(int16_t *datosV, int16_t *datosI, int longitud, estructuraMedidas *medidas); 00048 void calcularRMS(int16_t *buffer, int longitud,eResultados *resul); 00049 int flag=0; 00050 int contador=0; 00051 int bufferActivo=0; 00052 00053 struct buffers { 00054 int16_t vA[muestras]; 00055 int16_t vB[muestras]; 00056 int16_t iA[muestras]; 00057 int16_t iB[muestras]; 00058 }; 00059 00060 00061 void muestrea(); 00062 00063 buffers bufferEntrada; 00064 buffers bufferSalida; 00065 00066 eResultados resultados; 00067 00068 int main() 00069 { 00070 00071 tMuestrea.attach_us(&muestrea, 100); 00072 tVisualiza.attach(&visualiza, 5); 00073 00074 while(1) { 00075 if (flag) { 00076 flag=0; 00077 if(bufferActivo==1) { 00078 procesado(muestras,(int16_t *)&bufferEntrada.vA,(int16_t *)&bufferEntrada.iA); 00079 } else { 00080 procesado(muestras,(int16_t *)&bufferEntrada.vB,(int16_t *)&bufferEntrada.iB); 00081 } 00082 00083 00084 } 00085 00086 00087 wait_us(1); 00088 } 00089 00090 } 00091 00092 void muestrea() 00093 { 00094 uint16_t dato=adc_in.read_u16(); 00095 uint16_t dato2=int_in.read_u16(); 00096 uint16_t cont=cont_in.read_u16(); 00097 00098 if (bufferActivo==0) { 00099 00100 bufferEntrada.vA[contador]=dato-cont; 00101 00102 bufferEntrada.iA[contador]=dato2-cont; 00103 00104 } 00105 00106 else { 00107 00108 bufferEntrada.vB[contador]=dato-cont; 00109 00110 bufferEntrada.iB[contador]=dato2-cont; 00111 00112 } 00113 00114 contador++; 00115 if(contador==muestras) { 00116 bufferActivo=!bufferActivo; 00117 contador=0; 00118 flag=1; 00119 } 00120 00121 } 00122 void procesado(int length, int16_t *entrada, int16_t *entrada2) 00123 { 00124 // for (int i=0; i<length; i++) { 00125 // salida[i]=entrada[i]; 00126 //} 00127 00128 // calcularRMS(entrada,length,&resultados); 00129 calcularDatos(entrada, entrada2, 100, &medidas); 00130 00131 00132 } 00133 void calcularRMS(int16_t *buffer, int longitud,eResultados *resul) 00134 { 00135 float cons=0.00005035400390625; 00136 float cons1=1.007080078125e-4; 00137 float cons2=cons*cons; 00138 00139 float res; 00140 float Vmax=0; 00141 float Vmin=65535; 00142 00143 uint64_t suma=0; 00144 00145 00146 00147 for (int i=0; i<longitud; i++) { 00148 00149 suma+=buffer[i]*buffer[i]; 00150 if (Vmax<buffer[i]) { 00151 Vmax=buffer[i]; 00152 } 00153 if (Vmin>buffer[i]) { 00154 Vmin=buffer[i]; 00155 } 00156 } 00157 00158 00159 res=cons1*sqrt(((float)suma)/longitud); 00160 resul->Vrms=res; 00161 resul->Vmax=Vmax*cons; 00162 resul->Vmin=Vmin*cons; 00163 } 00164 00165 void visualiza(){ 00166 00167 printf ("El valor RMS es %f\n",medidas.vrms); 00168 printf ("El valor irms es %f\n",medidas.irms); 00169 printf ("El valor energia consumida es %f\n",medidas.energiaConsumida); 00170 printf ("El valor factor de potencia es %f\n",medidas.factorDePotencia); 00171 printf ("El valor potencia Aparente es %f\n",medidas.potenciaAparente); 00172 printf ("El valor potencia Activa es %f\n",medidas.potenciaActiva); 00173 printf ("El valor potencia Reactiva es %f\n\n",medidas.potenciaReactiva); 00174 00175 00176 00177 00178 00179 } 00180 void calcularDatos(int16_t *datosV, int16_t *datosI, int longitud, estructuraMedidas *medidas) 00181 { 00182 float cons=1.007080078125e-4; 00183 float cons2=cons*cons; 00184 00185 int64_t sumaV=0; 00186 int64_t sumaI=0; 00187 int64_t sumaP=0; 00188 00189 00190 00191 float datoV; 00192 float datoI; 00193 float datoP; 00194 float datoS; 00195 float datoQ; 00196 00197 00198 for (int i=0; i<longitud; i++) { 00199 00200 sumaV+=datosV[i]*datosV[i]; 00201 sumaI+=datosI[i]*datosI[i]; 00202 sumaP+=datosV[i]*datosI[i]; 00203 } 00204 00205 datoV = cons*sqrt(((float)sumaV)/longitud); 00206 datoI = cons*sqrt(((float)sumaI)/longitud); 00207 datoP = cons2*((float)sumaP)/longitud; 00208 datoS=datoV*datoI; 00209 datoQ = sqrt((datoS*datoS)-(datoP*datoP)); 00210 00211 (*medidas).energiaConsumida = datoP/datoI; 00212 (*medidas).factorDePotencia = datoP/datoS; 00213 (*medidas).potenciaAparente = datoS; 00214 (*medidas).potenciaActiva = datoP; 00215 (*medidas).potenciaReactiva = datoQ; 00216 (*medidas).vrms = datoV; 00217 (*medidas).irms = datoI; 00218 00219 }
Generated on Wed Aug 10 2022 18:33:32 by
1.7.2