¿Alguien tiene un código C (para el microcontrolador 8051 incorporado) para calcular el valor RMS de la onda sinusoidal leída por un ADC de 8 bits?

// RMS.c

#define NUM_ITERATIONS x // Debe reemplazar ‘x’ con un valor apropiado para su sistema

char externo sin firmar ReadADC (nulo); // Reemplace ReadADC () con su función de lectura ADC
extern void SystemSetup (vacío);

vacío
main (int argc, char * argv [])
{
unsigned char CurrentADCReading;
unsigned char MaxVal = 0, MinVal = 0xFF;
flotador PeakToPeak;
flotador RMS;

Configuración del sistema(); // Configura tu sistema, incluida la inicialización del ADC.

mientras que (1)
{
CurrentADCReading = ReadADC (); // Reemplace ReadADC () con su función de lectura ADC

if (CurrentADCReading> MaxVal)
{
MaxVal = CurrentADCReading;
}
más si (CurrentADCReading <MinVal)
{
MinVal = CurrentADCReading;
}

recuento ++;
if (cuenta> = NUM_ITERATIONS)
{
descanso;
}
}

PeakToPeak = (flotante) (MaxVal – MinVal);
RMS = PeakToPeak * 0.707;
}

Realmente no he probado este código en nada (ni siquiera he intentado compilarlo), considérelo como una guía más que un código que puede copiar y pegar en su código y tener el trabajo tal como está. El punto importante aquí es que lo que está tratando de hacer es muy simple. Este código toma una cierta cantidad de lecturas de ADC (definidas por NUM_ITERATIONS) y captura los valores máximo y mínimo, que si se lee una onda sinusoidal y ha muestreado suficientes puntos, y con frecuencia suficiente (dependiendo de la frecuencia de onda sinusoidal y su frecuencia de muestreo, solo usted puede determinar esto), entonces los valores máximo y mínimo serán los valores de los “picos” más altos y más bajos de la onda sinusoidal, lo que dará como resultado una medición de amplitud “pico a pico”. El valor RMS puede derivarse de un valor pico a pico simplemente multiplicando el valor pico a pico por 0.707. ¡Ahí tienes!

Feliz codificación !!! 🙂

Fórmula para calcular RMS en dado en su nombre como RootMeasnSquare.

es decir, primero calcular el cuadrado de todas las muestras. Luego calcule su valor medio. Luego calcule la raíz para obtener el valor RMS.

considere que tiene 32 muestras por onda sinusoidal y se almacenan en una matriz con el nombre SAMPLE_DATA;

a continuación se muestra un pseudocódigo para el cálculo de rms.

//////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////

unsigned char SAMPLE_DATA [32];

sin firmar char i;

flotante RMS_VALUE = 0, temp = 0;

para (i = 0; i <32; i ++)

{

temp = temp + (SAMPLE_DATA [i] * SAMPLE_DATA [i]); //cuadrado

}

temp = temp / 32; // media

RMS_VALUE = sqrt (temp); // root

//////////////////////// FIN DEL CÓDIGO //////////////////

Esta es la mejor aproximación para calcular. También puede usar el método en el que la muestra de pico se multiplica por 0.707 pero ese método falla en caso de presencia de armónicos.

Por lo tanto, use siempre este método.

¡¡¡VOTA !!!

Hola. Según yo, se debe implementar un módulo adicional después del ADC para calcular el valor RMS. Debido a que el ADC tiene una memoria muy limitada y los valores de almacenamiento en el ADC no son apreciables. Poner un módulo después del ADC con el que puedes calcularlo.