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

2

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

Estoyprobandoestafuncionalidadutilizandounaondasinusoidaldepicoapicode3Vconunafrecuenciade50Hz.Hedesplazadolaformadeondahaciaarribaen1,5VparaevitarqueseintroduzcanvaloresnegativosenlospinesADCdelmicrocontrolador.

Paramuestrearaintervalosigualmenteespaciados,estoyusandointerrupcionesdetemporizador.Deunamaneramuysimilaraesteejemplo aquí . En lugar de encender un LED, estoy haciendo una conversión de ADC.

Antes de usar la siguiente fórmula:

Necesito asegurarme de que estoy tomando muestras a intervalos dados, y para probar esto, he configurado el reloj del temporizador para que proporcione 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, estoy habilitando la 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, esto debería dar el mismo valor en cada lectura, ya que el período de dicha onda sinusoidal es también 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á demorando 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 considerando? Cualquier idea sería apreciada.

    
pregunta Rrz0

1 respuesta

4
  

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

Hmm ...

  

Me estoy perdiendo algo obvio aquí o podría haber algún otro   variables que no estoy tomando en cuenta? Cualquier idea seria   apreciado.

Un tiempo entre muestras de 20 ms no es bueno para mediciones de 50 Hz y sí, porque la frecuencia de CA no es constante (y tampoco lo es su reloj) las mediciones realizadas podrían estar derivando en una fase fuera de fase aparentemente al azar.

Observe esta muestra de onda sinusoidal casi en el mismo período: -

Produceunaliasing,esdecir,lasalidaazuldebeserconstante,perolaspequeñasdiferenciasenlafrecuenciademuestreoysinusoidalhacenquelaformadeondaazulseondulehaciaarribayhaciaabajoenlafrecuenciade"diferencia".

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

    
respondido por el Andy aka

Lea otras preguntas en las etiquetas