¿Cómo encontrar correctamente el RMS en el microcontrolador ARM 7 LPC?

Estoy tratando de encontrar el RMS de una onda sinusoidal de entrada usando el microcontrolador ARM 7 LPC 2119. Conozco la teoría detrás de encontrar el RMS de tal forma de onda, pero tengo problemas para implementar esto en el código, especialmente el muestreo en coordenadas medias igualmente espaciadas. También acabo de usar interrupciones de temporizador para encontrar la frecuencia de una onda sinusoidal usando entradas de captura, por lo que conozco las funcionalidades básicas en términos de programación de un microcontrolador ARM 7 LPC 2119.

ingrese la descripción de la imagen aquí

Estoy probando esta funcionalidad utilizando una onda sinusoidal de pico a pico de 3 V con una frecuencia de 50 Hz. He desplazado la forma de onda hacia arriba en 1,5 V para evitar que entren valores negativos en los pines ADC del microcontrolador.

Para muestrear a intervalos igualmente espaciados, estoy usando interrupciones de temporizador, de una manera muy similar a este ejemplo aquí . En lugar de encender un LED, estoy haciendo una conversión ADC.

Antes de usar la siguiente fórmula:

ingrese la descripción de la imagen aquí

Necesito asegurarme de que estoy muestreando en intervalos dados, y para probar esto, configuré mi reloj temporizador para proporcionar un retraso de 20 ms antes de ingresar a la función ADC al hacerlo:

T0CTCR = 0x0; //Set Timer Mode
T0PR = 60000-1; //Increment T0TC at every 60000 clock cycles
//60000 clock cycles @60Mhz = 1 mS

T0MR0 = 21-1;   //Zero Indexed Count-hence subtracting 1
T0MCR = (1<<0) | (1<<1);//Set bit0 & bit1 to Interrupt & Reset TC on MR0  

Una vez hecho esto, habilito mi interrupción del temporizador:

  VICVectAddr0 = (unsigned )timer0ISR; //Pointer Interrupt Function (ISR)
  VICVectCntl0 = (1<<5) | 4; //(bit 5 = 1)->to enable Vectored IRQ slot 
  VICIntEnable = (1<<4); // Enable timer0 interrupt

El código anterior da un retraso de 20 ms. Con una onda sinusoidal a 50 Hz, debería dar el mismo valor en cada lectura, ya que el período de dicha onda sinusoidal también es de 20 ms. Sin embargo, este no es el caso y no puedo ver ningún patrón visible en mis resultados.

La función ADC que estoy usando funciona bien con voltajes de CC y también puedo confirmar que el temporizador está dando un retraso de 20 ms antes de ingresar a la función ADC.

¿Me estoy perdiendo algo obvio aquí o podría haber otras variables que no estoy teniendo en cuenta? Cualquier idea sería apreciada.

Respuestas (1)

El código anterior da un retraso de 20 ms. Con una onda sinusoidal a 50 Hz, debería dar el mismo valor en cada lectura, ya que el período de dicha onda sinusoidal también es de 20 ms. Sin embargo, este no es el caso y no puedo ver ningún patrón visible en mis resultados.

Mmm...

¿Me estoy perdiendo algo obvio aquí o podría haber otras variables que no estoy teniendo en cuenta? Cualquier idea sería apreciada.

Un tiempo entre muestras de 20 ms no es bueno para las mediciones de 50 Hz y sí, debido a que la frecuencia de CA no es constante (y tampoco lo es su reloj), las mediciones realizadas pueden estar desfasadas aparentemente al azar.

Mire esta onda sinusoidal muestreada en casi el mismo período: -

ingrese la descripción de la imagen aquí

Produce alias, es decir, la salida azul debe ser constante, pero las ligeras diferencias en la frecuencia de muestreo y la onda sinusoidal hacen que la forma de onda azul se ondule hacia arriba y hacia abajo en la frecuencia de "diferencia".

Si desea medir correctamente el RMS mediante el muestreo, debe muestrear alrededor de 1 kHz o más, especialmente si está tratando de medir el RMS de una corriente CA (las distorsiones armónicas pueden ser significativas).

Excelente descripción... Sé que debería tomar muestras con una frecuencia mucho mayor, pero pensé que el primer paso era confirmar que podía tomar muestras en un intervalo de tiempo determinado. Entonces, ¿está sugiriendo que simplemente aumente mi frecuencia de muestreo?
¡No sugiriendo sino insistiendo!
¡Así que reduciré el retraso a 1 ms! Además, ¿cuál será el error de mi valor RMS si el retraso del temporizador varía de 0,95 ms a 1,05 ms durante todo el muestreo? ¿Tiene esto un gran efecto en la precisión?
Puede producir errores sorprendentemente pequeños, pero la mejor manera que he encontrado es usar una hoja de cálculo para probar escenarios. También debe probar escenarios en los que hay un número no exacto de muestras por ciclo de 50 Hz; esto puede producir errores que tienden a acumularse pero que, para un cálculo de RMS por ciclo, pueden parecer bastante erróneos.