Dependencies:   mbed TextLCD

Committer:
fernandoabreuro
Date:
Mon Feb 03 12:03:31 2020 +0000
Revision:
3:9d746f4fb569
Parent:
2:f50bb191b326
d

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jvicente 0:776a559bda2f 1 #include "mbed.h"
jvicente 0:776a559bda2f 2 #include "math.h"
jvicente 0:776a559bda2f 3 #include "TextLCD.h"
jvicente 0:776a559bda2f 4
jvicente 0:776a559bda2f 5 #define muestras 100
fernandoabreuro 3:9d746f4fb569 6 #define bufferLength 500
jvicente 0:776a559bda2f 7
jvicente 0:776a559bda2f 8 TextLCD lcd(D8, D9, D2, D3, D4, D5, TextLCD::LCD16x2); // rs, e, d4-d7
jvicente 0:776a559bda2f 9 Serial pc(USBTX, USBRX); // tx, rx
jvicente 0:776a559bda2f 10
fernandoabreuro 3:9d746f4fb569 11 Serial bt(PC_0, PC_1); // tx, rx
fernandoabreuro 3:9d746f4fb569 12
fernandoabreuro 3:9d746f4fb569 13 //lcd.cls();
fernandoabreuro 3:9d746f4fb569 14 //lcd.printf("Media: %3.4f\n", medidas.media);
fernandoabreuro 3:9d746f4fb569 15
jvicente 0:776a559bda2f 16 int contador=0;
fernandoabreuro 3:9d746f4fb569 17 int flag=0;
jvicente 0:776a559bda2f 18 int bufferActivo=0;
fernandoabreuro 3:9d746f4fb569 19 int mostrarDato=0;
fernandoabreuro 3:9d746f4fb569 20
fernandoabreuro 3:9d746f4fb569 21
jvicente 0:776a559bda2f 22 AnalogIn tension(A0);
jvicente 0:776a559bda2f 23 AnalogIn intensidad(A1);
fernandoabreuro 3:9d746f4fb569 24 AnalogIn adcMedio(A2);
fernandoabreuro 3:9d746f4fb569 25
fernandoabreuro 3:9d746f4fb569 26
fernandoabreuro 3:9d746f4fb569 27
fernandoabreuro 3:9d746f4fb569 28 char inputdata = 0;
fernandoabreuro 3:9d746f4fb569 29
fernandoabreuro 3:9d746f4fb569 30
jvicente 2:f50bb191b326 31 InterruptIn boton(USER_BUTTON);
jvicente 0:776a559bda2f 32
fernandoabreuro 3:9d746f4fb569 33 struct Vectores {
fernandoabreuro 3:9d746f4fb569 34 int16_t vTensionA[muestras];
fernandoabreuro 3:9d746f4fb569 35 int16_t vTensionB[muestras];
fernandoabreuro 3:9d746f4fb569 36 int16_t vIntensidadA[muestras];
fernandoabreuro 3:9d746f4fb569 37 int16_t vIntensidadB[muestras];
fernandoabreuro 3:9d746f4fb569 38 } vectores;
jvicente 0:776a559bda2f 39
fernandoabreuro 3:9d746f4fb569 40 struct Medidas {
jvicente 0:776a559bda2f 41 float Vrms;
jvicente 0:776a559bda2f 42 float Irms;
fernandoabreuro 3:9d746f4fb569 43 float potenciaActiva; //ok
fernandoabreuro 3:9d746f4fb569 44 float potenciaReactiva; //ok
fernandoabreuro 3:9d746f4fb569 45 float potenciaAparente; //ok
fernandoabreuro 3:9d746f4fb569 46 float potenciaActivaAC;
fernandoabreuro 3:9d746f4fb569 47 float potenciaReactivaAC;
fernandoabreuro 3:9d746f4fb569 48 float factorDePotencia; //ok
fernandoabreuro 3:9d746f4fb569 49 } medidas;
fernandoabreuro 3:9d746f4fb569 50
fernandoabreuro 3:9d746f4fb569 51
fernandoabreuro 3:9d746f4fb569 52 Ticker tcaptura;
fernandoabreuro 3:9d746f4fb569 53 Ticker tmostrar;
fernandoabreuro 3:9d746f4fb569 54 void captura();
fernandoabreuro 3:9d746f4fb569 55 void visualizacion();
fernandoabreuro 3:9d746f4fb569 56 //void visualizacion_blu();
fernandoabreuro 3:9d746f4fb569 57 void cambiar();
fernandoabreuro 3:9d746f4fb569 58
fernandoabreuro 3:9d746f4fb569 59 float calcularP(int16_t *datosV, int16_t *datosI, int longitud);
fernandoabreuro 3:9d746f4fb569 60 float calcularRMS(int16_t *datos, int longitud);
fernandoabreuro 3:9d746f4fb569 61 void calcular(int16_t *datosV, int16_t *datosI, int longitud);
fernandoabreuro 3:9d746f4fb569 62
fernandoabreuro 3:9d746f4fb569 63 int main()
fernandoabreuro 3:9d746f4fb569 64 {
fernandoabreuro 3:9d746f4fb569 65 bt.baud(9600);
fernandoabreuro 3:9d746f4fb569 66 Ticker timerCaptura;
fernandoabreuro 3:9d746f4fb569 67 Ticker timerVisualizacion;
fernandoabreuro 3:9d746f4fb569 68 //Ticker timerVisualizacion_blu;
fernandoabreuro 3:9d746f4fb569 69 timerCaptura.attach_us(&captura,400);
fernandoabreuro 3:9d746f4fb569 70 timerVisualizacion.attach(&visualizacion,1.0);
fernandoabreuro 3:9d746f4fb569 71 //timerVisualizacion_blu.attach(&visualizacion_blu,1.0);
fernandoabreuro 3:9d746f4fb569 72 boton.rise(&cambiar);
fernandoabreuro 3:9d746f4fb569 73 while(1) {
fernandoabreuro 3:9d746f4fb569 74 if(flag) {
fernandoabreuro 3:9d746f4fb569 75 if(bufferActivo) {
fernandoabreuro 3:9d746f4fb569 76 calcular(vectores.vTensionA,vectores.vIntensidadA,muestras);
fernandoabreuro 3:9d746f4fb569 77 } else {
fernandoabreuro 3:9d746f4fb569 78 calcular(vectores.vTensionB,vectores.vIntensidadB,muestras);
fernandoabreuro 3:9d746f4fb569 79 }
fernandoabreuro 3:9d746f4fb569 80 flag=0;
fernandoabreuro 3:9d746f4fb569 81 }
fernandoabreuro 3:9d746f4fb569 82 }
fernandoabreuro 3:9d746f4fb569 83 }
fernandoabreuro 3:9d746f4fb569 84
fernandoabreuro 3:9d746f4fb569 85
fernandoabreuro 3:9d746f4fb569 86 void captura()
fernandoabreuro 3:9d746f4fb569 87 {
fernandoabreuro 3:9d746f4fb569 88
fernandoabreuro 3:9d746f4fb569 89 int16_t medidaTension=(int16_t)(tension.read_u16()^0x8000);
fernandoabreuro 3:9d746f4fb569 90 int16_t medidaIntensidad=(int16_t)(intensidad.read_u16()^0x8000);
fernandoabreuro 3:9d746f4fb569 91 int16_t medidaOffset=(int16_t)(adcMedio.read_u16()^0x8000);
fernandoabreuro 3:9d746f4fb569 92 int16_t medidaTensionSinOffset=medidaTension-medidaOffset;
fernandoabreuro 3:9d746f4fb569 93 int16_t medidaIntensidadSinOffset=medidaIntensidad-medidaOffset;
fernandoabreuro 3:9d746f4fb569 94 //lectura señales
fernandoabreuro 3:9d746f4fb569 95
fernandoabreuro 3:9d746f4fb569 96 // printf("V = %.2f [V]",x);
fernandoabreuro 3:9d746f4fb569 97 // printf("I = %.2f [A]",y);
fernandoabreuro 3:9d746f4fb569 98 /*
fernandoabreuro 3:9d746f4fb569 99 float datotension = 1.11*(650.5382387*x-325.2691193);
fernandoabreuro 3:9d746f4fb569 100 float datointensidad = 1.61*(18.18*y-9.09);
fernandoabreuro 3:9d746f4fb569 101 */
fernandoabreuro 3:9d746f4fb569 102 //uint16_t dato=adc_in.read_u16();
fernandoabreuro 3:9d746f4fb569 103
fernandoabreuro 3:9d746f4fb569 104 if(bufferActivo) {
fernandoabreuro 3:9d746f4fb569 105 vectores.vTensionB[contador] = medidaTensionSinOffset;
fernandoabreuro 3:9d746f4fb569 106 vectores.vIntensidadB[contador] = medidaIntensidadSinOffset;
fernandoabreuro 3:9d746f4fb569 107 } else {
fernandoabreuro 3:9d746f4fb569 108 vectores.vTensionA[contador]=medidaTensionSinOffset;
fernandoabreuro 3:9d746f4fb569 109 vectores.vIntensidadA[contador]=medidaIntensidadSinOffset;
fernandoabreuro 3:9d746f4fb569 110 }
fernandoabreuro 3:9d746f4fb569 111
fernandoabreuro 3:9d746f4fb569 112 // dac_out.write_u16(dato);
fernandoabreuro 3:9d746f4fb569 113
fernandoabreuro 3:9d746f4fb569 114 contador++;
fernandoabreuro 3:9d746f4fb569 115
fernandoabreuro 3:9d746f4fb569 116 if(contador==muestras) {
fernandoabreuro 3:9d746f4fb569 117 flag = 1;
fernandoabreuro 3:9d746f4fb569 118 contador = 0;
fernandoabreuro 3:9d746f4fb569 119 if(bufferActivo) {
fernandoabreuro 3:9d746f4fb569 120 bufferActivo=0;
fernandoabreuro 3:9d746f4fb569 121 } else {
fernandoabreuro 3:9d746f4fb569 122 bufferActivo=1;
fernandoabreuro 3:9d746f4fb569 123 }
fernandoabreuro 3:9d746f4fb569 124
fernandoabreuro 3:9d746f4fb569 125 //bufferActivo=!bufferActivo;
fernandoabreuro 3:9d746f4fb569 126 }
fernandoabreuro 3:9d746f4fb569 127
fernandoabreuro 3:9d746f4fb569 128 }
fernandoabreuro 3:9d746f4fb569 129 /*
fernandoabreuro 3:9d746f4fb569 130 void visualizacion_blu()
fernandoabreuro 3:9d746f4fb569 131 {
fernandoabreuro 3:9d746f4fb569 132
fernandoabreuro 3:9d746f4fb569 133 //If (bt.available() > 0)
fernandoabreuro 3:9d746f4fb569 134 {
fernandoabreuro 3:9d746f4fb569 135 inputdata = bt.read();
fernandoabreuro 3:9d746f4fb569 136 if(inputdata == '0')
fernandoabreuro 3:9d746f4fb569 137 {
fernandoabreuro 3:9d746f4fb569 138 Serialbt.print("Vrms\n %.2f [V]",medidas.Vrms);
fernandoabreuro 3:9d746f4fb569 139 }
fernandoabreuro 3:9d746f4fb569 140
fernandoabreuro 3:9d746f4fb569 141 else if(inputdata == '1')
fernandoabreuro 3:9d746f4fb569 142 {
fernandoabreuro 3:9d746f4fb569 143 Serialbt.print("Irms\n %.2f [A]",medidas.Irms);
fernandoabreuro 3:9d746f4fb569 144 }
fernandoabreuro 3:9d746f4fb569 145 else if(inputdata == '2')
fernandoabreuro 3:9d746f4fb569 146 {
fernandoabreuro 3:9d746f4fb569 147 Serialbt.print("P\n %.2f [W]",medidas.potenciaActiva);
fernandoabreuro 3:9d746f4fb569 148 }
fernandoabreuro 3:9d746f4fb569 149 else if(inputdata == '3')
fernandoabreuro 3:9d746f4fb569 150 {
fernandoabreuro 3:9d746f4fb569 151 Serialbt.print("Q\n %.2f [VAr]",medidas.potenciaReactiva);
fernandoabreuro 3:9d746f4fb569 152 }
fernandoabreuro 3:9d746f4fb569 153 else if(inputdata == '4')
fernandoabreuro 3:9d746f4fb569 154 {
fernandoabreuro 3:9d746f4fb569 155 Serialbt.print("S\n %.2f [VA]",medidas.potenciaAparente);
fernandoabreuro 3:9d746f4fb569 156 }
fernandoabreuro 3:9d746f4fb569 157 else if(inputdata == '5')
fernandoabreuro 3:9d746f4fb569 158 {
fernandoabreuro 3:9d746f4fb569 159 Serialbt.print("Pac\n %.2f [W]",medidas.potenciaActivaAC);
fernandoabreuro 3:9d746f4fb569 160 }
fernandoabreuro 3:9d746f4fb569 161 else if(inputdata == '6')
fernandoabreuro 3:9d746f4fb569 162 {
fernandoabreuro 3:9d746f4fb569 163 Serialbt.print("Qac\n %.2f [W]",medidas.potenciaReactivaAC);
fernandoabreuro 3:9d746f4fb569 164 }
fernandoabreuro 3:9d746f4fb569 165 else if(inputdata == '7')
fernandoabreuro 3:9d746f4fb569 166 {
fernandoabreuro 3:9d746f4fb569 167 Serialbt.print("FdP\n %.8f",medidas.factorDePotencia);
fernandoabreuro 3:9d746f4fb569 168 }
fernandoabreuro 3:9d746f4fb569 169 }
fernandoabreuro 3:9d746f4fb569 170
fernandoabreuro 3:9d746f4fb569 171 }
fernandoabreuro 3:9d746f4fb569 172 */
jvicente 0:776a559bda2f 173
jvicente 0:776a559bda2f 174 void visualizacion()
jvicente 0:776a559bda2f 175 {
fernandoabreuro 3:9d746f4fb569 176 printf("Vrms = %.2f [V]\n",medidas.Vrms);
fernandoabreuro 3:9d746f4fb569 177 printf("Irms = %.2f [A]\n",medidas.Irms);
fernandoabreuro 3:9d746f4fb569 178 printf("P = %.2f [W]\n",medidas.potenciaActiva);
fernandoabreuro 3:9d746f4fb569 179 printf("Q = %.2f [VAr]\n",medidas.potenciaReactiva);
fernandoabreuro 3:9d746f4fb569 180 printf("S = %.2f [VA]\n",medidas.potenciaAparente);
fernandoabreuro 3:9d746f4fb569 181 printf("Pac = %.2f [W]\n",medidas.potenciaActivaAC);
fernandoabreuro 3:9d746f4fb569 182 printf("Qac = %.2f [W]\n",medidas.potenciaReactivaAC);
fernandoabreuro 3:9d746f4fb569 183 printf("FdP = %.2f\n",medidas.factorDePotencia);
fernandoabreuro 3:9d746f4fb569 184 printf("*******************\n");
fernandoabreuro 3:9d746f4fb569 185
fernandoabreuro 3:9d746f4fb569 186 lcd.cls();
fernandoabreuro 3:9d746f4fb569 187 switch (mostrarDato) {
fernandoabreuro 3:9d746f4fb569 188 case 0:
fernandoabreuro 3:9d746f4fb569 189 lcd.printf("Vrms\n %.2f [V]",medidas.Vrms);
fernandoabreuro 3:9d746f4fb569 190 break;
fernandoabreuro 3:9d746f4fb569 191 case 1:
fernandoabreuro 3:9d746f4fb569 192 lcd.printf("Irms\n %.2f [A]",medidas.Irms);
fernandoabreuro 3:9d746f4fb569 193 break;
fernandoabreuro 3:9d746f4fb569 194 case 2:
fernandoabreuro 3:9d746f4fb569 195 lcd.printf("P\n %.2f [W]",medidas.potenciaActiva);
fernandoabreuro 3:9d746f4fb569 196 break;
fernandoabreuro 3:9d746f4fb569 197 case 3:
fernandoabreuro 3:9d746f4fb569 198 lcd.printf("Q\n %.2f [VAr]",medidas.potenciaReactiva);
fernandoabreuro 3:9d746f4fb569 199 break;
fernandoabreuro 3:9d746f4fb569 200 case 4:
fernandoabreuro 3:9d746f4fb569 201 lcd.printf("S\n %.2f [VA]",medidas.potenciaAparente);
fernandoabreuro 3:9d746f4fb569 202 break;
fernandoabreuro 3:9d746f4fb569 203 case 5:
fernandoabreuro 3:9d746f4fb569 204 lcd.printf("Pac\n %.2f [W]",medidas.potenciaActivaAC);
fernandoabreuro 3:9d746f4fb569 205 break;
fernandoabreuro 3:9d746f4fb569 206 case 6:
fernandoabreuro 3:9d746f4fb569 207 lcd.printf("Qac\n %.2f [W]",medidas.potenciaReactivaAC);
fernandoabreuro 3:9d746f4fb569 208 break;
fernandoabreuro 3:9d746f4fb569 209 case 7:
fernandoabreuro 3:9d746f4fb569 210 lcd.printf("FdP\n %.8f",medidas.factorDePotencia);
fernandoabreuro 3:9d746f4fb569 211 break;
fernandoabreuro 3:9d746f4fb569 212
fernandoabreuro 3:9d746f4fb569 213 }
fernandoabreuro 3:9d746f4fb569 214 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",
fernandoabreuro 3:9d746f4fb569 215 medidas.Vrms,medidas.Irms,medidas.potenciaActiva,medidas.potenciaReactiva,medidas.potenciaAparente,medidas.potenciaActivaAC,
fernandoabreuro 3:9d746f4fb569 216 medidas.potenciaReactivaAC,medidas.factorDePotencia);
fernandoabreuro 3:9d746f4fb569 217 //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);
fernandoabreuro 3:9d746f4fb569 218
jvicente 0:776a559bda2f 219 }
jvicente 0:776a559bda2f 220
jvicente 2:f50bb191b326 221 void cambiar()
jvicente 2:f50bb191b326 222 {
fernandoabreuro 3:9d746f4fb569 223 mostrarDato++;
fernandoabreuro 3:9d746f4fb569 224 if (mostrarDato>7) {
fernandoabreuro 3:9d746f4fb569 225 mostrarDato=0;
fernandoabreuro 3:9d746f4fb569 226 }
jvicente 2:f50bb191b326 227 }
jvicente 0:776a559bda2f 228
jvicente 0:776a559bda2f 229 int eBoton=0;
jvicente 0:776a559bda2f 230
fernandoabreuro 3:9d746f4fb569 231 void calcular(int16_t *datosV, int16_t *datosI, int longitud)
jvicente 0:776a559bda2f 232 {
fernandoabreuro 3:9d746f4fb569 233 //multiplicar la constante por vrms
fernandoabreuro 3:9d746f4fb569 234
fernandoabreuro 3:9d746f4fb569 235 medidas.Vrms = calcularRMS(datosV,longitud)*0,0119968263348874;
fernandoabreuro 3:9d746f4fb569 236 medidas.Irms = calcularRMS(datosI,longitud)*0.000558209361279455;
fernandoabreuro 3:9d746f4fb569 237 medidas.potenciaActiva = calcularP(datosV,datosI,longitud)*0.000008490055907814898;
fernandoabreuro 3:9d746f4fb569 238 medidas.potenciaAparente = medidas.Vrms*medidas.Irms;
fernandoabreuro 3:9d746f4fb569 239 medidas.potenciaReactiva = sqrt(medidas.potenciaAparente*medidas.potenciaAparente-medidas.potenciaActiva*medidas.potenciaActiva);
fernandoabreuro 3:9d746f4fb569 240 medidas.potenciaActivaAC += medidas.potenciaActiva*0.2/3600;//*0.2/3600; //0.000000277777
fernandoabreuro 3:9d746f4fb569 241 medidas.potenciaReactivaAC += medidas.potenciaReactiva*0.2/3600; //0.000000277777;
fernandoabreuro 3:9d746f4fb569 242 medidas.factorDePotencia = medidas.potenciaReactiva/medidas.potenciaAparente;
jvicente 0:776a559bda2f 243 }
jvicente 0:776a559bda2f 244
fernandoabreuro 3:9d746f4fb569 245 float calcularRMS(int16_t *datos, int longitud)
jvicente 0:776a559bda2f 246 {
fernandoabreuro 3:9d746f4fb569 247 int64_t acumulador=0;
fernandoabreuro 3:9d746f4fb569 248 int32_t producto;
fernandoabreuro 3:9d746f4fb569 249 int i;
fernandoabreuro 3:9d746f4fb569 250
fernandoabreuro 3:9d746f4fb569 251 for(i=0; i<longitud; i++) {
fernandoabreuro 3:9d746f4fb569 252 producto=datos[i]*datos[i];
fernandoabreuro 3:9d746f4fb569 253 acumulador += producto;
jvicente 0:776a559bda2f 254 }
fernandoabreuro 3:9d746f4fb569 255 float valor = acumulador/longitud ;
fernandoabreuro 3:9d746f4fb569 256 return sqrt(valor);
jvicente 0:776a559bda2f 257 }
fernandoabreuro 3:9d746f4fb569 258
fernandoabreuro 3:9d746f4fb569 259
fernandoabreuro 3:9d746f4fb569 260 float calcularP(int16_t *datosV, int16_t *datosI, int longitud)
fernandoabreuro 3:9d746f4fb569 261 {
fernandoabreuro 3:9d746f4fb569 262 int64_t acumulador=0;
fernandoabreuro 3:9d746f4fb569 263 int32_t producto;
fernandoabreuro 3:9d746f4fb569 264 int i;
fernandoabreuro 3:9d746f4fb569 265
fernandoabreuro 3:9d746f4fb569 266 for(i=0; i<longitud; i++) {
fernandoabreuro 3:9d746f4fb569 267 producto=datosV[i]*datosI[i];
fernandoabreuro 3:9d746f4fb569 268 acumulador += producto;
fernandoabreuro 3:9d746f4fb569 269 }
fernandoabreuro 3:9d746f4fb569 270 float valor = acumulador/longitud ;
fernandoabreuro 3:9d746f4fb569 271 return valor;
fernandoabreuro 3:9d746f4fb569 272 }
fernandoabreuro 3:9d746f4fb569 273
fernandoabreuro 3:9d746f4fb569 274