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