El_clan_zoncillo / Mbed 2 deprecated Proyecto_final

Dependencies:   mbed TextLCD

Committer:
freind00
Date:
Tue Dec 18 08:18:40 2018 +0000
Revision:
4:c9f7e9a96324
Parent:
3:3620f948d5e0
Child:
5:c638ff4bd841
asd

Who changed what in which revision?

UserRevisionLine numberNew contents of line
freind00 3:3620f948d5e0 1 #include "mbed.h"
freind00 3:3620f948d5e0 2 #include "math.h"
freind00 3:3620f948d5e0 3 #define constanteTension 1.4709e-06
freind00 3:3620f948d5e0 4 #define constanteIntensidad 1.423595702690060e-09
freind00 4:c9f7e9a96324 5 #define vectormuestras 100
freind00 3:3620f948d5e0 6
freind00 3:3620f948d5e0 7 Serial pc(USBTX, USBRX); // tx, rx
freind00 3:3620f948d5e0 8
freind00 4:c9f7e9a96324 9 InterruptIn button(PC_13);
freind00 4:c9f7e9a96324 10 AnalogIn (A0);
freind00 4:c9f7e9a96324 11 AnalogIn (A1);
freind00 4:c9f7e9a96324 12 AnalogIn (A5);
freind00 3:3620f948d5e0 13
freind00 3:3620f948d5e0 14 //datos para la simulación
freind00 3:3620f948d5e0 15 uint16_t SimulaADCTension[vectormuestras]={60202,60330,58625,59923,58998,57466,57255,57119,57170,56327,53777,54359,53219,51091,50453,47815,46978,46509,44763,43549,41361,38513,38484,36990,34806,33279,31567,29193,28053,25447,24892,21968,20909,18951,17602,17651,16065,14052,14118,11186,10956, 9896, 9801, 9096, 7219, 7250, 6692, 6723, 6585, 6516, 5513, 6368, 6477, 5763, 6043, 7267, 8753, 8192, 9443, 9583,11577,11624,13236,14810,16455,17921,18496,19134,20656,22417,25159,25612,28368,28898,31937,32470,33848,35633,38022,39382,40758,43294,44352,45782,47961,48101,50367,51624,52074,53559,53615,54518,56322,57580,58557,57530,58872,59042,58397,59201};
freind00 3:3620f948d5e0 16 uint16_t SimulaADCIntensidad[vectormuestras]={50233,51231,50075,49752,48077,47954,47431,47039,45074,43363,42265,42317,41528,40167,38300,38291,36222,35848,32856,31874,31756,30792,29301,27121,25643,25859,24596,22473,21324,20488,20525,19587,18219,17412,16095,16230,15805,14552,14084,13718,13018,13552,13830,13742,13402,12494,13483,12590,12865,13365,13717,15102,14670,16809,17329,18512,18492,19710,21125,21425,21959,24420,23675,25403,27867,27863,28974,29835,32658,32356,33992,36355,36794,38237,39365,40761,40570,42662,42741,45341,45347,47276,46952,48428,49884,48802,49433,49915,51705,51945,51311,52919,52741,51751,51769,51843,53002,51405,51402,51047};
freind00 3:3620f948d5e0 17
freind00 3:3620f948d5e0 18 //datos para la simulación
freind00 3:3620f948d5e0 19 uint16_t SimulaADCMedio[muestras]={33393,33574,32027,33589,33031,31969,32328,32861,33677,33691,32088,33703,33676,32739,33364,32057,32613,33594,33348,33681,33077,31846,33461,33630,33123,33280,33251,32554,33077,32115,33177,31838,32325,31867,31968,33410,33155,32405,33662,31843,32646,32533,33295,33354,32146,32748,32660,33059,33184,33274,32323,33125,33076,32098,32011,32765,33681,32451,32937,32220,33267,32282,32780,33163,33544,33680,32862,32050,32072,32286,33445,32280,33392,32259,33620,32470,32165,32274,32998,32715,32473,33425,32937,32867,33597,32343,33279,33272,32531,32903,31926,31882,32829,33322,33630,32033,32905,32707,31799,32445};
freind00 3:3620f948d5e0 20
freind00 3:3620f948d5e0 21 int16_t vTensionA[vectormuestras];
freind00 3:3620f948d5e0 22 int16_t vTensionB[vectormuestras];
freind00 3:3620f948d5e0 23
freind00 3:3620f948d5e0 24 int16_t iIntensidadA[vectormuestras];
freind00 3:3620f948d5e0 25 int16_t iIntensidadB[vectormuestras];
freind00 3:3620f948d5e0 26
freind00 3:3620f948d5e0 27 int contador=0;
freind00 3:3620f948d5e0 28
freind00 3:3620f948d5e0 29 int pulsador=0;
freind00 3:3620f948d5e0 30
freind00 3:3620f948d5e0 31 int16_t medidaTension;
freind00 3:3620f948d5e0 32 int16_t medidaIntensidad;
freind00 3:3620f948d5e0 33 int16_t medidaOffset;
freind00 3:3620f948d5e0 34 int16_t medidaTensionSinOffset;
freind00 3:3620f948d5e0 35 int16_t medidaIntensidadSinOffset;
freind00 3:3620f948d5e0 36 int bufferActivo=0;
freind00 3:3620f948d5e0 37 int flag=0;
freind00 3:3620f948d5e0 38 int16_t measV=0;
freind00 3:3620f948d5e0 39 int16_t measI=0;
freind00 3:3620f948d5e0 40 int32_t producto=0;
freind00 3:3620f948d5e0 41 int64_t sumatorioV=0;
freind00 3:3620f948d5e0 42 int64_t sumatorioI=0;
freind00 3:3620f948d5e0 43 int64_t sumatorioPA=0;
freind00 3:3620f948d5e0 44
freind00 3:3620f948d5e0 45 float VRMS=0;
freind00 3:3620f948d5e0 46 float IRMS=0;
freind00 3:3620f948d5e0 47 float P_activa=0;
freind00 3:3620f948d5e0 48 float P_reactiva=0;
freind00 3:3620f948d5e0 49 float P_aparente=0;
freind00 3:3620f948d5e0 50 float Consumo_Pact=0;
freind00 3:3620f948d5e0 51 float Consumo_Preact=0;
freind00 3:3620f948d5e0 52 float FP=0;
freind00 3:3620f948d5e0 53
freind00 3:3620f948d5e0 54
freind00 3:3620f948d5e0 55 //Para la simulacion
freind00 3:3620f948d5e0 56 uint16_t adcTension()
freind00 3:3620f948d5e0 57 {
freind00 3:3620f948d5e0 58 return SimulaADCTension[contador];
freind00 3:3620f948d5e0 59 }
freind00 3:3620f948d5e0 60
freind00 3:3620f948d5e0 61 uint16_t adcIntensidad()
freind00 3:3620f948d5e0 62 {
freind00 3:3620f948d5e0 63 return SimulaADCIntensidad[contador];
freind00 3:3620f948d5e0 64 }
freind00 3:3620f948d5e0 65
freind00 3:3620f948d5e0 66 //Para la simulacion
freind00 3:3620f948d5e0 67 uint16_t adcMedio()
freind00 3:3620f948d5e0 68 {
freind00 3:3620f948d5e0 69 return SimulaADCMedio[contador];
freind00 3:3620f948d5e0 70 }
freind00 3:3620f948d5e0 71
freind00 3:3620f948d5e0 72 //Captura de valores mediante muestreo
freind00 3:3620f948d5e0 73 void captura() //función muestreo
freind00 3:3620f948d5e0 74 {
freind00 3:3620f948d5e0 75 medidaTension=(int16_t)(adcTension()^0x8000);
freind00 3:3620f948d5e0 76 medidaIntensidad=(int16_t)(adcIntensidad()^0x8000);
freind00 3:3620f948d5e0 77 medidaOffset=(int16_t)(adcMedio()^0x8000);
freind00 3:3620f948d5e0 78 medidaTensionSinOffset=medidaTension-medidaOffset;
freind00 3:3620f948d5e0 79 medidaIntensidadSinOffset=medidaIntensidad-medidaOffset;
freind00 3:3620f948d5e0 80
freind00 3:3620f948d5e0 81 if(bufferActivo) {
freind00 3:3620f948d5e0 82 vTensionA[contador] = medidaTensionSinOffset;
freind00 3:3620f948d5e0 83 vIntensidadA[contador] = medidaIntensidadSinOffset;
freind00 3:3620f948d5e0 84 } else {
freind00 3:3620f948d5e0 85 vTensionB[contador] = medidaTensionSinOffset;
freind00 3:3620f948d5e0 86 vIntensidadB[contador] = medidaIntensidadSinOffset;
freind00 3:3620f948d5e0 87 }
freind00 3:3620f948d5e0 88
freind00 3:3620f948d5e0 89 contador++;
freind00 3:3620f948d5e0 90 if(contador==vectormuestras){
freind00 3:3620f948d5e0 91 contador=0;
freind00 3:3620f948d5e0 92 bufferActivo=!bufferActivo;
freind00 3:3620f948d5e0 93 flag=1;//buffer lleno
freind00 3:3620f948d5e0 94 }
freind00 3:3620f948d5e0 95 }
freind00 3:3620f948d5e0 96
freind00 3:3620f948d5e0 97 void calculos()//Cálculo de los valores
freind00 3:3620f948d5e0 98 {
freind00 3:3620f948d5e0 99 while(1) {//bucle para siempre
freind00 3:3620f948d5e0 100 if(flag) {//mira si el buffer esta lleno
freind00 3:3620f948d5e0 101 flag=0;//Borra la variable buffer lleno
freind00 3:3620f948d5e0 102 measV=0;
freind00 3:3620f948d5e0 103 measI=0;
freind00 3:3620f948d5e0 104 producto=0;
freind00 3:3620f948d5e0 105 sumatorioV=0;
freind00 3:3620f948d5e0 106 sumatorioI=0;
freind00 3:3620f948d5e0 107 sumatorioPA=0;
freind00 3:3620f948d5e0 108
freind00 3:3620f948d5e0 109 for (int b=0; b<muestras; b++) {//VRMS
freind00 3:3620f948d5e0 110 if (!bufferActivo) {
freind00 3:3620f948d5e0 111 measV=vTensionA[b];
freind00 3:3620f948d5e0 112 measI=iIntensidadA[b];
freind00 3:3620f948d5e0 113 } else {
freind00 3:3620f948d5e0 114 measV=vTensionB[b];
freind00 3:3620f948d5e0 115 measI=iIntensidadB[b];
freind00 3:3620f948d5e0 116 }
freind00 3:3620f948d5e0 117 producto=measV*measV;
freind00 3:3620f948d5e0 118 sumatorioV+=producto;//calcula el valor VPP
freind00 3:3620f948d5e0 119 producto=measI*measI;
freind00 3:3620f948d5e0 120 sumatorioI+=producto;
freind00 3:3620f948d5e0 121 producto=measV*measI;
freind00 3:3620f948d5e0 122 sumatorioPA+=producto;
freind00 3:3620f948d5e0 123 }
freind00 3:3620f948d5e0 124
freind00 3:3620f948d5e0 125 if(pulsador==0){
freind00 3:3620f948d5e0 126 VRMS=sqrt(constanteTension*sumatorioV);
freind00 3:3620f948d5e0 127 }
freind00 3:3620f948d5e0 128
freind00 3:3620f948d5e0 129 else if (pulsador ==1) {
freind00 3:3620f948d5e0 130 IRMS=sqrt(constanteIntensidad*sumatorioI);
freind00 3:3620f948d5e0 131 }
freind00 3:3620f948d5e0 132
freind00 3:3620f948d5e0 133 else if (pulsador ==2) {
freind00 3:3620f948d5e0 134 P_activa=sqrt(constanteTension*constanteIntensidad)*sumatorioPA;
freind00 3:3620f948d5e0 135 }
freind00 3:3620f948d5e0 136
freind00 3:3620f948d5e0 137 else if (pulsador ==3) {
freind00 3:3620f948d5e0 138 P_aparente=VRMS*IRMS;
freind00 3:3620f948d5e0 139 }
freind00 3:3620f948d5e0 140
freind00 3:3620f948d5e0 141 else if (pulsador ==4) {
freind00 3:3620f948d5e0 142 P_reactiva=sqrt(P_aparente*P_aparente)-(P_aparente*P_aparente);
freind00 3:3620f948d5e0 143 }
freind00 3:3620f948d5e0 144
freind00 3:3620f948d5e0 145 else if (pulsador ==5) {
freind00 3:3620f948d5e0 146 Consumo_Pact=Consumo_Pact+P_activa*20e-3/(3600*1000);
freind00 3:3620f948d5e0 147 }
freind00 3:3620f948d5e0 148
freind00 3:3620f948d5e0 149 else if (pulsador ==6) {
freind00 3:3620f948d5e0 150 Consumo_Preact=Consumo_Preact+P_reactiva*20e-3/(3600*1000);
freind00 3:3620f948d5e0 151 }
freind00 3:3620f948d5e0 152
freind00 3:3620f948d5e0 153 else if (pulsador ==7) {
freind00 3:3620f948d5e0 154 FP=P_activa/P_aparente;
freind00 3:3620f948d5e0 155 }
freind00 3:3620f948d5e0 156 }
freind00 3:3620f948d5e0 157 }
freind00 3:3620f948d5e0 158
freind00 4:c9f7e9a96324 159 //Visualización por pantalla
freind00 4:c9f7e9a96324 160 void visualizacion()//función mostrar
freind00 4:c9f7e9a96324 161 {
freind00 4:c9f7e9a96324 162 if(pulsador==0){
freind00 4:c9f7e9a96324 163 printf("VRMS: %3.4f\n\r", VRMS);
freind00 4:c9f7e9a96324 164 }
freind00 4:c9f7e9a96324 165
freind00 4:c9f7e9a96324 166 else if pulsador ==1 {
freind00 4:c9f7e9a96324 167 printf("IRMS: %3.4f\n\r", IRMS);
freind00 4:c9f7e9a96324 168 }
freind00 4:c9f7e9a96324 169
freind00 4:c9f7e9a96324 170 else if pulsador ==2 {
freind00 4:c9f7e9a96324 171 printf("Pot. activa: %3.4f\n\r", P_activa);
freind00 4:c9f7e9a96324 172 }
freind00 4:c9f7e9a96324 173
freind00 4:c9f7e9a96324 174 else if pulsador ==3 {
freind00 4:c9f7e9a96324 175 printf("Pot. reactiva: %3.4f\n\r", P_reactiva);
freind00 4:c9f7e9a96324 176 }
freind00 4:c9f7e9a96324 177
freind00 4:c9f7e9a96324 178 else if pulsador ==4 {
freind00 4:c9f7e9a96324 179 printf("Pot. aparente: %3.4f\n\r", P_aparente);
freind00 4:c9f7e9a96324 180 }
freind00 4:c9f7e9a96324 181
freind00 4:c9f7e9a96324 182 else if pulsador ==5 {
freind00 4:c9f7e9a96324 183 printf("Consumo Pot. A: %3.4f\n\r", Consumo_Pact);
freind00 4:c9f7e9a96324 184 }
freind00 4:c9f7e9a96324 185
freind00 4:c9f7e9a96324 186 else if pulsador ==6 {
freind00 4:c9f7e9a96324 187 printf("Consumo Pot. R: %3.4f\n\r", Consumo_Preact);
freind00 4:c9f7e9a96324 188 }
freind00 4:c9f7e9a96324 189
freind00 4:c9f7e9a96324 190 else if pulsador ==7 {
freind00 4:c9f7e9a96324 191 printf("Factor de potencia: %3.4f\n\r", FP);
freind00 4:c9f7e9a96324 192 }
freind00 4:c9f7e9a96324 193
freind00 4:c9f7e9a96324 194 }
freind00 4:c9f7e9a96324 195
freind00 4:c9f7e9a96324 196 //Cambio de boton
freind00 4:c9f7e9a96324 197 void cambio_boton()
freind00 4:c9f7e9a96324 198 {
freind00 4:c9f7e9a96324 199 pulsador++;
freind00 4:c9f7e9a96324 200 if(pulsador>8) {
freind00 4:c9f7e9a96324 201 pulsador=0;
freind00 4:c9f7e9a96324 202 }
freind00 4:c9f7e9a96324 203 }
freind00 3:3620f948d5e0 204
freind00 3:3620f948d5e0 205 int main()
freind00 3:3620f948d5e0 206 {
freind00 3:3620f948d5e0 207 Ticker timerCaptura;
freind00 3:3620f948d5e0 208 Ticker timerVisualizacion;
freind00 3:3620f948d5e0 209 timerCaptura.attach_us(&captura,200);//Hace que la función muestreo se ejecute cada 200us
freind00 3:3620f948d5e0 210 //Hace que la función boton se ejecute cada vez que se pulse el botón
freind00 3:3620f948d5e0 211 timerVisualizacion.attach(&visualizacion,1.0);//Hace que la función mostrar se ejecute cada segundo
freind00 3:3620f948d5e0 212 //Llamar a la función de cálculos
freind00 4:c9f7e9a96324 213 //Llama la función mostrar por pantalla medida (visualiza)
freind00 3:3620f948d5e0 214 button.rise(&cambio_boton); //Llama al funcion cambio de menú (cambio botón)
freind00 3:3620f948d5e0 215
freind00 3:3620f948d5e0 216 }