{"id":595,"date":"2010-10-17T20:00:25","date_gmt":"2010-10-17T19:00:25","guid":{"rendered":"http:\/\/www.zigbe.net\/?p=595"},"modified":"2010-10-17T20:00:25","modified_gmt":"2010-10-17T19:00:25","slug":"midiendo-la-energia-19-el-filtro-pasa-bajos","status":"publish","type":"post","link":"https:\/\/blog.whatsbee.net\/?p=595","title":{"rendered":"Midiendo la energ\u00eda: 19, el filtro pasa bajos y primera versi\u00f3n del firmware."},"content":{"rendered":"<p>En el cap\u00edtulo anterior&#8230;&#8230;<\/p>\n<p>Si recordais hab\u00edamos obtenido un medidor que comprarado con uno comercial nos daba valores bastante parecidos (del orden de un 1%), pero que ten\u00eda un problema en\u00a0el valor devuelto sin carga\u00a0provocado por el ruido el\u00e9ctrico del sensor.<\/p>\n<p>Dec\u00eda que el problema era est\u00e9tico porque por el tipo de producto no se van a medir potencias de 3 \u00f3 4 W, pero cuando no est\u00e1s utilizando una salida esperas que las lecturas de consumo sean cero y no tengan un comportamiento err\u00e1tico. De hecho creo que es mejor que para unos pocos Watios marque cero que no que por el ruido vaya dando lecturas de potencias negarivas ni cosas por el estilo.<\/p>\n<p>Los sensores de corriente que hemos utilizado tienen dos patillas a las que se les pone un condensador de filtro (FILTER en el esquema), internamente antes del \u00faltimo amplificador operacional del chip se inserta este condensador, eso permite poner el filtro con un condensador m\u00e1s peque\u00f1o y sin utilizar la resistencia en serie, porque utilizaremos la resistencia de salida de un operacional. A\u00a0continuaci\u00f3n el esquema interno del sensor:<\/p>\n<div class=\"mceTemp mceIEcenter\" style=\"text-align: center;\">\n<dl id=\"attachment_596\" class=\"wp-caption aligncenter\" style=\"text-align: center; width: 510px;\">\n<dt class=\"wp-caption-dt\"><a href=\"http:\/\/blog.whatsbee.net\/wp-content\/uploads\/2010\/10\/AllegroInterno.jpg\"><img loading=\"lazy\" class=\"size-full wp-image-596\" title=\"AllegroInterno\" src=\"http:\/\/blog.whatsbee.net\/wp-content\/uploads\/2010\/10\/AllegroInterno.jpg\" alt=\"\" width=\"500\" height=\"275\" srcset=\"https:\/\/blog.whatsbee.net\/wp-content\/uploads\/2010\/10\/AllegroInterno.jpg 500w, https:\/\/blog.whatsbee.net\/wp-content\/uploads\/2010\/10\/AllegroInterno-300x165.jpg 300w\" sizes=\"(max-width: 500px) 100vw, 500px\" \/><\/a><\/dt>\n<dd class=\"wp-caption-dd\">Esquema interno del sensor de corriente<\/dd>\n<\/dl>\n<\/div>\n<div class=\"mceTemp mceIEcenter\" style=\"text-align: left;\">En el esquema original el condensador de filtro que hab\u00edamos puesto era de 1 nF, viendo el ruido es claramente insuficiente, el valor \u00f3ptimo que hemos encontrado es de 100nF, a\u00fan as\u00ed seguimos teniendo un cierto nivel de ruido que nos provoca el problema mencionado (probablemente el ruido no salga ya del sensor, sino que lo adquiramos por el camino) .<\/div>\n<div class=\"mceTemp mceIEcenter\" style=\"text-align: left;\">\u00a0<\/div>\n<div class=\"mceTemp mceIEcenter\" style=\"text-align: left;\">La opci\u00f3n que nos queda es a\u00f1adir un filtro pasa bajos a la salida del sensor. Un filtro pasa bajos es un filtro que, como indica su nombre, permite el paso a las frecuencias m\u00e1s bajas y lo atenua para las m\u00e1s altas, la corriente que queremos medir es de la red el\u00e9ctrica, por lo tanto de 50Hz, el ruido es de una frecuencia mucho mayor.<\/div>\n<div class=\"mceTemp mceIEcenter\" style=\"text-align: left;\">\u00a0<\/div>\n<div class=\"mceTemp mceIEcenter\" style=\"text-align: left;\">Hay dos formas de hacer un filtro pasa bajo pasivo, una inductancia en serie y una resistencia en paralelo o una resistencia en serie y un condensador en paralelo. Normalmente se utiliza la segunda porque loc condensadores suelen tener un comportamiento mucho m\u00e1s puro, son m\u00e1s econn\u00f3micos, m\u00e1s f\u00e1ciles de conseguir, etc.<\/div>\n<div class=\"mceTemp mceIEcenter\" style=\"text-align: left;\">\u00a0<\/div>\n<div class=\"mceTemp mceIEcenter\" style=\"text-align: left;\">He hecho una prueba con un filtro pasa bajo con una resietencia de 200 ohms y un condensador electrol\u00edtico de 10 uF y me elimina el ruido, pero me atenua demasiado la se\u00f1al, al final lo dejo sin el filtro pasa bajo anal\u00f3gico y decido implementar un filtrop pasa bajo en el firmware.<\/div>\n<div class=\"mceTemp mceIEcenter\" style=\"text-align: left;\">\u00a0<\/div>\n<div class=\"mceTemp mceIEcenter\" style=\"text-align: left;\">Lo de implementar el filtro pasa bajos en el firmware suena sofisticado, pero no lo es, imaginaros que tenemos unas muestras de una tensi\u00f3n con una frecuencia de 50 Hz y encima el ruido, con una frecuencia mucho mayor y una intensidad mucho menor. Simplemente promediando cada valor con el anterior, con los dos anteriores, con los tres anteriores, etc. eliminamos el ruido, que es de una frecuencia mucho m\u00e1s alta. Podeis hacer la prueba con un Excel de varios valores que cuando haceis un gr\u00e1fico os da muchos picos, es como a\u00f1adirle una l\u00ednea de tendencia de \u00abmedia m\u00f3vil\u00bb, en funci\u00f3n del \u00f3rden del filtro vereis como os va suavizando los picos.<\/div>\n<div class=\"mceTemp mceIEcenter\" style=\"text-align: left;\">\u00a0He implementado el filtro el el firmware, pero tampoco me acaba de gustar la soluci\u00f3n, sigue habiendo un poco de ruido, me\u00a0adelanta un poco la se\u00f1al (porque promedio con valores anteriores porque los posteriores no existen)\u00a0y me sigue afectando en el momento en el que no hay consumo con las lecturas err\u00e1ticas (aunque mucho menos).<\/div>\n<div class=\"mceTemp mceIEcenter\" style=\"text-align: left;\">\u00a0<\/div>\n<div class=\"mceTemp mceIEcenter\" style=\"text-align: left;\">Analizando el problema\u00a0de una forma intuitiva,\u00a0veo que en la entrada anal\u00f3gica cuando no hay consumo el valor central deber\u00eda de ser de 607 y el problema es que me oscila entre 605 y 609, este cambio m\u00ednimo en 3000 muestras se suma. Como en la potencia se suman los cuadrados (siempre positivos) y en la potencia aparente no, provoca\u00a0una desviaci\u00f3n entre ambas. Asi que finalmente mi implementaci\u00f3n del filtro es un \u00abif\u00bb, en el firmware: le pongo que si el valor est\u00e1 entre 605 y 609 que considere siempre que es un 607.\u00a0 Soy consciente de que esto induce un peque\u00f1o error en los c\u00e1lculos, pero ahora el comportamiendo sin carga es absolutamente estable.<\/div>\n<div class=\"mceTemp mceIEcenter\" style=\"text-align: left;\">\u00a0<\/div>\n<div class=\"mceTemp mceIEcenter\" style=\"text-align: left;\">Adicionalmente redondeo los valores a un decimal,\u00a0resto 4VA (de forma completamente emp\u00edrica al resultado de la potencia aparente) y pongo algunos filtros adicionales al resultado: si la potencia es menor que 3W que devuelva cero, lo mismo con la potencia aparente. Todo esto son \u00abchapucillas\u00bb que me inducen un peque\u00f1o error en las condiciones de carga m\u00e1s bajas, pero que me estabilizan las lecturas.<\/div>\n<div class=\"mceTemp mceIEcenter\" style=\"text-align: left;\">\u00a0<\/div>\n<div class=\"mceTemp mceIEcenter\" style=\"text-align: left;\">En la primera versi\u00f3n del firmware me limito a mostrar los valores por el puerto serie, de momento no las env\u00edo por el Zigbee, a continuaci\u00f3n el sketch (que seguramente mejoraremos):<\/div>\n<div class=\"mceTemp mceIEcenter\" style=\"text-align: left;\">\u00a0<\/div>\n<pre class=\"mceTemp mceIEcenter\" style=\"text-align: left;\">\/\/**********************************************************************************\n\/\/PDU gestionable por carlos Rodr\u00edguez\n\/\/http:\/\/www.zigbe.net\n\/\/El Sketch mide voltaje y corriente y calcula los valores de consumo de potencia\n\/\/Basado en los algoritmos del la app note de Atmel AVR465 con inspiraci\u00f3n en el c\u00f3digo de openenergymonitor\n\/\/**********************************************************************************\n\n\/\/********************Variables de configuraci\u00f3n********************\nint NumeroDeMuestras = 3000;\n\n\/\/Pines de entrada de voltaje y corriente\nint PinV = 1;\n\nint PinI1 = 2;\nint PinI2 = 3;\nint PinI3 = 4;\nint PinI4 = 5;\nint PinI;\n\n\/\/********************Coeficientes de calibraci\u00f3n********************\ndouble CalV = 1.62;\n\ndouble CalI1 = 0.043;\ndouble CalI2 = 0.043;\ndouble CalI3 = 0.043;\ndouble CalI4 = 0.043;\ndouble CalI;\n\ndouble CalFase1 = 0.7;\ndouble CalFase2 = 0.7;\ndouble CalFase3 = 0.7;\ndouble CalFase4 = 0.7;\ndouble CalFase;\n\n\/\/********************Variables para las muestras********************\nint UlMuestraV;\nint UlMuestraI;\nint MuestraV;\nint MuestraI;\nint MuestraI0;\nint MuestraI1;\nint MuestraI2;\nint MuestraI3;\n\n\/\/********************Variables filtradas********************\ndouble UlFiltradoV;\ndouble UlFiltradoI;\ndouble FiltradoV;\ndouble FiltradoI;\ndouble filterTemp;\n\n\/\/********************Almacena el voltahe instantaneo con la fase calibrada********************\ndouble calibratedV;\n\n\/\/********************Variables de c\u00e1lculo de potencia********************\ndouble sqI,sqV,instP,sumI,sumV,sumP;\n\n\/\/********************Variables de salida********************\ndouble PotenciaReal1, PotenciaAparente1, FactorPotencia1, Vrms1, Irms1;\ndouble PotenciaReal2, PotenciaAparente2, FactorPotencia2, Vrms2, Irms2;\ndouble PotenciaReal3, PotenciaAparente3, FactorPotencia3, Vrms3, Irms3;\ndouble PotenciaReal4, PotenciaAparente4, FactorPotencia4, Vrms4, Irms4;\ndouble PotenciaReal, PotenciaAparente, FactorPotencia, Vrms, Irms;\n\n\/\/********************Variables de medida de la energ\u00eda********************\n\u00a0\u00a0\u00a0 \/\/Calculation of kwh\n\u00a0\u00a0\u00a0 \/\/time taken since last measurment timems = tmillis - ltmillis;\n\u00a0\u00a0\u00a0 unsigned long ltmillis, tmillis, timems;\n\u00a0\u00a0\u00a0 \/\/time when arduino is switched on... is it 0?\n\u00a0\u00a0\u00a0 unsigned long startmillis;\n\u00a0\u00a0\u00a0 \/\/kwhTotal is cumulative kwh today, the other 3 are historCalIX over the last 3 days for comparison.\n\u00a0\u00a0\u00a0 double kwhTotal =0.0;\n\n\/\/********************Variables de medida de la frecuencia********************\n\/\/Tiempo en microsegundos desde el \u00faltimo paso del voltaje por cero\nunsigned long vLastZeroMsec;\nunsigned long vPeriod;\n\/\/Suma de vPeriod para obtener el promedio\nunsigned long vPeriodSum;\n\/\/N\u00famero de periodos\nunsigned long vPeriodCount;\n\/\/Frequencia\nfloat freq;\n\/\/Se utiliza para filtrar lecturas err\u00f3neas de vPeriod\n\/\/50Hz -&gt; 20000, 60 Hz -&gt; 16666\nunsigned long expPeriod = 20000;\nunsigned long filterWidth = 2000;\n\nvoid setup()\n{\nSerial.begin(115200);\n\/\/*******************Setup de la medida de energ\u00eda*******************\ntmillis = millis();\nstartmillis=tmillis;\n\npinMode (13, OUTPUT);\n\/\/Para aproximar el primer valor\n\/\/CalcularEnergia();\n}\n\nvoid loop()\n{\n\/\/Primer puerto\ndigitalWrite(13,1); \/\/Enciende el led de la placa\nPinI=PinI1; \/\/asigna el pin anal\u00f3gico de I del puerto1\nCalI=CalI1; \/\/asigna los valores de calibraci\u00f3n del puerto1\nCalFase=CalFase1; \/\/Asigna los valores de calibraci\u00f3n de fase del puerto1\n\/\/CalcularEnergia(); \/\/Calcula la energ\u00eda\nCalcularEnergia(); \/\/Calcula la energ\u00eda\nCalculoRMSPot(); \/\/Calculos de potencia\nVrms1=Vrms; \/\/Asigna resultados a variables\nIrms1=Irms;\nPotenciaReal1=PotenciaReal;\nPotenciaAparente1=PotenciaAparente;\nFactorPotencia1=FactorPotencia;\nCalculoFrecuencia(); \/\/Calcula la frecuencia\nResetearAcumuladores(); \/\/resetea los acumuladores\n\n\/\/Segundo puerto\ndigitalWrite(13,0); \/\/Documentado en el puerto1\nPinI=PinI2;\nCalI=CalI2;\nCalFase=CalFase2;\nCalcularEnergia();\nCalculoRMSPot();\nVrms2=Vrms;\nIrms2=Irms;\nPotenciaReal2=PotenciaReal;\nPotenciaAparente2=PotenciaAparente;\nFactorPotencia2=FactorPotencia;\nCalculoFrecuencia();\nResetearAcumuladores();\n\n\/\/tercer puerto\ndigitalWrite(13,1); \/\/Documentado en el puerto1\nPinI=PinI3;\nCalI=CalI3;\nCalFase=CalFase3;\nCalcularEnergia();\nCalculoRMSPot();\nVrms3=Vrms;\nIrms3=Irms;\nPotenciaReal3=PotenciaReal;\nPotenciaAparente3=PotenciaAparente;\nFactorPotencia3=FactorPotencia;\nCalculoFrecuencia();\nResetearAcumuladores();\n\n\/\/Cuarto puerto\ndigitalWrite(13,0); \/\/Documentado en el puerto1\nPinI=PinI4;\nCalI=CalI4;\nCalFase=CalFase1;\nCalcularEnergia();\nCalculoRMSPot();\nVrms4=Vrms;\nIrms4=Irms;\nPotenciaReal4=PotenciaReal;\nPotenciaAparente4=PotenciaAparente;\nFactorPotencia4=FactorPotencia;\nCalculoFrecuencia();\nResetearAcumuladores();\n\n\/\/--ENERGY MEASURMENT CALCULATION----------------\u00a0\u00a0\u00a0\u00a0\n\/\/Calculate amount of time since last PotenciaReal measurment.\nltmillis = tmillis;\ntmillis = millis();\ntimems = tmillis - ltmillis;\n\n\/\/Calculate number of kwh consumed.\n\/\/ REVISAR____&gt;\/\/kwhTotal = kwhTotal + ((PotenciaReal\/1000.0) * 1.0\/3600.0 * (timems\/1000.0));\n\/\/Reset accumulators\n\n\/\/Muestra la salida por el puerto serie\nSerial.print (\"Puerto 1 -&gt; \");\nSerial.print(PotenciaReal1);\nSerial.print(\" W \/ \");\nSerial.print(PotenciaAparente1);\nSerial.print(\" VA \/ \");\nSerial.print(FactorPotencia1);\nSerial.print(\" Factor P \/ \");\nSerial.print(Vrms1);\nSerial.print(\" V rms \/ \");\nSerial.print(Irms1);\nSerial.print(\" A rms \/ \");\nSerial.print(kwhTotal);\nSerial.print(\" KWh \/ \");\nSerial.print(freq);\nSerial.println(\" Hz\");\nSerial.print (\"Puerto 2 -&gt; \");\nSerial.print(PotenciaReal2);\nSerial.print(\" W \/ \");\nSerial.print(PotenciaAparente2);\nSerial.print(\" VA \/ \");\nSerial.print(FactorPotencia2);\nSerial.print(\" Factor P \/ \");\nSerial.print(Vrms2);\nSerial.print(\" V rms \/ \");\nSerial.print(Irms2);\nSerial.print(\" A rms \/ \");\nSerial.print(kwhTotal);\nSerial.print(\" KWh \/ \");\nSerial.print(freq);\nSerial.println(\" Hz\");\nSerial.print (\"Puerto 3 -&gt; \");\nSerial.print(PotenciaReal3);\nSerial.print(\" W \/ \");\nSerial.print(PotenciaAparente3);\nSerial.print(\" VA \/ \");\nSerial.print(FactorPotencia3);\nSerial.print(\" Factor P \/ \");\nSerial.print(Vrms3);\nSerial.print(\" V rms \/ \");\nSerial.print(Irms3);\nSerial.print(\" A rms \/ \");\nSerial.print(kwhTotal);\nSerial.print(\" KWh \/ \");\nSerial.print(freq);\nSerial.println(\" Hz\");\nSerial.print (\"Puerto 4 -&gt; \");\nSerial.print(PotenciaReal4);\nSerial.print(\" W \/ \");\nSerial.print(PotenciaAparente4);\nSerial.print(\" VA \/ \");\nSerial.print(FactorPotencia4);\nSerial.print(\" Factor P \/ \");\nSerial.print(Vrms4);\nSerial.print(\" V rms \/ \");\nSerial.print(Irms4);\nSerial.print(\" A rms \/ \");\nSerial.print(kwhTotal);\nSerial.print(\" KWh \/ \");\nSerial.print(freq);\nSerial.println(\" Hz\");\nSerial.println(\"************************************************************************\");\n\n}\nvoid CalcularEnergia()\n{\n\u00a0 UlMuestraV=607;\n\u00a0 UlMuestraI=607;\n\u00a0 MuestraV=607;\n\u00a0 MuestraI=607;\n\u00a0 UlFiltradoV=2.5;\n\u00a0 UlFiltradoI=2.5;\n\u00a0 FiltradoV=2.5;\n\u00a0 FiltradoI=2.5;\n\nfor (int n=0; n&lt;NumeroDeMuestras; n++)\n{\n\u00a0\u00a0 \/\/Variables utilizadas para eliminar el ofset de tensi\u00f3n\n\/\/\u00a0 MuestraI0=MuestraI1;\n\/\/\u00a0 MuestraI1=MuestraI2;\n\/\/\u00a0 MuestraI2=UlMuestraI;\n\u00a0\u00a0 UlMuestraV=MuestraV;\n\u00a0\u00a0 UlMuestraI=MuestraI;\n\n\u00a0\u00a0 \/\/Lee las muestras de corriente y voltaje\n\u00a0\u00a0 MuestraV = analogRead(PinV);\n\u00a0\u00a0 MuestraI = analogRead(PinI);\n\nif (MuestraI &lt;=610 and MuestraI &gt;=604)\n{MuestraI=607;\n}\n\/\/Serial.println (MuestraI);\n\/\/\u00a0 MuestraI3= (MuestraI0+MuestraI1+MuestraI2+UlMuestraI+MuestraI)\/5;\n\u00a0\/\/Serial.print (MuestraI);\n\u00a0\/\/Serial.print (\";\");\n\u00a0\/\/Serial.println (MuestraI3);\n\/\/\u00a0\u00a0 MuestraI=MuestraI3;\n\u00a0\u00a0 \/\/Variables utilizadas para eliminar el ofset de tensi\u00f3n\n\u00a0\u00a0 UlFiltradoV = FiltradoV;\n\u00a0\u00a0 UlFiltradoI = FiltradoI;\n\n\u00a0\u00a0 \/\/Filtro digital de paso alto para eliminar el Ofset de 2,5V en las entradas\n\u00a0\u00a0 FiltradoV = 0.996*(UlFiltradoV+MuestraV-UlMuestraV);\n\u00a0\u00a0 FiltradoI = 0.996*(UlFiltradoI+MuestraI-UlMuestraI);\n\n\u00a0\u00a0 \/\/Calibraci\u00f3n de fase (para compensar el retraso en el conversor AD)\n\u00a0\u00a0 calibratedV = UlFiltradoV + CalFase * (FiltradoV - UlFiltradoV);\n\n\u00a0\u00a0 \/\/Calculo del voltaje RMS\n\u00a0\u00a0 sqV= calibratedV * calibratedV;\u00a0\u00a0 \/\/Eleva al cuadrado\n\u00a0\u00a0 sumV += sqV; \/\/A\u00f1ade al acumulador\n\n\u00a0\u00a0 \/\/Calculo de la corriente RMS\n\u00a0\u00a0 sqI = FiltradoI * FiltradoI; \/\/Eleva al cuadrado\n\u00a0\/\/Serial.println (sqI);\n\u00a0\u00a0 sumI += sqI; \/\/A\u00f1ade al acumulador\n\n\u00a0\u00a0 \/\/C\u00e1lculo de la potencia instantanea\n\u00a0\u00a0 instP = calibratedV * FiltradoI; \/\/Multiplica tensi\u00f3n por corriente\n\u00a0\u00a0 sumP +=instP;\u00a0 \/\/A\u00f1ade al acumulador\n\n\u00a0\u00a0 \/\/*******************MEDICI\u00d3N DE FRECUENCIA**************************\n\u00a0\u00a0 if (n==0) vLastZeroMsec = micros();\n\n\u00a0\u00a0 if (UlFiltradoV &lt; 0 &amp;&amp; FiltradoV &gt;= 0 &amp;&amp; n&gt;1)\u00a0\u00a0\u00a0 \/\/Chequea el paso por cero\n\u00a0\u00a0 {\n\u00a0\u00a0\u00a0\u00a0 vPeriod = micros() - vLastZeroMsec; \/\/Periodo de la forma de onda del voltaje\n\u00a0\u00a0\u00a0\u00a0 if (vPeriod &gt; (expPeriod-filterWidth) &amp;&amp; vPeriod&lt;(expPeriod+filterWidth)) \/\/Filtra las medidas de periodo err\u00f3neas\n\u00a0\u00a0\u00a0\u00a0 {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 vPeriodSum += vPeriod;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 vPeriodCount++;\n\u00a0\u00a0\u00a0\u00a0 }\n\u00a0\u00a0\u00a0\u00a0 vLastZeroMsec = micros();\n\u00a0\u00a0 }\n\u00a0\u00a0 \/\/********************************************************************\n}\n}\nvoid ResetearAcumuladores()\n{\nsumV = 0;\nsumI = 0;\nsumP = 0;\n}\n\nvoid CalculoRMSPot()\n{\nVrms = CalV*sqrt(sumV \/ NumeroDeMuestras); \/\/C\u00e1lculo de la raiz cuadrada del promedio del voltaje elevado al cuadrado (RMS) \/ Aplica los coeficientes de calibraci\u00f3n\nVrms= double(int(Vrms*10))\/10; \/\/Reduce a uno el n\u00famero de decimales\nIrms = CalI*sqrt(sumI \/ NumeroDeMuestras); \/\/C\u00e1lculo de la raiz cuadrada del promedio de la corriente elevada al cuadrado (RMS) \/ Aplica los coeficientes de calibraci\u00f3n\nIrms= double(int(Irms*20))\/20; \/\/Dos decimales, pero la segunda cifra solo puede ser 0 \u00f3 5\n\/\/calcula los valores de potencia\nPotenciaReal = CalV*CalI*sumP \/ NumeroDeMuestras;\nPotenciaReal = double(int(PotenciaReal*10))\/10; \/\/Reduce el n\u00famero de decimales a uno\nPotenciaAparente = double(int((Vrms * Irms -4)*10))\/10;\/\/El cuatro es una calibraci\u00f3n para compensar el algoritmo de reducci\u00f3n de ruido\nif (PotenciaAparente&lt;PotenciaReal)\n{PotenciaAparente=PotenciaReal;} \/\/En alguna ocasi\u00f3n \"rara\" Ha dado alg\u00fan valor inferior que da factor de potencia negativo\nif (PotenciaReal&lt;4) \/\/ No se detecta una potencia menor de 4W, para evitar los errores que quedan del filtro pasa bajos\n{PotenciaReal=0;}\nif (PotenciaAparente&lt;4)\/\/ No se detecta una potenciao menor de 4VA, para evitar los errores que quedan del filtro pasa bajos\n{PotenciaAparente=0;}\nFactorPotencia = PotenciaReal \/ PotenciaAparente;\n}\nvoid CalculoFrecuencia()\n{\n\/\/******************C\u00e1culos de frecuencia*****************\nfreq = (1000000.0 * vPeriodCount) \/ vPeriodSum; \/\/divido por 1000 crc\nfreq= double(int(freq*20))\/20; \/\/El segundo decimal es cero o 5\n\nvPeriodSum=0;\nvPeriodCount=0;\n}<\/pre>\n<div class=\"mceTemp mceIEcenter\" style=\"text-align: left;\">\u00a0<\/div>\n<div class=\"mceTemp mceIEcenter\" style=\"text-align: left;\">\u00a0<\/div>\n<div class=\"mceTemp mceIEcenter\" style=\"text-align: left;\">\u00a0<\/div>\n","protected":false},"excerpt":{"rendered":"<p>En el cap\u00edtulo anterior&#8230;&#8230; Si recordais hab\u00edamos obtenido un medidor que comprarado con uno comercial nos daba valores bastante parecidos (del orden de un 1%), pero que ten\u00eda un problema en\u00a0el valor devuelto sin carga\u00a0provocado por el ruido el\u00e9ctrico del&hellip; <br \/><a class=\"read-more-button\" href=\"https:\/\/blog.whatsbee.net\/?p=595\">Leer m\u00e1s<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_bbp_topic_count":0,"_bbp_reply_count":0,"_bbp_total_topic_count":0,"_bbp_total_reply_count":0,"_bbp_voice_count":0,"_bbp_anonymous_reply_count":0,"_bbp_topic_count_hidden":0,"_bbp_reply_count_hidden":0,"_bbp_forum_subforum_count":0},"categories":[16,17,2,9,10],"tags":[28,56,76,102,109,110,111,173,175,197],"_links":{"self":[{"href":"https:\/\/blog.whatsbee.net\/index.php?rest_route=\/wp\/v2\/posts\/595"}],"collection":[{"href":"https:\/\/blog.whatsbee.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.whatsbee.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.whatsbee.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.whatsbee.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=595"}],"version-history":[{"count":0,"href":"https:\/\/blog.whatsbee.net\/index.php?rest_route=\/wp\/v2\/posts\/595\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.whatsbee.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=595"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.whatsbee.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=595"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.whatsbee.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=595"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}