TODOPIC

FORO TÉCNICO => Foro Técnico => Mensaje iniciado por: Holgorio en 23 de Enero de 2019, 13:56:28

Título: Calcular RMS por software
Publicado por: Holgorio en 23 de Enero de 2019, 13:56:28
Hola, en el pasado una vez intente calcular el RMS de una señal por software en un arduino (creo que el arduino murio  :D), pero no fui capaz. Ahora con los simuladores he intentado hacerlo con un IC que te calcula el RMS pero ademas de que no me gusta por que creo que es mucho mas caro así, ademas de que por lo que he ido aprendiendo en estos días, ni siquiera los multimetros usan un IC si no que lo hacen por software, ademas que tengo la espina clavada de que no me saliera, y bueno aunque no puedo hacerlo de manera real, he pensado que si puedo poner las cuentas para calcularlo en base a un hipotetico ADC con su driver de entrada.

he buscado por internet y he visto algunos circuitos como este:

  - Tienes que ingresar para ver archivos adjuntos -  

Esto lo que hace es rectificarlo y el RMS de la onda resultante es el doble que el RMS de la principal, pero me parece una manera un poco rara de hacerlo ¿no? no le veo ninguna ventaja.

luego he visto este estilo:

  - Tienes que ingresar para ver archivos adjuntos -  

Lo que hace es dividirlo a la mitad y elevarlo a la mitad de 3.3 que es lo que suelen tener los micros, esto seria un buen driver para enchufarlo al adc? del micro?

si suponemos que la señal sea de 50Hz, supongo que habría que tomar las muestras, restarles 1.65V, sumarlas, dividirlas entre el numero de muestras y hacerles la raiz cuadrada.

Pero... según me explico el compañero eduardo ademas de otros compañeros y lo que he visto, es que la señal suele tener armonicos y he visto por internet que tambien tienes que tener en cuenta el factor de cresta.

Eduardo dijo que habia que poner un filtro paso de baja para quitar los armonicos, pero...¿cuantas muestras debería tomar? ¿que orden de filtro? y si quisiera por ejemplo X factor de cresta, como se haria? el integrado ad8436 dice que calcula hasta un factor de cresta de 10, no se si lo comprendo muy bien.

¿estos calculos podrían hacerse con un STM32 por ejemplo? como el de la discovery F4 o se necesita algo mas potente o con mas memoria para tomar muchas muestras?

un saludo y muchas gracias
Título: Re:Calcular RMS por software
Publicado por: Holgorio en 24 de Enero de 2019, 10:52:55
A ver si lo que he aprendido ha servido de algo, he ideado un hipotetico circuito para enchufarlo a un uC de 3.3Voltios, a ver si alguien me puede decir si mis conclusiones y calculos son correctos:

  - Tienes que ingresar para ver archivos adjuntos -  

He supuesto medir una señal de 50 hz como la de la red, pero claro con una amplitud mucho menor. he colocado un AO para hacer una impedancia de entrada grande, despues he colocado un divisor resistivo de r4 y r5 a la alimentación del uc para bajar la tension a la mitad y subirla por encima de 0 y solo lea valores positivos. ahora viene lo chungo:

Como la tensión de la red, tiene armónicos y picos (por lo que he aprendido en otros post) he colocado un condenador de 15n que junto con R4 forma un filtro paso de baja de algo mas de 1K Hz de corte esto hace que se pueda medir hasta la décima armonica (no se si es mucho o poco), por que seria 50*10=500 y *2 para asegurarse. Los diodos cumplen una doble función, proteger al adc de valores que salgan de su rango y limitar el factor de cresta de los picos.

El factor de cresta es el Vp/VRMS si supongo que el valor RMS es de 1V y que puede tener picos de 3 voltios, tenemos que este sistema podría medir factores de cresta de 3.3 y perturbaciones hasta la decima armónica ¿No?

Por la parte del micro, sería:

No me acuerdo quien me lo dijo creo que fue Eduardo pero no lo encuentro, que lo mejor era colocar un filtro de bajo orden y muestrear en la frecuencia de corte, por lo tanto se muestrea a una muestra por mSeg.

Esto hace que en 1 segundo tengamos 1000 muestras, y cada segundo haríamos el valor cuadrático medio. ¿Serian suficientes estas muestras y tiempo de muestreo?

Si el Adc del uC es de 12bits serán 2 registros de 1 byte cada uno 2 byte por medida que por 1000 son 2000 bytes~2Kbytes ocuparía en memoria el buffer, los micros de ahora normalitos suelen tener 512k o 1024k bytes de flash, no creo que sea un problema la memoria, ¿como de rapido suele ser el ADC de un micro normalito? ¿1 vez cada milisegundo es mucho para un micro normal?

¿estaria bien esto para un circuito real? tanto el software como el hardware? necesitaria mas muestras, menos, mas velocidad?

un saludo

estos calculos y suposiciones son correctos
Título: Re:Calcular RMS por software
Publicado por: Picuino en 24 de Enero de 2019, 15:23:44
Los cálculos en tiempo real los puedes hacer con enteros, que es más rápido.

Solo tienes que calcular el cuadrado del valor y sumar el resultado en un acumulador. Calcula unos 500 ciclos en ensamblador.

Tambien te recomiendo que calcules el valor medio en tiempo real.

Al final tienes que hacer algunos cálculos en coma flotante para ajustar el resultado.

Debes tomar al menos el doble de muestras que la máxima frecuencia que pretendas medir. Esto te deja una frecuencia de corte de unos 5kHz para un micro normalito de 8bits.

Con los dspic que tienen instrucciones específicas de multiplicación y suma, puedes llegar a frecuencias 100 veces mayores.

Si quieres rms de frecuencias mayores, tendrás que ir a un circuito especializado.

Ten en cuenta que una frecuencia de corte de 5khz en realidad solo llega a medir 10 armónicos de una señal cuadrada de 500Hz.
Título: Re:Calcular RMS por software
Publicado por: Picuino en 24 de Enero de 2019, 15:32:31
Un micro normalito toma 20000 muestras/segundo.
Un dspic puede llegar a un millón de muestras por segundo.

No hace falta buffer si calculas en tiempo real.
Título: Re:Calcular RMS por software
Publicado por: Holgorio en 25 de Enero de 2019, 03:47:50
Hola picuino, gracias por responder

Citar
Si quieres rms de frecuencias mayores, tendrás que ir a un circuito especializado.

Si tengo claro que mientras mas subas mas dificil va a ser, pero como lo que quiero es aprender el proceso, por eso me he centrado en una frecuencia y tipo de señal, y que hay mas común que la red de casa. Así que quiero idear algo que me permita medir la red de casa, bueno despues de ponerle un transformador y bajarlo a 1V rms por ejemplo (o lo que sea)

Entonces voy a tener una señal senoidal, con armonicos (ni idea de que nivel) y entre 40 y 50 Hz ¿no?

Citar
Debes tomar al menos el doble de muestras que la máxima frecuencia que pretendas medir. Esto te deja una frecuencia de corte de unos 5kHz para un micro normalito de 8bits.

Aquí me he perdido, ¿por que 5KHz?

Citar
Un micro normalito toma 20000 muestras/segundo.
Un dspic puede llegar a un millón de muestras por segundo.
Por lo que comentas y sabiendo que sera una señal de 50Hz, o entre unos 40 y 60, no creo que necesite un dspic, aparte de que no los he usado nunca  :D, suelo usar los stm32 de las discovery, creo que era un m4 a 48Mhz.

Citar
Los cálculos en tiempo real los puedes hacer con enteros, que es más rápido.

Solo tienes que calcular el cuadrado del valor y sumar el resultado en un acumulador. Calcula unos 500 ciclos en ensamblador.

También te recomiendo que calcules el valor medio en tiempo real.

Aquí también me he perdido un poco, como se haría en tiempo real. Por ejemplo, el valor medio seria Vmed=sum(valores)/Numero de muestras. Si tienes el Vmed acumulado, y coges un nuevo dato, ¿como lo añades a ese número?

PD: hay alguna forma de poner formulas matematicas en el foro?




Título: Re:Calcular RMS por software
Publicado por: Picuino en 25 de Enero de 2019, 04:41:03
5khz es la velocidad máxima a la que un micro normalito puede hacer los cálculos.


Los STM también tienen instrucciones para acelerar los cálculos. Algunos son más rapidos que los dspic.

Para poner fórmulas yo suelo escribir texto. Fácil y portable, aunque quede feo.
Título: Re:Calcular RMS por software
Publicado por: Picuino en 25 de Enero de 2019, 04:50:42
Fórmulas.

Mete en un bucle estas formulas y que se ejecuten cada cierto intervalo fijo de tiempo:
RMS = RMS + ADC * ADC
Media = Media + ADC
muestras = muestras + 1

Al final haces los cálculos:
Media = Media / muestras
RMS= sqrt(RMS/muestras - media*media)
Título: Re:Calcular RMS por software
Publicado por: Picuino en 25 de Enero de 2019, 04:59:53
Esto elimina ka componente de continua y calcula solo la RMS de la alterna.
Título: Re:Calcular RMS por software
Publicado por: KILLERJC en 25 de Enero de 2019, 06:56:48
Fórmulas.

Mete en un bucle estas formulas y que se ejecuten cada cierto intervalo fijo de tiempo:
RMS = RMS + ADC * ADC
Media = Media + ADC
muestras = muestras + 1

Al final haces los cálculos:
Media = Media / muestras
RMS= sqrt(RMS/muestras - media*media)

Con eso no haces que muestras sea un numero muy grande al final (o un overflow), dejando la media y por ende el RMS casi nulo? o falta la instruccion de ponerle un limite a muestras ?
Título: Re:Calcular RMS por software
Publicado por: Picuino en 25 de Enero de 2019, 15:08:52
Depende de las variables que utilices.
Precisamente muestras es la variable que menos overflow tiene. Puedes utilizar un entero de 16 bits para contar hasta 65000 muestras (unos 6 segundos a máxima velocidad en un micro de 8 bits)

La que más overflow puede tener es la variable RMS.
Utilizando enteros de 32 bits, se valor puede tener overflow cada 700 muestras si se apuran los rangos del ADC. Pero como el overflow se produce en una suma, al menos con ensamblador es muy sencillo y rápido ampliar el rango de la suma a más bits.

Un buen truco consiste en tomar un número de muestras que sea potencia de 2, por ejemplo 1024, de manera que la división final sea muy sencilla. Se realiza simplemente con un desplazamiento de bits.

Un saludo.
Título: Re:Calcular RMS por software
Publicado por: Picuino en 25 de Enero de 2019, 15:11:24
Killer:

Con la instrucción
muestras = muestras + 1

me refiero a la instrucción c:
muestras++;

Creo que lo has interpretedo como una sucesión tipo Fibonacci.
Título: Re:Calcular RMS por software
Publicado por: Picuino en 25 de Enero de 2019, 15:14:30
Holgorio, es MUY recomendable que simules todo con una hoja de cálculo (https://es.libreoffice.org) para ver qué valores se obtienen antes de programar el micro.

Un saludo.
Título: Re:Calcular RMS por software
Publicado por: KILLERJC en 25 de Enero de 2019, 22:25:56
Killer:

Con la instrucción
muestras = muestras + 1

me refiero a la instrucción c:
muestras++;

Creo que lo has interpretedo como una sucesión tipo Fibonacci.

No Picuino... Pero supongamos que esa funcion entra 65000 veces.... entonces muestras va tener el valor 65000 + valor de inicio.
Se entiende el punto que quiero llegar ?... Es decir si continuamos ejecutando ese pseudocodigo una y otra ves llegamos a un numero de muestras muy grandes y que la unica forma que vuelva a un numero pequeño es por un overflow.

A eso me referia  :mrgreen:, sea el tamaño que sea la variable, algun dia se va a producir el overflow con ese pseudocodigo.
Título: Re:Calcular RMS por software
Publicado por: Picuino en 26 de Enero de 2019, 05:45:56
Ok. Toda la razón.
A veces simplifico demasiado.

Antes del cálculo hay que resetear y poner todas las variables a cero.

Estoy suponiendo que se hace un cálculo de RMS por segundo y a partir de ahí se vuelve a comenzar.

Si quieres hacer un cálculo contínuo, no por lotes, entonces necesitas un buffer circular o una media móvil de cálculos RMS más rapidos.

Otra cosa que acabo de ver, es conveniente que el periodo de cálculo sea múltiplo del periodo de red.

Saludos.
Título: Re:Calcular RMS por software
Publicado por: Holgorio en 26 de Enero de 2019, 07:19:20
Precisamente me gustaria simularlo, no tengo la intención de momento de llevarlo a la realidad solo de aprender como hacerlo. Pero no se como simularlo,

¿como podría tener los datos de un adc virtual?

¿Por otra parte, el circuito y las conclusiones que puse al principio son correctas? ¿Ese seria el hardware necesario?
Título: Re:Calcular RMS por software
Publicado por: Eduardo2 en 26 de Enero de 2019, 08:52:54
....
Otra cosa que acabo de ver, es conveniente que el periodo de cálculo sea múltiplo del periodo de red.

Mas que conveniente, es indispensable.

Calculando el promedio con una ventana múltiplo del intervalo el resultado es exacto.  Cuando no lo sea, habrá una oscilación en el resultado dependiente de la fase donde comenzaron las lecturas, mas baja cuanto mayor sea el tiempo de lecturas.

Si se lo piensa solo para 50Hz, cualquier ventana de 20ms,40ms,60ms etc  será exacta.  Pero si se se lo piensa para 50/60Hz habrá que usar de 300ms,600ms..etc.
Y si se piensa por ejemplo en la salida de un grupo electrógeno, cuya frecuencia es solo cercana 50Hz exacta y encima variable segun la carga. Y mas cuanto mas viejo es el grupo --> Hay que usar un promedio ponderado (lo que hace un filtro).  La contra respecto a la suma simple es que debe usarse punto flotante o tunear las operaciones para minimizar el error en punto fijo.
Título: Re:Calcular RMS por software
Publicado por: Robert76 en 26 de Enero de 2019, 09:34:38
Viendo el cálculo que proporciona Picuino, en cuánto a la variable RMS, si el ADC captura a 8 bits, pues NO se podrá tomar más de una muestra, ya que usando variables a 16 bits, tiende a  desbordarse con una 2da. muestra, al sumar RMS a todo lo anterior.

Me refiero a ésta parte "RMS = RMS + ADC * ADC"

Título: Re:Calcular RMS por software
Publicado por: Picuino en 26 de Enero de 2019, 10:04:57
Se puede hacer también una media móvil rápida con números enteros. Pero el error será de 1% para un periodo de respuesta de 2 segundos, es poca precisión para tanto tiempo.

La solución de compromiso, un poco más compleja, sería tomar unas 128 muestras por ciclo (cada 20ms) y calcular el valor RMS de ese ciclo. Se puede hacer con la variable Muestras de un byte y la variable RMS como entero largo de 32 bits. No habrá desbordamiento ni siquiera con un ADC de 12 bits. La multiplicación se puede hacer en ensamblador para optimizar, ya que los dos valores a multiplicar son de 12 bits y el resultado de la multiplicación es de 24 bits. En caso de hacer la multiplicación en c sin optimizar se pueden utilizar enteros largos de 32bits.

A continuación haría una media móvil de los valores RMS por ciclo calculados anteriormente. El error será pequeño y la respuesta rápida.

Habría que hacer algo semejante con el valor de DC, para restarlo del resultado.

Un saludo.
Título: Re:Calcular RMS por software
Publicado por: Picuino en 26 de Enero de 2019, 10:08:18
Pero lo anterior es demasiado complejo para lo que quiere Holgorio. Lo mejor es seguir el algoritmo que comenté al principio.