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