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.
plantilla_copy.cpp
- Committer:
- freind00
- Date:
- 2018-12-18
- Revision:
- 4:c9f7e9a96324
- Parent:
- 3:3620f948d5e0
- Child:
- 5:c638ff4bd841
File content as of revision 4:c9f7e9a96324:
#include "mbed.h" #include "math.h" #define constanteTension 1.4709e-06 #define constanteIntensidad 1.423595702690060e-09 #define vectormuestras 100 Serial pc(USBTX, USBRX); // tx, rx InterruptIn button(PC_13); AnalogIn (A0); AnalogIn (A1); AnalogIn (A5); //datos para la simulación 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}; 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}; //datos para la simulación 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}; int16_t vTensionA[vectormuestras]; int16_t vTensionB[vectormuestras]; int16_t iIntensidadA[vectormuestras]; int16_t iIntensidadB[vectormuestras]; int contador=0; int pulsador=0; int16_t medidaTension; int16_t medidaIntensidad; int16_t medidaOffset; int16_t medidaTensionSinOffset; int16_t medidaIntensidadSinOffset; int bufferActivo=0; int flag=0; int16_t measV=0; int16_t measI=0; int32_t producto=0; int64_t sumatorioV=0; int64_t sumatorioI=0; int64_t sumatorioPA=0; float VRMS=0; float IRMS=0; float P_activa=0; float P_reactiva=0; float P_aparente=0; float Consumo_Pact=0; float Consumo_Preact=0; float FP=0; //Para la simulacion uint16_t adcTension() { return SimulaADCTension[contador]; } uint16_t adcIntensidad() { return SimulaADCIntensidad[contador]; } //Para la simulacion uint16_t adcMedio() { return SimulaADCMedio[contador]; } //Captura de valores mediante muestreo void captura() //función muestreo { medidaTension=(int16_t)(adcTension()^0x8000); medidaIntensidad=(int16_t)(adcIntensidad()^0x8000); medidaOffset=(int16_t)(adcMedio()^0x8000); medidaTensionSinOffset=medidaTension-medidaOffset; medidaIntensidadSinOffset=medidaIntensidad-medidaOffset; if(bufferActivo) { vTensionA[contador] = medidaTensionSinOffset; vIntensidadA[contador] = medidaIntensidadSinOffset; } else { vTensionB[contador] = medidaTensionSinOffset; vIntensidadB[contador] = medidaIntensidadSinOffset; } contador++; if(contador==vectormuestras){ contador=0; bufferActivo=!bufferActivo; flag=1;//buffer lleno } } void calculos()//Cálculo de los valores { while(1) {//bucle para siempre if(flag) {//mira si el buffer esta lleno flag=0;//Borra la variable buffer lleno measV=0; measI=0; producto=0; sumatorioV=0; sumatorioI=0; sumatorioPA=0; for (int b=0; b<muestras; b++) {//VRMS if (!bufferActivo) { measV=vTensionA[b]; measI=iIntensidadA[b]; } else { measV=vTensionB[b]; measI=iIntensidadB[b]; } producto=measV*measV; sumatorioV+=producto;//calcula el valor VPP producto=measI*measI; sumatorioI+=producto; producto=measV*measI; sumatorioPA+=producto; } if(pulsador==0){ VRMS=sqrt(constanteTension*sumatorioV); } else if (pulsador ==1) { IRMS=sqrt(constanteIntensidad*sumatorioI); } else if (pulsador ==2) { P_activa=sqrt(constanteTension*constanteIntensidad)*sumatorioPA; } else if (pulsador ==3) { P_aparente=VRMS*IRMS; } else if (pulsador ==4) { P_reactiva=sqrt(P_aparente*P_aparente)-(P_aparente*P_aparente); } else if (pulsador ==5) { Consumo_Pact=Consumo_Pact+P_activa*20e-3/(3600*1000); } else if (pulsador ==6) { Consumo_Preact=Consumo_Preact+P_reactiva*20e-3/(3600*1000); } else if (pulsador ==7) { FP=P_activa/P_aparente; } } } //Visualización por pantalla void visualizacion()//función mostrar { if(pulsador==0){ printf("VRMS: %3.4f\n\r", VRMS); } else if pulsador ==1 { printf("IRMS: %3.4f\n\r", IRMS); } else if pulsador ==2 { printf("Pot. activa: %3.4f\n\r", P_activa); } else if pulsador ==3 { printf("Pot. reactiva: %3.4f\n\r", P_reactiva); } else if pulsador ==4 { printf("Pot. aparente: %3.4f\n\r", P_aparente); } else if pulsador ==5 { printf("Consumo Pot. A: %3.4f\n\r", Consumo_Pact); } else if pulsador ==6 { printf("Consumo Pot. R: %3.4f\n\r", Consumo_Preact); } else if pulsador ==7 { printf("Factor de potencia: %3.4f\n\r", FP); } } //Cambio de boton void cambio_boton() { pulsador++; if(pulsador>8) { pulsador=0; } } int main() { Ticker timerCaptura; Ticker timerVisualizacion; timerCaptura.attach_us(&captura,200);//Hace que la función muestreo se ejecute cada 200us //Hace que la función boton se ejecute cada vez que se pulse el botón timerVisualizacion.attach(&visualizacion,1.0);//Hace que la función mostrar se ejecute cada segundo //Llamar a la función de cálculos //Llama la función mostrar por pantalla medida (visualiza) button.rise(&cambio_boton); //Llama al funcion cambio de menú (cambio botón) }