Autor Tema: Tutorial para calcular valores RMS  (Leído 26926 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Tutorial para calcular valores RMS
« Respuesta #15 en: 21 de Diciembre de 2009, 21:24:05 »
Hola Jorge

Nada de maestro, solo otra persona que gusta de programar mucho  :D

1.- No puedo anexar ambas operaciones en el mismo for. El primer for se encarga de elevar al cuadrado todas las muestras. El segundo for solo se encarga de sumar todas las muestras intermedias. La primera y la última muestras son divididas entre dos a diferencia de las demás. Los for tienen intervalos diferentes.

2.- La división entre 2 se debe a la ecuación de los trapecios múltiples.

Código: [Seleccionar]
Area = (h / 2) (v[0] + 2 ∑ v[i] + x[n])
La sumatoria va de 1 a n-1

donde:

h = (b-a)/n
b = límite superior en eje x
a = límite inferior en eje x
n = número de trapecios (muestras - 1)

Para el caso de mi cálculo...

b = muestras - 1
a = 0
n = muestras - 1
h = 1

Por lo que todo se reduce a solo sumar las muestras intermedias y agregar las primera y última pero divididas en 2.

Ya después de haber resuelto la integral discreta solo se divide entre muestras - 1 de acuerdo a la fórmula RMS.

« Última modificación: 21 de Diciembre de 2009, 21:33:04 por migsantiago »

Desconectado jorgeaf_59

  • PIC10
  • *
  • Mensajes: 26
Re: Tutorial para calcular valores RMS
« Respuesta #16 en: 21 de Diciembre de 2009, 22:11:35 »
Mis errores fueron dos (como mínimo):
1- Pensar que podía corregirte algo en lo que evidentemente invertiste mucho tiempo.
2- Confundí trapecios con paralelogramos.
Gracias por tu paciencia,

Jorge

Desconectado Chenao

  • PIC18
  • ****
  • Mensajes: 414
Re: Tutorial para calcular valores RMS
« Respuesta #17 en: 29 de Diciembre de 2009, 14:40:08 »
Saludos

Santiago no se podria crear una estructura para que el usuario entre la función, de forma más general ya sea un polinomio, una función trigonométrica, irracional exponencial que se yo, seria muy interesante si se pudiera realizar todo este cálculo utilizando la regla del trapecio o otro método para cualquier función.

Se que es antioperativo tener una funcion exponecial pero seria muy vacano realizar este tipo de proyecto saludos. 
Un saludo desde Pereira - Colombia

Desconectado Chenao

  • PIC18
  • ****
  • Mensajes: 414
Re: Tutorial para calcular valores RMS
« Respuesta #18 en: 29 de Diciembre de 2009, 14:45:23 »

Casi se me olvida, hay un libro llamado métodos numéricos de burdel explican todos lo métodos para calcular la áreas bajo la curva de un función definida, ahy podrias encontrar varios conceptos y ayuda teóricas.

Saludos.
Un saludo desde Pereira - Colombia

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Tutorial para calcular valores RMS
« Respuesta #19 en: 29 de Diciembre de 2009, 16:11:21 »
Hola Chenao, mi objetivo no es integrar cualquier función, el objetivo era calcular el valor RMS.

Actualmente ya escribí otras funciones para integrar dos veces la señal de aceleración y funcionan bien con el método del trapecio.

Ya tengo mucha teoría sobre métodos numéricos, pero gracias por el tip.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Tutorial para calcular valores RMS
« Respuesta #20 en: 11 de Enero de 2010, 21:45:47 »
Aquí un uso práctico que le di a la función RMS...

Vúmetro RMS con PIC24



Y el programa que funciona para cualquier PIC...

Código: [Seleccionar]
//Autor: MigSantiago
//Enero 2010

/*
Orden de la barra de 10 leds
1 - a0
2 - a1
3 - b0
4 - b1
5 - b2
6 - b3
7 - a2
8 - a3
9 - b4
10 - a4
*/

#define L10 pin_a0
#define L20 pin_a1
#define L30 pin_b0
#define L40 pin_b1
#define L50 pin_b2
#define L60 pin_b3
#define L70 pin_a2
#define L80 pin_a3
#define L90 pin_b4
#define L100 pin_a4

float ValorRMS(float* var, int16 muestras);

////////////////////////////////////////////////////////////////////////////////
#define MUESTRASRMS 48     //muestras para valor rms
#define TMUESTREO   200    //us
//Rango de comparación
//const float MAX=362.0; //máximo puede ser 512 por raíz de 2 (RMS)
const float MAX=250.0;
float c[10];
////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////
//Función para reordenar los 10 bits de un int10 en la barra de leds por ciento
void ordena_vumetro(float v)
{
int8 i=0;

if(v>=c[i++]) output_high(L10); else output_low(L10);
if(v>=c[i++]) output_high(L20); else output_low(L20);
if(v>=c[i++]) output_high(L30); else output_low(L30);
if(v>=c[i++]) output_high(L40); else output_low(L40);
if(v>=c[i++]) output_high(L50); else output_low(L50);
if(v>=c[i++]) output_high(L60); else output_low(L60);
if(v>=c[i++]) output_high(L70); else output_low(L70);
if(v>=c[i++]) output_high(L80); else output_low(L80);
if(v>=c[i++]) output_high(L90); else output_low(L90);
if(v>=c[i++]) output_high(L100); else output_low(L100);
}
////////////////////////////////////////////////////////////////////////////////

...

void main(void)
{
float binario[MUESTRASRMS];

...

//Calcula los límites de cada led
for(i=3; i<14;++i) //empiezo en 3 para eliminar ruido de fondo
   c[i-3]=(MAX*(float)i)/10;

while(1)
   {
   for(i=0; i<MUESTRASRMS; ++i)
      {
      binario[i]=(float)read_adc()-512.0;
      delay_us(TMUESTREO);
      }
   ordena_vumetro(ValorRMS(binario, MUESTRASRMS));
   }
}

Está hecho con un PIC24FJ64GB002 y un electret amplificado con este circuito (gracias JFMateos  :mrgreen: )...
http://www.todopic.com.ar/foros/index.php?topic=19699.msg240561#msg240561

http://img709.imageshack.us/img709/2004/abcd0002mh.jpg
« Última modificación: 21 de Enero de 2010, 12:11:19 por migsantiago »

Desconectado JCCC

  • PIC10
  • *
  • Mensajes: 10
Re: Tutorial para calcular valores RMS
« Respuesta #21 en: 12 de Enero de 2010, 12:26:12 »
mmmm
En tu código
#define MUESTRASRMS 48     //muestras para valor rms
#define TMUESTREO   200    //us

Numero de muestras 48? Tiempo de muestreo 200 us?
si es así....
la Frecuencia de muestreo es 5 KHz el oído humano percibe de 20 Hz a 20 KHz y los 5 KHz no esta ni cerca de los 40 KHz de frecuencia de muestreo que debería tener, el tiempo que tomas tus muestras es 48*200us = 9600us  cuya frecuencia es 104.1 Hz (frecuencia de toma de datos)
para las frecuencias de 20 Hz el tiempo que deberias tomar muestras es 50000 us

Usualmente en amplificadores se desprecia los 20 Hz por una frecuencia de 100 Hz pero los 5 KHz por 40 KHz de frecuencia de muestro.....
Saludos.......

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Tutorial para calcular valores RMS
« Respuesta #22 en: 12 de Enero de 2010, 14:02:45 »
Es una buena observación JCCC, usando la respuesta de frecuencia del oído humano debería ser una f de muestreo de 40kSps.

Pero dudo seriamente que el electret tenga tal respuesta de frecuencia, yo creo que ha de llegar a 8kHz como máximo.

Se puede modificar el periodo de muestreo a lo que gusten mientras el PIC lo soporte. Este PIC24 en específico tolera hasta 500kSps (2us).

Desconectado JCCC

  • PIC10
  • *
  • Mensajes: 10
Re: Tutorial para calcular valores RMS
« Respuesta #23 en: 12 de Enero de 2010, 14:33:01 »
mmmm......
Disculpa si no observe el circuito, como leí que era un Vúmetro me dedique a observar solo la teoría de este....

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Tutorial para calcular valores RMS
« Respuesta #24 en: 12 de Enero de 2010, 14:42:18 »
No te preocupes, es muy atinado tu comentario, pero se me fue lo de la respuesta de frecuencia por andar preocupándome porque el ADC no me servía.

Gracias.

Desconectado ricardoesime

  • PIC10
  • *
  • Mensajes: 2
Re: Tutorial para calcular valores RMS
« Respuesta #25 en: 06 de Octubre de 2011, 17:27:56 »
Hola buenas tardes migsantiago me ha interesado tu tema y soy nuevos en esto de los pic,
mi pregunta es del codigo que pones para calcular el valor rms de ahi puede salir el codigo para calcular
la pura regla del trapecio.

Agradezco tu atencion y espero me puedas contestar.